X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3beb50e570f1b4f7a97c767677451ffc558fa22f..bc9d3d911cfb51f612a699d7fb00f57eb5b2097c:/src/osx/webview_webkit.mm?ds=sidebyside diff --git a/src/osx/webview_webkit.mm b/src/osx/webview_webkit.mm index f3efc4e2e5..3b869b6f32 100644 --- a/src/osx/webview_webkit.mm +++ b/src/osx/webview_webkit.mm @@ -14,8 +14,8 @@ #include "wx/osx/webview_webkit.h" -#if wxUSE_WEBVIEW_WEBKIT && (defined(__WXOSX_COCOA__) \ - || defined(__WXOSX_CARBON__)) +#if wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT && (defined(__WXOSX_COCOA__) \ + || defined(__WXOSX_CARBON__)) // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -103,7 +103,6 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler, UInt32 keyCode ; UInt32 modifiers ; - Point point ; UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ; #if wxUSE_UNICODE @@ -140,8 +139,6 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler, sizeof(UInt32), NULL, &keyCode ); GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers ); - GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, NULL, - sizeof(Point), NULL, &point ); UInt32 message = (keyCode << 8) + charCode; switch ( GetEventKind( event ) ) @@ -155,7 +152,7 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler, wxTheApp->MacSetCurrentEvent( event , handler ) ; if ( /* focus && */ wxTheApp->MacSendKeyDownEvent( - focus, message, modifiers, when, point.h, point.v, uniChar[0])) + focus, message, modifiers, when, uniChar[0])) { result = noErr ; } @@ -165,7 +162,7 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler, case kEventRawKeyUp : if ( /* focus && */ wxTheApp->MacSendKeyUpEvent( - focus , message , modifiers , when , point.h , point.v , uniChar[0] ) ) + focus , message , modifiers , when , uniChar[0] ) ) { result = noErr ; } @@ -179,8 +176,6 @@ static pascal OSStatus wxWebKitKeyEventHandler(EventHandlerCallRef handler, event.m_controlDown = modifiers & controlKey; event.m_altDown = modifiers & optionKey; event.m_metaDown = modifiers & cmdKey; - event.m_x = point.h; - event.m_y = point.v; #if wxUSE_UNICODE event.m_uniChar = uniChar[0] ; @@ -315,8 +310,17 @@ DEFINE_ONE_SHOT_HANDLER_GETTER( wxWebViewWebKitEventHandler ) @end -//We use a hash to map scheme names to wxWebHandlers -WX_DECLARE_STRING_HASH_MAP(wxSharedPtr, wxStringToWebHandlerMap); +@interface WebViewUIDelegate : NSObject +{ + wxWebViewWebKit* webKitWindow; +} + +- initWithWxWindow: (wxWebViewWebKit*)inWindow; + +@end + +//We use a hash to map scheme names to wxWebViewHandler +WX_DECLARE_STRING_HASH_MAP(wxSharedPtr, wxStringToWebHandlerMap); static wxStringToWebHandlerMap g_stringHandlerMap; @@ -386,10 +390,15 @@ bool wxWebViewWebKit::Create(wxWindow *parent, [m_webView setPolicyDelegate:policyDelegate]; + WebViewUIDelegate* uiDelegate = + [[WebViewUIDelegate alloc] initWithWxWindow: this]; + + [m_webView setUIDelegate:uiDelegate]; + //Register our own class for custom scheme handling [NSURLProtocol registerClass:[WebViewCustomProtocol class]]; - LoadUrl(strURL); + LoadURL(strURL); return true; } @@ -397,21 +406,26 @@ wxWebViewWebKit::~wxWebViewWebKit() { WebViewLoadDelegate* loadDelegate = [m_webView frameLoadDelegate]; WebViewPolicyDelegate* policyDelegate = [m_webView policyDelegate]; + WebViewUIDelegate* uiDelegate = [m_webView UIDelegate]; [m_webView setFrameLoadDelegate: nil]; [m_webView setPolicyDelegate: nil]; + [m_webView setUIDelegate: nil]; if (loadDelegate) [loadDelegate release]; if (policyDelegate) [policyDelegate release]; + + if (uiDelegate) + [uiDelegate release]; } // ---------------------------------------------------------------------------- // public methods // ---------------------------------------------------------------------------- -bool wxWebViewWebKit::CanGoBack() +bool wxWebViewWebKit::CanGoBack() const { if ( !m_webView ) return false; @@ -419,7 +433,7 @@ bool wxWebViewWebKit::CanGoBack() return [m_webView canGoBack]; } -bool wxWebViewWebKit::CanGoForward() +bool wxWebViewWebKit::CanGoForward() const { if ( !m_webView ) return false; @@ -469,7 +483,7 @@ void wxWebViewWebKit::Stop() [[m_webView mainFrame] stopLoading]; } -bool wxWebViewWebKit::CanGetPageSource() +bool wxWebViewWebKit::CanGetPageSource() const { if ( !m_webView ) return false; @@ -478,7 +492,7 @@ bool wxWebViewWebKit::CanGetPageSource() return ( [[dataSource representation] canProvideDocumentSource] ); } -wxString wxWebViewWebKit::GetPageSource() +wxString wxWebViewWebKit::GetPageSource() const { if (CanGetPageSource()) @@ -501,7 +515,7 @@ wxString wxWebViewWebKit::GetPageSource() return wxEmptyString; } -bool wxWebViewWebKit::CanIncreaseTextSize() +bool wxWebViewWebKit::CanIncreaseTextSize() const { if ( !m_webView ) return false; @@ -521,7 +535,7 @@ void wxWebViewWebKit::IncreaseTextSize() [m_webView makeTextLarger:(WebView*)m_webView]; } -bool wxWebViewWebKit::CanDecreaseTextSize() +bool wxWebViewWebKit::CanDecreaseTextSize() const { if ( !m_webView ) return false; @@ -557,7 +571,7 @@ void wxWebViewWebKit::Print() { [op setShowsPrintPanel: showPrompt]; // in my tests, the progress bar always freezes and it stops the whole - // print operation. do not turn this to true unless there is a + // print operation. do not turn this to true unless there is a // workaround for the bug. [op setShowsProgressPanel: false]; } @@ -573,7 +587,7 @@ void wxWebViewWebKit::SetEditable(bool enable) [m_webView setEditable:enable ]; } -bool wxWebViewWebKit::IsEditable() +bool wxWebViewWebKit::IsEditable() const { if ( !m_webView ) return false; @@ -629,7 +643,7 @@ void wxWebViewWebKit::SetScrollPos(int pos) (NSString*)wxNSStringWithWxString( javascript )]; } -wxString wxWebViewWebKit::GetSelectedText() +wxString wxWebViewWebKit::GetSelectedText() const { NSString* selection = [[m_webView selectedDOMRange] markupString]; if (!selection) return wxEmptyString; @@ -648,7 +662,7 @@ void wxWebViewWebKit::RunScript(const wxString& javascript) void wxWebViewWebKit::OnSize(wxSizeEvent &event) { -#if defined(__WXMAC_) && wxOSX_USE_CARBON +#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 @@ -694,7 +708,7 @@ void wxWebViewWebKit::OnSize(wxSizeEvent &event) // we want is the root view, because we need to make the y origin relative // to the very top of the window, not its contents, since we later flip // the y coordinate for Cocoa. - HIViewConvertRect (&rect, m_peer->GetControlRef(), + HIViewConvertRect (&rect, GetPeer()->GetControlRef(), HIViewGetRoot( (WindowRef) MacGetTopLevelWindowRef() )); @@ -735,23 +749,23 @@ void wxWebViewWebKit::MacVisibilityChanged(){ #endif } -void wxWebViewWebKit::LoadUrl(const wxString& url) +void wxWebViewWebKit::LoadURL(const wxString& url) { [[m_webView mainFrame] loadRequest:[NSURLRequest requestWithURL: [NSURL URLWithString:wxNSStringWithWxString(url)]]]; } -wxString wxWebViewWebKit::GetCurrentURL() +wxString wxWebViewWebKit::GetCurrentURL() const { return wxStringWithNSString([m_webView mainFrameURL]); } -wxString wxWebViewWebKit::GetCurrentTitle() +wxString wxWebViewWebKit::GetCurrentTitle() const { return wxStringWithNSString([m_webView mainFrameTitle]); } -float wxWebViewWebKit::GetWebkitZoom() +float wxWebViewWebKit::GetWebkitZoom() const { return [m_webView textSizeMultiplier]; } @@ -761,7 +775,7 @@ void wxWebViewWebKit::SetWebkitZoom(float zoom) [m_webView setTextSizeMultiplier:zoom]; } -wxWebViewZoom wxWebViewWebKit::GetZoom() +wxWebViewZoom wxWebViewWebKit::GetZoom() const { float zoom = GetWebkitZoom(); @@ -823,7 +837,7 @@ void wxWebViewWebKit::SetZoom(wxWebViewZoom zoom) } -void wxWebViewWebKit::SetPage(const wxString& src, const wxString& baseUrl) +void wxWebViewWebKit::DoSetPage(const wxString& src, const wxString& baseUrl) { if ( !m_webView ) return; @@ -865,7 +879,7 @@ void wxWebViewWebKit::DeleteSelection() [(WebView*)m_webView deleteSelection]; } -bool wxWebViewWebKit::HasSelection() +bool wxWebViewWebKit::HasSelection() const { DOMRange* range = [m_webView selectedDOMRange]; if(!range) @@ -889,7 +903,7 @@ void wxWebViewWebKit::SelectAll() RunScript("window.getSelection().selectAllChildren(document.body);"); } -wxString wxWebViewWebKit::GetSelectedSource() +wxString wxWebViewWebKit::GetSelectedSource() const { wxString script = ("var range = window.getSelection().getRangeAt(0);" "var element = document.createElement('div');" @@ -900,7 +914,7 @@ wxString wxWebViewWebKit::GetSelectedSource() return wxStringWithNSString([result stringValue]); } -wxString wxWebViewWebKit::GetPageText() +wxString wxWebViewWebKit::GetPageText() const { id result = [[m_webView windowScriptObject] evaluateWebScript:@"document.body.textContent"]; @@ -921,9 +935,9 @@ void wxWebViewWebKit::ClearHistory() [m_webView setMaintainsBackForwardList:YES]; } -wxVector > wxWebViewWebKit::GetBackwardHistory() +wxVector > wxWebViewWebKit::GetBackwardHistory() { - wxVector > backhist; + wxVector > backhist; WebBackForwardList* history = [m_webView backForwardList]; int count = [history backListCount]; for(int i = -count; i < 0; i++) @@ -931,17 +945,17 @@ wxVector > wxWebViewWebKit::GetBackwardHistory() WebHistoryItem* item = [history itemAtIndex:i]; wxString url = wxStringWithNSString([item URLString]); wxString title = wxStringWithNSString([item title]); - wxWebHistoryItem* wxitem = new wxWebHistoryItem(url, title); + wxWebViewHistoryItem* wxitem = new wxWebViewHistoryItem(url, title); wxitem->m_histItem = item; - wxSharedPtr itemptr(wxitem); + wxSharedPtr itemptr(wxitem); backhist.push_back(itemptr); } return backhist; } -wxVector > wxWebViewWebKit::GetForwardHistory() +wxVector > wxWebViewWebKit::GetForwardHistory() { - wxVector > forwardhist; + wxVector > forwardhist; WebBackForwardList* history = [m_webView backForwardList]; int count = [history forwardListCount]; for(int i = 1; i <= count; i++) @@ -949,25 +963,25 @@ wxVector > wxWebViewWebKit::GetForwardHistory() WebHistoryItem* item = [history itemAtIndex:i]; wxString url = wxStringWithNSString([item URLString]); wxString title = wxStringWithNSString([item title]); - wxWebHistoryItem* wxitem = new wxWebHistoryItem(url, title); + wxWebViewHistoryItem* wxitem = new wxWebViewHistoryItem(url, title); wxitem->m_histItem = item; - wxSharedPtr itemptr(wxitem); + wxSharedPtr itemptr(wxitem); forwardhist.push_back(itemptr); } return forwardhist; } -void wxWebViewWebKit::LoadHistoryItem(wxSharedPtr item) +void wxWebViewWebKit::LoadHistoryItem(wxSharedPtr item) { [m_webView goToBackForwardItem:item->m_histItem]; } -bool wxWebViewWebKit::CanUndo() +bool wxWebViewWebKit::CanUndo() const { return [[m_webView undoManager] canUndo]; } -bool wxWebViewWebKit::CanRedo() +bool wxWebViewWebKit::CanRedo() const { return [[m_webView undoManager] canRedo]; } @@ -982,7 +996,7 @@ void wxWebViewWebKit::Redo() [[m_webView undoManager] redo]; } -void wxWebViewWebKit::RegisterHandler(wxSharedPtr handler) +void wxWebViewWebKit::RegisterHandler(wxSharedPtr handler) { g_stringHandlerMap[handler->GetName()] = handler; } @@ -1018,13 +1032,13 @@ void wxWebViewWebKit::RegisterHandler(wxSharedPtr handler) if (webKitWindow && frame == [sender mainFrame]){ NSString *url = [[[[frame dataSource] request] URL] absoluteString]; wxString target = wxStringWithNSString([frame name]); - wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, - webKitWindow->GetId(), - wxStringWithNSString( url ), - target, false); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, + webKitWindow->GetId(), + wxStringWithNSString( url ), + target); if (webKitWindow && webKitWindow->GetEventHandler()) - webKitWindow->GetEventHandler()->ProcessEvent(thisEvent); + webKitWindow->GetEventHandler()->ProcessEvent(event); } } @@ -1036,17 +1050,17 @@ void wxWebViewWebKit::RegisterHandler(wxSharedPtr handler) NSString *url = [[[[frame dataSource] request] URL] absoluteString]; wxString target = wxStringWithNSString([frame name]); - wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_LOADED, - webKitWindow->GetId(), - wxStringWithNSString( url ), - target, false); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_LOADED, + webKitWindow->GetId(), + wxStringWithNSString( url ), + target); if (webKitWindow && webKitWindow->GetEventHandler()) - webKitWindow->GetEventHandler()->ProcessEvent(thisEvent); + webKitWindow->GetEventHandler()->ProcessEvent(event); } } -wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) +wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) { *out = wxWEB_NAV_ERR_OTHER; @@ -1062,7 +1076,9 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) case NSURLErrorResourceUnavailable: case NSURLErrorHTTPTooManyRedirects: +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 case NSURLErrorDataLengthExceedsMaximum: +#endif case NSURLErrorBadURL: case NSURLErrorFileIsDirectory: *out = wxWEB_NAV_ERR_REQUEST; @@ -1084,16 +1100,20 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) *out = wxWEB_NAV_ERR_USER_CANCELLED; break; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 case NSURLErrorCannotDecodeRawData: case NSURLErrorCannotDecodeContentData: - case NSURLErrorBadServerResponse: case NSURLErrorCannotParseResponse: +#endif + case NSURLErrorBadServerResponse: *out = wxWEB_NAV_ERR_REQUEST; break; case NSURLErrorUserAuthenticationRequired: case NSURLErrorSecureConnectionFailed: +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 case NSURLErrorClientCertificateRequired: +#endif *out = wxWEB_NAV_ERR_AUTH; break; @@ -1128,18 +1148,18 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) if (webKitWindow && frame == [sender mainFrame]){ NSString *url = [[[[frame dataSource] request] URL] absoluteString]; - wxWebNavigationError type; + wxWebViewNavigationError type; wxString description = nsErrorToWxHtmlError(error, &type); - wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_ERROR, - webKitWindow->GetId(), - wxStringWithNSString( url ), - wxEmptyString, false); - thisEvent.SetString(description); - thisEvent.SetInt(type); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, + webKitWindow->GetId(), + wxStringWithNSString( url ), + wxEmptyString); + event.SetString(description); + event.SetInt(type); if (webKitWindow && webKitWindow->GetEventHandler()) { - webKitWindow->GetEventHandler()->ProcessEvent(thisEvent); + webKitWindow->GetEventHandler()->ProcessEvent(event); } } } @@ -1154,17 +1174,17 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) NSString *url = [[[[frame provisionalDataSource] request] URL] absoluteString]; - wxWebNavigationError type; + wxWebViewNavigationError type; wxString description = nsErrorToWxHtmlError(error, &type); - wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_ERROR, - webKitWindow->GetId(), - wxStringWithNSString( url ), - wxEmptyString, false); - thisEvent.SetString(description); - thisEvent.SetInt(type); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, + webKitWindow->GetId(), + wxStringWithNSString( url ), + wxEmptyString); + event.SetString(description); + event.SetInt(type); if (webKitWindow && webKitWindow->GetEventHandler()) - webKitWindow->GetEventHandler()->ProcessEvent(thisEvent); + webKitWindow->GetEventHandler()->ProcessEvent(event); } } @@ -1172,15 +1192,15 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) forFrame:(WebFrame *)frame { wxString target = wxStringWithNSString([frame name]); - wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, - webKitWindow->GetId(), - webKitWindow->GetCurrentURL(), - target, true); - - thisEvent.SetString(wxStringWithNSString(title)); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, + webKitWindow->GetId(), + webKitWindow->GetCurrentURL(), + target); + + event.SetString(wxStringWithNSString(title)); if (webKitWindow && webKitWindow->GetEventHandler()) - webKitWindow->GetEventHandler()->ProcessEvent(thisEvent); + webKitWindow->GetEventHandler()->ProcessEvent(event); } @end @@ -1204,14 +1224,14 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) webKitWindow->m_busy = true; NSString *url = [[request URL] absoluteString]; wxString target = wxStringWithNSString([frame name]); - wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_NAVIGATING, - webKitWindow->GetId(), - wxStringWithNSString( url ), target, true); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATING, + webKitWindow->GetId(), + wxStringWithNSString( url ), target); if (webKitWindow && webKitWindow->GetEventHandler()) - webKitWindow->GetEventHandler()->ProcessEvent(thisEvent); + webKitWindow->GetEventHandler()->ProcessEvent(event); - if (thisEvent.IsVetoed()) + if (!event.IsAllowed()) { webKitWindow->m_busy = false; [listener ignore]; @@ -1222,7 +1242,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) } } -- (void)webView:(WebView *)sender +- (void)webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName @@ -1231,12 +1251,12 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) wxUnusedVar(actionInformation); NSString *url = [[request URL] absoluteString]; - wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, - webKitWindow->GetId(), - wxStringWithNSString( url ), "", true); + wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, + webKitWindow->GetId(), + wxStringWithNSString( url ), ""); if (webKitWindow && webKitWindow->GetEventHandler()) - webKitWindow->GetEventHandler()->ProcessEvent(thisEvent); + webKitWindow->GetEventHandler()->ProcessEvent(event); [listener ignore]; } @@ -1262,7 +1282,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { - //We don't do any processing here as the wxWebHandler classes do it + //We don't do any processing here as the wxWebViewHandler classes do it return request; } @@ -1279,18 +1299,18 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[request URL] MIMEType:wxNSStringWithWxString(file->GetMimeType()) - expectedContentLength:length + expectedContentLength:length textEncodingName:nil]; - + //Load the data, we malloc it so it is tidied up properly void* buffer = malloc(length); file->GetStream()->Read(buffer, length); NSData *data = [[NSData alloc] initWithBytesNoCopy:buffer length:length]; - + id client = [self client]; //We do not support caching anything yet - [client URLProtocol:self didReceiveResponse:response + [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; //Set the data @@ -1309,4 +1329,23 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) @end -#endif //wxUSE_WEBVIEW_WEBKIT + +@implementation WebViewUIDelegate + +- initWithWxWindow: (wxWebViewWebKit*)inWindow +{ + [super init]; + webKitWindow = inWindow; // non retained + return self; +} + +- (void)webView:(WebView *)sender printFrameView:(WebFrameView *)frameView +{ + wxUnusedVar(sender); + wxUnusedVar(frameView); + + webKitWindow->Print(); +} +@end + +#endif //wxUSE_WEBVIEW && wxUSE_WEBVIEW_WEBKIT