From fea23a0be44db0764937a885c2e798aaf3e3b4ed Mon Sep 17 00:00:00 2001 From: Tobias Taschner Date: Tue, 9 Feb 2021 17:52:18 +0100 Subject: [PATCH] Handle in-document navigation with wxWebViewEdge Send EVT_WEBVIEW_NAVIGATING, EVT_WEBVIEW_NAVIGATED and EVT_WEBVIEW_LOADED when an anchor is clicked within a document. This kind of navigation cannot be vetoed. Fixes: #19074 --- include/wx/msw/private/webview_edge.h | 2 ++ src/msw/webview_edge.cpp | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/wx/msw/private/webview_edge.h b/include/wx/msw/private/webview_edge.h index f5509006e6..ef89c18bae 100644 --- a/include/wx/msw/private/webview_edge.h +++ b/include/wx/msw/private/webview_edge.h @@ -41,6 +41,7 @@ public: // WebView Events tokens EventRegistrationToken m_navigationStartingToken = { }; + EventRegistrationToken m_sourceChangedToken = { }; EventRegistrationToken m_navigationCompletedToken = { }; EventRegistrationToken m_newWindowRequestedToken = { }; EventRegistrationToken m_documentTitleChangedToken = { }; @@ -48,6 +49,7 @@ public: // WebView Event handlers HRESULT OnNavigationStarting(ICoreWebView2* sender, ICoreWebView2NavigationStartingEventArgs* args); + HRESULT OnSourceChanged(ICoreWebView2* sender, ICoreWebView2SourceChangedEventArgs* args); HRESULT OnNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args); HRESULT OnNewWindowRequested(ICoreWebView2* sender, ICoreWebView2NewWindowRequestedEventArgs* args); HRESULT OnDocumentTitleChanged(ICoreWebView2* sender, IUnknown* args); diff --git a/src/msw/webview_edge.cpp b/src/msw/webview_edge.cpp index bdf8ce5b76..f2ffdea8c3 100644 --- a/src/msw/webview_edge.cpp +++ b/src/msw/webview_edge.cpp @@ -67,6 +67,7 @@ wxWebViewEdgeImpl::~wxWebViewEdgeImpl() if (m_webView) { m_webView->remove_NavigationCompleted(m_navigationCompletedToken); + m_webView->remove_SourceChanged(m_sourceChangedToken); m_webView->remove_NavigationStarting(m_navigationStartingToken); m_webView->remove_NewWindowRequested(m_newWindowRequestedToken); m_webView->remove_DocumentTitleChanged(m_documentTitleChangedToken); @@ -175,10 +176,27 @@ HRESULT wxWebViewEdgeImpl::OnNavigationStarting(ICoreWebView2* WXUNUSED(sender), return S_OK; } +HRESULT wxWebViewEdgeImpl::OnSourceChanged(ICoreWebView2 * WXUNUSED(sender), ICoreWebView2SourceChangedEventArgs * args) +{ + BOOL isNewDocument; + if (SUCCEEDED(args->get_IsNewDocument(&isNewDocument)) && !isNewDocument) + { + // navigation within the current document, send apropriate events + wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATING, m_ctrl->GetId(), m_ctrl->GetCurrentURL(), wxString()); + event.SetEventObject(m_ctrl); + m_ctrl->HandleWindowEvent(event); + OnNavigationCompleted(NULL, NULL); + OnContentLoading(NULL, NULL); + } + return S_OK; +} + HRESULT wxWebViewEdgeImpl::OnNavigationCompleted(ICoreWebView2* WXUNUSED(sender), ICoreWebView2NavigationCompletedEventArgs* args) { BOOL isSuccess; - if (FAILED(args->get_IsSuccess(&isSuccess))) + if (!args) + isSuccess = true; + else if (FAILED(args->get_IsSuccess(&isSuccess))) isSuccess = false; m_isBusy = false; wxString uri = m_ctrl->GetCurrentURL(); @@ -303,6 +321,10 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control Callback( this, &wxWebViewEdgeImpl::OnNavigationStarting).Get(), &m_navigationStartingToken); + m_webView->add_SourceChanged( + Callback( + this, &wxWebViewEdgeImpl::OnSourceChanged).Get(), + &m_sourceChangedToken); m_webView->add_NavigationCompleted( Callback( this, &wxWebViewEdgeImpl::OnNavigationCompleted).Get(),