diff --git a/include/wx/msw/private/webview_edge.h b/include/wx/msw/private/webview_edge.h index b86d73f5f6..202e6e7caf 100644 --- a/include/wx/msw/private/webview_edge.h +++ b/include/wx/msw/private/webview_edge.h @@ -85,6 +85,7 @@ public: EventRegistrationToken m_containsFullScreenElementChangedToken = { }; EventRegistrationToken m_webMessageReceivedToken = { }; EventRegistrationToken m_webResourceRequestedToken = { }; + EventRegistrationToken m_windowCloseRequestedToken = { }; // WebView Event handlers HRESULT OnNavigationStarting(ICoreWebView2* sender, ICoreWebView2NavigationStartingEventArgs* args); @@ -98,6 +99,7 @@ public: HRESULT OnWebMessageReceived(ICoreWebView2* sender, ICoreWebView2WebMessageReceivedEventArgs* args); HRESULT OnWebResourceRequested(ICoreWebView2* sender, ICoreWebView2WebResourceRequestedEventArgs* args); HRESULT OnAddScriptToExecuteOnDocumentedCreatedCompleted(HRESULT errorCode, LPCWSTR id); + HRESULT OnWindowCloseRequested(ICoreWebView2* sender, IUnknown* args); HRESULT OnEnvironmentCreated(HRESULT result, ICoreWebView2Environment* environment); HRESULT OnWebViewCreated(HRESULT result, ICoreWebView2Controller* webViewController); diff --git a/include/wx/webview.h b/include/wx/webview.h index 98ba57ee03..d77db04301 100644 --- a/include/wx/webview.h +++ b/include/wx/webview.h @@ -359,6 +359,7 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_NAVIGATED, wxWebVie wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_LOADED, wxWebViewEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_ERROR, wxWebViewEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_NEWWINDOW, wxWebViewEvent ); +wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_WINDOW_CLOSE_REQUESTED, wxWebViewEvent); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_TITLE_CHANGED, wxWebViewEvent ); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_FULLSCREEN_CHANGED, wxWebViewEvent); wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_WEBVIEW, wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, wxWebViewEvent); diff --git a/interface/wx/webview.h b/interface/wx/webview.h index a36011769d..ad17091885 100644 --- a/interface/wx/webview.h +++ b/interface/wx/webview.h @@ -708,6 +708,10 @@ public: Process a @c wxEVT_WEBVIEW_NEWWINDOW event, generated when a new window is created. You must handle this event if you want anything to happen, for example to load the page in a new window or tab. + @event{wxEVT_WEBVIEW_WINDOW_CLOSE_REQUESTED(id, func)} + Process a @c wxEVT_WEBVIEW_WINDOW_CLOSE_REQUESTED event, generated when + a window is requested to be closed. + only available in wxWidgets 3.3.0 or later. @event{EVT_WEBVIEW_TITLE_CHANGED(id, func)} Process a @c wxEVT_WEBVIEW_TITLE_CHANGED event, generated when the page title changes. Use GetString to get the title. @@ -1600,6 +1604,10 @@ public: Process a @c wxEVT_WEBVIEW_NEWWINDOW event, generated when a new window is created. You must handle this event if you want anything to happen, for example to load the page in a new window or tab. + @event{wxEVT_WEBVIEW_WINDOW_CLOSE_REQUESTED(id, func)} + Process a @c wxEVT_WEBVIEW_WINDOW_CLOSE_REQUESTED event, generated when + a window is requested to be closed. + only available in wxWidgets 3.3.0 or later. @event{EVT_WEBVIEW_TITLE_CHANGED(id, func)} Process a @c wxEVT_WEBVIEW_TITLE_CHANGED event, generated when the page title changes. Use GetString to get the title. diff --git a/samples/webview/webview.cpp b/samples/webview/webview.cpp index ad65e3b466..9bd93a7c4b 100644 --- a/samples/webview/webview.cpp +++ b/samples/webview/webview.cpp @@ -118,6 +118,7 @@ public: void OnFullScreenChanged(wxWebViewEvent& evt); void OnScriptMessage(wxWebViewEvent& evt); void OnScriptResult(wxWebViewEvent& evt); + void OnWindowCloseRequested(wxWebViewEvent& evt); void OnSetPage(wxCommandEvent& evt); void OnViewSourceRequest(wxCommandEvent& evt); void OnViewTextRequest(wxCommandEvent& evt); @@ -581,6 +582,7 @@ WebFrame::WebFrame(const wxString& url) : Bind(wxEVT_WEBVIEW_FULLSCREEN_CHANGED, &WebFrame::OnFullScreenChanged, this, m_browser->GetId()); Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &WebFrame::OnScriptMessage, this, m_browser->GetId()); Bind(wxEVT_WEBVIEW_SCRIPT_RESULT, &WebFrame::OnScriptResult, this, m_browser->GetId()); + Bind(wxEVT_WEBVIEW_WINDOW_CLOSE_REQUESTED, &WebFrame::OnWindowCloseRequested, this, m_browser->GetId()); // Connect the menu events Bind(wxEVT_MENU, &WebFrame::OnSetPage, this, setPage->GetId()); @@ -981,6 +983,11 @@ void WebFrame::OnScriptResult(wxWebViewEvent& evt) wxLogMessage("Async script result received; value = %s", evt.GetString()); } +void WebFrame::OnWindowCloseRequested(wxWebViewEvent& evt) +{ + wxLogMessage("Window close requested"); +} + void WebFrame::OnSetPage(wxCommandEvent& WXUNUSED(evt)) { m_browser->SetPage diff --git a/src/common/webview.cpp b/src/common/webview.cpp index 904746dbec..2351a2a8bb 100644 --- a/src/common/webview.cpp +++ b/src/common/webview.cpp @@ -49,6 +49,7 @@ wxDEFINE_EVENT( wxEVT_WEBVIEW_NAVIGATED, wxWebViewEvent ); wxDEFINE_EVENT( wxEVT_WEBVIEW_LOADED, wxWebViewEvent ); wxDEFINE_EVENT( wxEVT_WEBVIEW_ERROR, wxWebViewEvent ); wxDEFINE_EVENT( wxEVT_WEBVIEW_NEWWINDOW, wxWebViewEvent ); +wxDEFINE_EVENT( wxEVT_WEBVIEW_WINDOW_CLOSE_REQUESTED, wxWebViewEvent ); wxDEFINE_EVENT( wxEVT_WEBVIEW_TITLE_CHANGED, wxWebViewEvent ); wxDEFINE_EVENT( wxEVT_WEBVIEW_FULLSCREEN_CHANGED, wxWebViewEvent); wxDEFINE_EVENT( wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, wxWebViewEvent); diff --git a/src/msw/webview_edge.cpp b/src/msw/webview_edge.cpp index 8623c19922..18147f7230 100644 --- a/src/msw/webview_edge.cpp +++ b/src/msw/webview_edge.cpp @@ -280,6 +280,7 @@ wxWebViewEdgeImpl::~wxWebViewEdgeImpl() m_webView->remove_ContainsFullScreenElementChanged(m_containsFullScreenElementChangedToken); m_webView->remove_WebMessageReceived(m_webMessageReceivedToken); m_webView->remove_WebResourceRequested(m_webResourceRequestedToken); + m_webView->remove_WindowCloseRequested(m_windowCloseRequestedToken); } } @@ -509,6 +510,13 @@ HRESULT wxWebViewEdgeImpl::OnNewWindowRequested(ICoreWebView2* WXUNUSED(sender), return S_OK; } +HRESULT wxWebViewEdgeImpl::OnWindowCloseRequested(ICoreWebView2* WXUNUSED(sender), IUnknown* WXUNUSED(args)) +{ + wxWebViewEvent evt(wxEVT_WEBVIEW_WINDOW_CLOSE_REQUESTED, m_ctrl->GetId(), m_ctrl->GetCurrentURL(), ""); + m_ctrl->GetEventHandler()->AddPendingEvent(evt); + return S_OK; +} + HRESULT wxWebViewEdgeImpl::OnDocumentTitleChanged(ICoreWebView2* WXUNUSED(sender), IUnknown* WXUNUSED(args)) { wxWebViewEvent event(wxEVT_WEBVIEW_TITLE_CHANGED, @@ -675,6 +683,10 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control Callback( this, &wxWebViewEdgeImpl::OnWebResourceRequested).Get(), &m_webResourceRequestedToken); + m_webView->add_WindowCloseRequested( + Callback( + this, &wxWebViewEdgeImpl::OnWindowCloseRequested).Get(), + &m_windowCloseRequestedToken); // Register handlers for (wxStringToWebHandlerMap::iterator it = m_handlers.begin(); it != m_handlers.end(); it++) diff --git a/src/osx/webview_webkit.mm b/src/osx/webview_webkit.mm index 000dbb132b..4c26dc9037 100644 --- a/src/osx/webview_webkit.mm +++ b/src/osx/webview_webkit.mm @@ -1024,6 +1024,15 @@ WX_API_AVAILABLE_MACOS(10, 13) return nil; } +- (void)webViewDidClose:(WKWebView *)webView +{ + wxWebViewEvent event(wxEVT_WEBVIEW_WINDOW_CLOSE_REQUESTED, + webKitWindow->GetId(), "", ""); + + if (webKitWindow && webKitWindow->GetEventHandler()) + webKitWindow->GetEventHandler()->ProcessEvent(event); +} + - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)())completionHandler