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:
committed by
Vadim Zeitlin
parent
83ce88402c
commit
e6b31adefe
@@ -145,6 +145,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);
|
||||||
|
@@ -345,6 +345,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);
|
||||||
@@ -1228,8 +1229,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 = wxCFStringRef::AsString([frame name]);
|
wxString target = wxCFStringRef::AsString([frame name]);
|
||||||
wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATING,
|
wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATING,
|
||||||
webKitWindow->GetId(),
|
webKitWindow->GetId(),
|
||||||
@@ -1360,6 +1379,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);
|
||||||
|
Reference in New Issue
Block a user