X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/906c935a80b10d53cecf57f71ab5f3f4f1d529ec..59cb2555551e9f24481affe86ef8b1bcd519c14f:/src/osx/webview_webkit.mm diff --git a/src/osx/webview_webkit.mm b/src/osx/webview_webkit.mm index ec49602552..8c88764884 100644 --- a/src/osx/webview_webkit.mm +++ b/src/osx/webview_webkit.mm @@ -14,6 +14,9 @@ #include "wx/osx/webview_webkit.h" +#if wxUSE_WEBVIEW_WEBKIT && (defined(__WXOSX_COCOA__) \ + || defined(__WXOSX_CARBON__)) + // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -21,31 +24,22 @@ #include "wx/wx.h" #endif -#if wxHAVE_WEB_BACKEND_OSX_WEBKIT - -#ifdef __WXCOCOA__ -#include "wx/cocoa/autorelease.h" -#else #include "wx/osx/private.h" +#include "wx/cocoa/string.h" #include #include #include -#endif #include -// FIXME: find cleaner way to find the wxWidgets ID of a webview than this hack -#include -std::map wx_webviewctrls; - #define DEBUG_WEBKIT_SIZING 0 // ---------------------------------------------------------------------------- // macros // ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxWebViewWebKit, wxControl) +wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewWebKit, wxWebView); BEGIN_EVENT_TABLE(wxWebViewWebKit, wxControl) #if defined(__WXMAC__) && wxOSX_USE_CARBON @@ -301,47 +295,6 @@ DEFINE_ONE_SHOT_HANDLER_GETTER( wxWebViewWebKitEventHandler ) #endif -//--------------------------------------------------------- -// helper functions for NSString<->wxString conversion -//--------------------------------------------------------- - -inline wxString wxStringWithNSString(NSString *nsstring) -{ -#if wxUSE_UNICODE - return wxString([nsstring UTF8String], wxConvUTF8); -#else - return wxString([nsstring lossyCString]); -#endif // wxUSE_UNICODE -} - -inline NSString* wxNSStringWithWxString(const wxString &wxstring) -{ -#if wxUSE_UNICODE - return [NSString stringWithUTF8String: wxstring.mb_str(wxConvUTF8)]; -#else - return [NSString stringWithCString: wxstring.c_str() length:wxstring.Len()]; -#endif // wxUSE_UNICODE -} - -inline int wxNavTypeFromWebNavType(int type){ - if (type == WebNavigationTypeLinkClicked) - return wxWEBKIT_NAV_LINK_CLICKED; - - if (type == WebNavigationTypeFormSubmitted) - return wxWEBKIT_NAV_FORM_SUBMITTED; - - if (type == WebNavigationTypeBackForward) - return wxWEBKIT_NAV_BACK_NEXT; - - if (type == WebNavigationTypeReload) - return wxWEBKIT_NAV_RELOAD; - - if (type == WebNavigationTypeFormResubmitted) - return wxWEBKIT_NAV_FORM_RESUBMITTED; - - return wxWEBKIT_NAV_OTHER; -} - @interface MyFrameLoadMonitor : NSObject { wxWebViewWebKit* webKitWindow; @@ -372,46 +325,8 @@ bool wxWebViewWebKit::Create(wxWindow *parent, const wxString& name) { m_busy = false; - //m_pageTitle = _("Untitled Page"); - //still needed for wxCocoa?? -/* - int width, height; - wxSize sizeInstance; - if (size.x == wxDefaultCoord || size.y == wxDefaultCoord) - { - m_parent->GetClientSize(&width, &height); - sizeInstance.x = width; - sizeInstance.y = height; - } - else - { - sizeInstance.x = size.x; - sizeInstance.y = size.y; - } -*/ - // now create and attach WebKit view... -#ifdef __WXCOCOA__ - wxControl::Create(parent, m_windowID, pos, sizeInstance, style, name); - SetSize(pos.x, pos.y, sizeInstance.x, sizeInstance.y); - - wxTopLevelWindowCocoa *topWin = wxDynamicCast(this, wxTopLevelWindowCocoa); - NSWindow* nsWin = topWin->GetNSWindow(); - NSRect rect; - rect.origin.x = pos.x; - rect.origin.y = pos.y; - rect.size.width = sizeInstance.x; - rect.size.height = sizeInstance.y; - m_webView = (WebView*)[[WebView alloc] initWithFrame:rect - frameName:@"webkitFrame" - groupName:@"webkitGroup"]; - SetNSView(m_webView); - [m_cocoaNSView release]; - - if(m_parent) m_parent->CocoaAddChild(this); - SetInitialFrameRect(pos,sizeInstance); -#else - m_macIsUserPane = false; + DontCreatePeer(); wxControl::Create(parent, winID, pos, size, style, wxDefaultValidator, name); #if wxOSX_USE_CARBON @@ -434,11 +349,9 @@ bool wxWebViewWebKit::Create(wxWindow *parent, m_webView = [[WebView alloc] initWithFrame:r frameName:@"webkitFrame" groupName:@"webkitGroup"]; - m_peer = new wxWidgetCocoaImpl( this, m_webView ); + SetPeer(new wxWidgetCocoaImpl( this, m_webView )); #endif - wx_webviewctrls[m_webView] = this; - MacPostControlCreate(pos, size); #if wxOSX_USE_CARBON @@ -446,7 +359,7 @@ bool wxWebViewWebKit::Create(wxWindow *parent, #endif [m_webView setHidden:false]; -#endif + // Register event listener interfaces MyFrameLoadMonitor* myFrameLoadMonitor = @@ -460,7 +373,7 @@ bool wxWebViewWebKit::Create(wxWindow *parent, [m_webView setPolicyDelegate:myPolicyDelegate]; - InternalLoadURL(strURL); + LoadUrl(strURL); return true; } @@ -482,15 +395,6 @@ wxWebViewWebKit::~wxWebViewWebKit() // public methods // ---------------------------------------------------------------------------- -void wxWebViewWebKit::InternalLoadURL(const wxString &url) -{ - if( !m_webView ) - return; - - [[m_webView mainFrame] loadRequest:[NSURLRequest requestWithURL: - [NSURL URLWithString:wxNSStringWithWxString(url)]]]; -} - bool wxWebViewWebKit::CanGoBack() { if ( !m_webView ) @@ -512,10 +416,7 @@ void wxWebViewWebKit::GoBack() if ( !m_webView ) return; - bool result = [(WebView*)m_webView goBack]; - - // TODO: return result (if it also exists in other backends...) - //return result; + [(WebView*)m_webView goBack]; } void wxWebViewWebKit::GoForward() @@ -523,10 +424,7 @@ void wxWebViewWebKit::GoForward() if ( !m_webView ) return; - bool result = [(WebView*)m_webView goForward]; - - // TODO: return result (if it also exists in other backends...) - //return result; + [(WebView*)m_webView goForward]; } void wxWebViewWebKit::Reload(wxWebViewReloadFlags flags) @@ -587,15 +485,6 @@ wxString wxWebViewWebKit::GetPageSource() return wxEmptyString; } -wxString wxWebViewWebKit::GetSelection() -{ - if ( !m_webView ) - return wxEmptyString; - - NSString* selectedText = [[m_webView selectedDOMRange] toString]; - return wxStringWithNSString( selectedText ); -} - bool wxWebViewWebKit::CanIncreaseTextSize() { if ( !m_webView ) @@ -735,7 +624,7 @@ wxString wxWebViewWebKit::GetSelectedText() void wxWebViewWebKit::RunScript(const wxString& javascript) { if ( !m_webView ) - return wxEmptyString; + return; [[m_webView windowScriptObject] evaluateWebScript: (NSString*)wxNSStringWithWxString( javascript )]; @@ -832,7 +721,8 @@ void wxWebViewWebKit::MacVisibilityChanged(){ void wxWebViewWebKit::LoadUrl(const wxString& url) { - InternalLoadURL(url); + [[m_webView mainFrame] loadRequest:[NSURLRequest requestWithURL: + [NSURL URLWithString:wxNSStringWithWxString(url)]]]; } wxString wxWebViewWebKit::GetCurrentURL() @@ -842,7 +732,7 @@ wxString wxWebViewWebKit::GetCurrentURL() wxString wxWebViewWebKit::GetCurrentTitle() { - return GetPageTitle(); + return wxStringWithNSString([m_webView mainFrameTitle]); } float wxWebViewWebKit::GetWebkitZoom() @@ -932,7 +822,7 @@ void wxWebViewWebKit::Cut() if ( !m_webView ) return; - [(WebView*)m_webView cut]; + [(WebView*)m_webView cut:m_webView]; } void wxWebViewWebKit::Copy() @@ -940,7 +830,7 @@ void wxWebViewWebKit::Copy() if ( !m_webView ) return; - [(WebView*)m_webView copy]; + [(WebView*)m_webView copy:m_webView]; } void wxWebViewWebKit::Paste() @@ -948,7 +838,7 @@ void wxWebViewWebKit::Paste() if ( !m_webView ) return; - [(WebView*)m_webView paste]; + [(WebView*)m_webView paste:m_webView]; } void wxWebViewWebKit::DeleteSelection() @@ -959,6 +849,123 @@ void wxWebViewWebKit::DeleteSelection() [(WebView*)m_webView deleteSelection]; } +bool wxWebViewWebKit::HasSelection() +{ + DOMRange* range = [m_webView selectedDOMRange]; + if(!range) + { + return false; + } + else + { + return true; + } +} + +void wxWebViewWebKit::ClearSelection() +{ + //We use javascript as selection isn't exposed at the moment in webkit + RunScript("window.getSelection().removeAllRanges();"); +} + +void wxWebViewWebKit::SelectAll() +{ + RunScript("window.getSelection().selectAllChildren(document.body);"); +} + +wxString wxWebViewWebKit::GetSelectedSource() +{ + wxString script = ("var range = window.getSelection().getRangeAt(0);" + "var element = document.createElement('div');" + "element.appendChild(range.cloneContents());" + "return element.innerHTML;"); + id result = [[m_webView windowScriptObject] + evaluateWebScript:wxNSStringWithWxString(script)]; + return wxStringWithNSString([result stringValue]); +} + +wxString wxWebViewWebKit::GetPageText() +{ + id result = [[m_webView windowScriptObject] + evaluateWebScript:@"document.body.textContent"]; + return wxStringWithNSString([result stringValue]); +} + +void wxWebViewWebKit::EnableHistory(bool enable) +{ + if ( !m_webView ) + return; + + [m_webView setMaintainsBackForwardList:enable]; +} + +void wxWebViewWebKit::ClearHistory() +{ + [m_webView setMaintainsBackForwardList:NO]; + [m_webView setMaintainsBackForwardList:YES]; +} + +wxVector > wxWebViewWebKit::GetBackwardHistory() +{ + wxVector > backhist; + WebBackForwardList* history = [m_webView backForwardList]; + int count = [history backListCount]; + for(int i = -count; i < 0; i++) + { + WebHistoryItem* item = [history itemAtIndex:i]; + wxString url = wxStringWithNSString([item URLString]); + wxString title = wxStringWithNSString([item title]); + wxWebHistoryItem* wxitem = new wxWebHistoryItem(url, title); + wxitem->m_histItem = item; + wxSharedPtr itemptr(wxitem); + backhist.push_back(itemptr); + } + return backhist; +} + +wxVector > wxWebViewWebKit::GetForwardHistory() +{ + wxVector > forwardhist; + WebBackForwardList* history = [m_webView backForwardList]; + int count = [history forwardListCount]; + for(int i = 1; i <= count; i++) + { + WebHistoryItem* item = [history itemAtIndex:i]; + wxString url = wxStringWithNSString([item URLString]); + wxString title = wxStringWithNSString([item title]); + wxWebHistoryItem* wxitem = new wxWebHistoryItem(url, title); + wxitem->m_histItem = item; + wxSharedPtr itemptr(wxitem); + forwardhist.push_back(itemptr); + } + return forwardhist; +} + +void wxWebViewWebKit::LoadHistoryItem(wxSharedPtr item) +{ + [m_webView goToBackForwardItem:item->m_histItem]; +} + +bool wxWebViewWebKit::CanUndo() +{ + return [[m_webView undoManager] canUndo]; +} + +bool wxWebViewWebKit::CanRedo() +{ + return [[m_webView undoManager] canRedo]; +} + +void wxWebViewWebKit::Undo() +{ + [[m_webView undoManager] undo]; +} + +void wxWebViewWebKit::Redo() +{ + [[m_webView undoManager] redo]; +} + //------------------------------------------------------------ // Listener interfaces //------------------------------------------------------------ @@ -980,20 +987,18 @@ void wxWebViewWebKit::DeleteSelection() - (void)webView:(WebView *)sender didStartProvisionalLoadForFrame:(WebFrame *)frame { - wxASSERT(wx_webviewctrls.find(sender) != wx_webviewctrls.end()); - wx_webviewctrls[sender]->m_busy = true; + webKitWindow->m_busy = true; } - (void)webView:(WebView *)sender didCommitLoadForFrame:(WebFrame *)frame { - wxASSERT(wx_webviewctrls.find(sender) != wx_webviewctrls.end()); - wx_webviewctrls[sender]->m_busy = true; + webKitWindow->m_busy = true; if (webKitWindow && frame == [sender mainFrame]){ NSString *url = [[[[frame dataSource] request] URL] absoluteString]; wxString target = wxStringWithNSString([frame name]); wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_NAVIGATED, - wx_webviewctrls[sender]->GetId(), + webKitWindow->GetId(), wxStringWithNSString( url ), target, false); @@ -1004,15 +1009,14 @@ void wxWebViewWebKit::DeleteSelection() - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame { - wxASSERT(wx_webviewctrls.find(sender) != wx_webviewctrls.end()); - wx_webviewctrls[sender]->m_busy = false; + webKitWindow->m_busy = false; if (webKitWindow && frame == [sender mainFrame]){ NSString *url = [[[[frame dataSource] request] URL] absoluteString]; wxString target = wxStringWithNSString([frame name]); wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_LOADED, - wx_webviewctrls[sender]->GetId(), + webKitWindow->GetId(), wxStringWithNSString( url ), target, false); @@ -1098,8 +1102,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) - (void)webView:(WebView *)sender didFailLoadWithError:(NSError*) error forFrame:(WebFrame *)frame { - wxASSERT(wx_webviewctrls.find(sender) != wx_webviewctrls.end()); - wx_webviewctrls[sender]->m_busy = false; + webKitWindow->m_busy = false; if (webKitWindow && frame == [sender mainFrame]){ NSString *url = [[[[frame dataSource] request] URL] absoluteString]; @@ -1107,7 +1110,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) wxWebNavigationError type; wxString description = nsErrorToWxHtmlError(error, &type); wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_ERROR, - wx_webviewctrls[sender]->GetId(), + webKitWindow->GetId(), wxStringWithNSString( url ), wxEmptyString, false); thisEvent.SetString(description); @@ -1124,8 +1127,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) didFailProvisionalLoadWithError:(NSError*)error forFrame:(WebFrame *)frame { - wxASSERT(wx_webviewctrls.find(sender) != wx_webviewctrls.end()); - wx_webviewctrls[sender]->m_busy = false; + webKitWindow->m_busy = false; if (webKitWindow && frame == [sender mainFrame]){ NSString *url = [[[[frame provisionalDataSource] request] URL] @@ -1134,7 +1136,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) wxWebNavigationError type; wxString description = nsErrorToWxHtmlError(error, &type); wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_ERROR, - wx_webviewctrls[sender]->GetId(), + webKitWindow->GetId(), wxStringWithNSString( url ), wxEmptyString, false); thisEvent.SetString(description); @@ -1148,10 +1150,16 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) - (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame { - if (webKitWindow && frame == [sender mainFrame]) - { - webKitWindow->SetPageTitle(wxStringWithNSString( title )); - } + wxString target = wxStringWithNSString([frame name]); + wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_TITLE_CHANGED, + webKitWindow->GetId(), + webKitWindow->GetCurrentURL(), + target, true); + + thisEvent.SetString(wxStringWithNSString(title)); + + if (webKitWindow && webKitWindow->GetEventHandler()) + webKitWindow->GetEventHandler()->ProcessEvent(thisEvent); } @end @@ -1172,12 +1180,11 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) { wxUnusedVar(frame); - wxASSERT(wx_webviewctrls.find(sender) != wx_webviewctrls.end()); - wx_webviewctrls[sender]->m_busy = true; + webKitWindow->m_busy = true; NSString *url = [[request URL] absoluteString]; wxString target = wxStringWithNSString([frame name]); wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_NAVIGATING, - wx_webviewctrls[sender]->GetId(), + webKitWindow->GetId(), wxStringWithNSString( url ), target, true); if (webKitWindow && webKitWindow->GetEventHandler()) @@ -1185,7 +1192,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) if (thisEvent.IsVetoed()) { - wx_webviewctrls[sender]->m_busy = false; + webKitWindow->m_busy = false; [listener ignore]; } else @@ -1201,13 +1208,11 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) decisionListener:(id < WebPolicyDecisionListener >)listener { wxUnusedVar(actionInformation); - - wxASSERT(wx_webviewctrls.find(sender) != wx_webviewctrls.end()); + NSString *url = [[request URL] absoluteString]; - wxString target = wxStringWithNSString([frame name]); wxWebNavigationEvent thisEvent(wxEVT_COMMAND_WEB_VIEW_NEWWINDOW, - wx_webviewctrls[sender]->GetId(), - wxStringWithNSString( url ), target, true); + webKitWindow->GetId(), + wxStringWithNSString( url ), "", true); if (webKitWindow && webKitWindow->GetEventHandler()) webKitWindow->GetEventHandler()->ProcessEvent(thisEvent); @@ -1216,4 +1221,4 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebNavigationError* out) } @end -#endif //wxHAVE_WEB_BACKEND_OSX_WEBKIT +#endif //wxUSE_WEBVIEW_WEBKIT