Fix OS X wxWebView ignoring JavaScript window.open() calls

On OS X (tested on 10.10.5) calls to window.open() with a different target
than _self were simply ignored. No navigation and no EVT_WEBVIEW_NEWWINDOW as
expected.

Unfortunately WebKit does not call the decidePolicyForNewWindowAction delegate
method in these cases. A new delegate method createWebViewWithRequest has been
implemented to handle this case and send EVT_WEBVIEW_NEWWINDOW as in other
ports.

Closes https://github.com/wxWidgets/wxWidgets/pull/86

(cherry picked from commit e6b31adefe)
This commit is contained in:
Tobias Taschner
2015-09-01 16:59:42 +02:00
committed by Vadim Zeitlin
parent 3251fa4156
commit 733eae83dc
2 changed files with 30 additions and 1 deletions

View File

@@ -146,6 +146,7 @@ public:
void OnMouseEvents(wxMouseEvent &event); void OnMouseEvents(wxMouseEvent &event);
bool m_busy; bool m_busy;
bool m_nextNavigationIsNewWindow;
protected: protected:
virtual void DoSetPage(const wxString& html, const wxString& baseUrl); virtual void DoSetPage(const wxString& html, const wxString& baseUrl);

View File

@@ -340,6 +340,7 @@ bool wxWebViewWebKit::Create(wxWindow *parent,
const wxString& name) const wxString& name)
{ {
m_busy = false; m_busy = false;
m_nextNavigationIsNewWindow = false;
DontCreatePeer(); DontCreatePeer();
wxControl::Create(parent, winID, pos, size, style, wxDefaultValidator, name); wxControl::Create(parent, winID, pos, size, style, wxDefaultValidator, name);
@@ -1212,8 +1213,26 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out)
{ {
wxUnusedVar(frame); wxUnusedVar(frame);
webKitWindow->m_busy = true;
NSString *url = [[request URL] absoluteString]; NSString *url = [[request URL] absoluteString];
if (webKitWindow->m_nextNavigationIsNewWindow)
{
// This navigation has been marked as a new window
// cancel the request here and send an apropriate event
// to the application code
webKitWindow->m_nextNavigationIsNewWindow = false;
wxWebViewEvent event(wxEVT_WEBVIEW_NEWWINDOW,
webKitWindow->GetId(),
wxCFStringRef::AsString( url ), "");
if (webKitWindow && webKitWindow->GetEventHandler())
webKitWindow->GetEventHandler()->ProcessEvent(event);
[listener ignore];
return;
}
webKitWindow->m_busy = true;
wxString target = wxStringWithNSString([frame name]); wxString target = wxStringWithNSString([frame name]);
wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATING, wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATING,
webKitWindow->GetId(), webKitWindow->GetId(),
@@ -1342,6 +1361,15 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out)
return self; return self;
} }
- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request
{
// This method is called when window.open() is used in javascript with a target != _self
// request is always nil, so it can't be used for event generation
// Mark the next navigation as "new window"
webKitWindow->m_nextNavigationIsNewWindow = true;
return sender;
}
- (void)webView:(WebView *)sender printFrameView:(WebFrameView *)frameView - (void)webView:(WebView *)sender printFrameView:(WebFrameView *)frameView
{ {
wxUnusedVar(sender); wxUnusedVar(sender);