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/85
This commit is contained in:
Tobias Taschner 2015-09-01 16:59:42 +02:00 committed by Vadim Zeitlin
parent 83ce88402c
commit e6b31adefe
2 changed files with 30 additions and 1 deletions

View File

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

View File

@ -345,6 +345,7 @@ bool wxWebViewWebKit::Create(wxWindow *parent,
const wxString& name)
{
m_busy = false;
m_nextNavigationIsNewWindow = false;
DontCreatePeer();
wxControl::Create(parent, winID, pos, size, style, wxDefaultValidator, name);
@ -1228,8 +1229,26 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out)
{
wxUnusedVar(frame);
webKitWindow->m_busy = true;
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 = wxCFStringRef::AsString([frame name]);
wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATING,
webKitWindow->GetId(),
@ -1360,6 +1379,15 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out)
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
{
wxUnusedVar(sender);