X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8a088306dd63029e9622419deb1a2207c4ec65ac..033a5ff5c71ee7e787a3bc7e9be55ca0f5d80fa1:/src/html/htmlctrl/webkit/webkit.mm diff --git a/src/html/htmlctrl/webkit/webkit.mm b/src/html/htmlctrl/webkit/webkit.mm old mode 100755 new mode 100644 index 49ebedf1f3..6f6ecbc845 --- a/src/html/htmlctrl/webkit/webkit.mm +++ b/src/html/htmlctrl/webkit/webkit.mm @@ -26,8 +26,8 @@ #ifdef __WXCOCOA__ #include "wx/cocoa/autorelease.h" #else -#include "wx/mac/uma.h" -#include +#include "wx/osx/private.h" + #include #include #include @@ -37,6 +37,8 @@ #define DEBUG_WEBKIT_SIZING 0 +extern WXDLLEXPORT_DATA(const char) wxWebKitCtrlNameStr[] = "webkitctrl"; + // ---------------------------------------------------------------------------- // macros // ---------------------------------------------------------------------------- @@ -44,14 +46,18 @@ IMPLEMENT_DYNAMIC_CLASS(wxWebKitCtrl, wxControl) BEGIN_EVENT_TABLE(wxWebKitCtrl, wxControl) +#if defined(__WXMAC__) && wxOSX_USE_CARBON EVT_SIZE(wxWebKitCtrl::OnSize) +#endif END_EVENT_TABLE() +#if defined(__WXOSX__) && wxOSX_USE_CARBON + // ---------------------------------------------------------------------------- // Carbon Events handlers // ---------------------------------------------------------------------------- -// prototype for function in src/mac/carbon/toplevel.cpp +// prototype for function in src/osx/carbon/nonownedwnd.cpp void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent ); static const EventTypeSpec eventList[] = @@ -219,7 +225,7 @@ static pascal OSStatus wxWebKitCtrlEventHandler( EventHandlerCallRef handler , E ControlRef controlRef ; wxWebKitCtrl* thisWindow = (wxWebKitCtrl*) data ; - wxTopLevelWindowMac* tlw = NULL; + wxNonOwnedWindow* tlw = NULL; if (thisWindow) tlw = thisWindow->MacGetTopLevelWindow(); @@ -281,6 +287,7 @@ static pascal OSStatus wxWebKitCtrlEventHandler( EventHandlerCallRef handler , E DEFINE_ONE_SHOT_HANDLER_GETTER( wxWebKitCtrlEventHandler ) +#endif // ---------------------------------------------------------------------------- // wxWebKit Events @@ -288,27 +295,50 @@ DEFINE_ONE_SHOT_HANDLER_GETTER( wxWebKitCtrlEventHandler ) IMPLEMENT_DYNAMIC_CLASS( wxWebKitStateChangedEvent, wxCommandEvent ) -DEFINE_EVENT_TYPE( wxEVT_WEBKIT_STATE_CHANGED ) +wxDEFINE_EVENT( wxEVT_WEBKIT_STATE_CHANGED, wxWebKitStateChangedEvent ); wxWebKitStateChangedEvent::wxWebKitStateChangedEvent( wxWindow* win ) { SetEventType( wxEVT_WEBKIT_STATE_CHANGED); - SetEventObject( win ); - SetId(win->GetId()); + if ( win ) + { + SetEventObject( win ); + SetId(win->GetId()); + } } IMPLEMENT_DYNAMIC_CLASS( wxWebKitBeforeLoadEvent, wxCommandEvent ) -DEFINE_EVENT_TYPE( wxEVT_WEBKIT_BEFORE_LOAD ) +wxDEFINE_EVENT( wxEVT_WEBKIT_BEFORE_LOAD, wxWebKitBeforeLoadEvent ); wxWebKitBeforeLoadEvent::wxWebKitBeforeLoadEvent( wxWindow* win ) { m_cancelled = false; SetEventType( wxEVT_WEBKIT_BEFORE_LOAD); - SetEventObject( win ); - SetId(win->GetId()); + if ( win ) + { + SetEventObject( win ); + SetId(win->GetId()); + } } + +IMPLEMENT_DYNAMIC_CLASS( wxWebKitNewWindowEvent, wxCommandEvent ) + +wxDEFINE_EVENT( wxEVT_WEBKIT_NEW_WINDOW, wxWebKitNewWindowEvent ); + +wxWebKitNewWindowEvent::wxWebKitNewWindowEvent( wxWindow* win ) +{ + SetEventType( wxEVT_WEBKIT_NEW_WINDOW); + if ( win ) + { + SetEventObject( win ); + SetId(win->GetId()); + } +} + + + //--------------------------------------------------------- // helper functions for NSString<->wxString conversion //--------------------------------------------------------- @@ -421,15 +451,13 @@ bool wxWebKitCtrl::Create(wxWindow *parent, #else m_macIsUserPane = false; wxControl::Create(parent, winID, pos, size, style , validator , name); +#if wxOSX_USE_CARBON m_peer = new wxMacControl(this); WebInitForCarbon(); HIWebViewCreate( m_peer->GetControlRefAddr() ); m_webView = (WebView*) HIWebViewGetWebView( m_peer->GetControlRef() ); - MacPostControlCreate(pos, size); - HIViewSetVisible( m_peer->GetControlRef(), true ); - [m_webView setHidden:false]; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 if ( UMAGetSystemVersion() >= 0x1030 ) HIViewChangeFeatures( m_peer->GetControlRef() , kHIViewIsOpaque , 0 ) ; @@ -437,6 +465,17 @@ bool wxWebKitCtrl::Create(wxWindow *parent, InstallControlEventHandler( m_peer->GetControlRef() , GetwxWebKitCtrlEventHandlerUPP(), GetEventTypeCount(eventList), eventList, this, (EventHandlerRef *)&m_webKitCtrlEventHandler); +#else + NSRect r = wxOSXGetFrameForControl( this, pos , size ) ; + m_webView = [[WebView alloc] initWithFrame:r frameName:@"webkitFrame" groupName:@"webkitGroup"]; + + m_peer = new wxWidgetCocoaImpl( this, m_webView ); +#endif + MacPostControlCreate(pos, size); +#if wxOSX_USE_CARBON + HIViewSetVisible( m_peer->GetControlRef(), true ); +#endif + [m_webView setHidden:false]; #endif @@ -454,7 +493,16 @@ bool wxWebKitCtrl::Create(wxWindow *parent, wxWebKitCtrl::~wxWebKitCtrl() { - + MyFrameLoadMonitor* myFrameLoadMonitor = [m_webView frameLoadDelegate]; + MyPolicyDelegate* myPolicyDelegate = [m_webView policyDelegate]; + [m_webView setFrameLoadDelegate: nil]; + [m_webView setPolicyDelegate: nil]; + + if (myFrameLoadMonitor) + [myFrameLoadMonitor release]; + + if (myPolicyDelegate) + [myPolicyDelegate release]; } // ---------------------------------------------------------------------------- @@ -658,6 +706,7 @@ wxString wxWebKitCtrl::RunScript(const wxString& javascript){ } void wxWebKitCtrl::OnSize(wxSizeEvent &event){ +#if defined(__WXMAC_) && wxOSX_USE_CARBON // This is a nasty hack because WebKit seems to lose its position when it is embedded // in a control that is not itself the content view for a TLW. // I put it in OnSize because these calcs are not perfect, and in fact are basically @@ -668,8 +717,8 @@ void wxWebKitCtrl::OnSize(wxSizeEvent &event){ wxWindow* tlw = MacGetTopLevelWindow(); - NSRect frame = [m_webView frame]; - NSRect bounds = [m_webView bounds]; + NSRect frame = [(WebView*)m_webView frame]; + NSRect bounds = [(WebView*)m_webView bounds]; #if DEBUG_WEBKIT_SIZING fprintf(stderr,"Carbon window x=%d, y=%d, width=%d, height=%d\n", GetPosition().x, GetPosition().y, GetSize().x, GetSize().y); @@ -720,19 +769,22 @@ void wxWebKitCtrl::OnSize(wxSizeEvent &event){ frame.origin.x = x; frame.origin.y = y; - [m_webView setFrame:frame]; + [(WebView*)m_webView setFrame:frame]; if (IsShown()) [(WebView*)m_webView display]; event.Skip(); +#endif } void wxWebKitCtrl::MacVisibilityChanged(){ +#if defined(__WXMAC__) && wxOSX_USE_CARBON bool isHidden = !IsControlVisible( m_peer->GetControlRef()); if (!isHidden) [(WebView*)m_webView display]; [m_webView setHidden:isHidden]; +#endif } //------------------------------------------------------------ @@ -858,6 +910,21 @@ void wxWebKitCtrl::MacVisibilityChanged(){ [listener use]; } +- (void)webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName decisionListener:(id < WebPolicyDecisionListener >)listener +{ + wxUnusedVar(sender); + wxUnusedVar(actionInformation); + wxWebKitNewWindowEvent thisEvent(webKitWindow); + + NSString *url = [[request URL] absoluteString]; + thisEvent.SetURL( wxStringWithNSString( url ) ); + thisEvent.SetTargetName( wxStringWithNSString( frameName ) ); + + if (webKitWindow && webKitWindow->GetEventHandler()) + webKitWindow->GetEventHandler()->ProcessEvent(thisEvent); + + [listener use]; +} @end #endif //wxUSE_WEBKIT