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
This commit is contained in:
Tobias Taschner
2021-02-09 17:52:18 +01:00
parent 7a74c0872c
commit fea23a0be4
2 changed files with 25 additions and 1 deletions

View File

@@ -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);

View File

@@ -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<ICoreWebView2NavigationStartingEventHandler>(
this, &wxWebViewEdgeImpl::OnNavigationStarting).Get(),
&m_navigationStartingToken);
m_webView->add_SourceChanged(
Callback<ICoreWebView2SourceChangedEventHandler>(
this, &wxWebViewEdgeImpl::OnSourceChanged).Get(),
&m_sourceChangedToken);
m_webView->add_NavigationCompleted(
Callback<ICoreWebView2NavigationCompletedEventHandler>(
this, &wxWebViewEdgeImpl::OnNavigationCompleted).Get(),