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:
parent
83ce88402c
commit
e6b31adefe
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user