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:
@@ -41,6 +41,7 @@ public:
|
|||||||
|
|
||||||
// WebView Events tokens
|
// WebView Events tokens
|
||||||
EventRegistrationToken m_navigationStartingToken = { };
|
EventRegistrationToken m_navigationStartingToken = { };
|
||||||
|
EventRegistrationToken m_sourceChangedToken = { };
|
||||||
EventRegistrationToken m_navigationCompletedToken = { };
|
EventRegistrationToken m_navigationCompletedToken = { };
|
||||||
EventRegistrationToken m_newWindowRequestedToken = { };
|
EventRegistrationToken m_newWindowRequestedToken = { };
|
||||||
EventRegistrationToken m_documentTitleChangedToken = { };
|
EventRegistrationToken m_documentTitleChangedToken = { };
|
||||||
@@ -48,6 +49,7 @@ public:
|
|||||||
|
|
||||||
// WebView Event handlers
|
// WebView Event handlers
|
||||||
HRESULT OnNavigationStarting(ICoreWebView2* sender, ICoreWebView2NavigationStartingEventArgs* args);
|
HRESULT OnNavigationStarting(ICoreWebView2* sender, ICoreWebView2NavigationStartingEventArgs* args);
|
||||||
|
HRESULT OnSourceChanged(ICoreWebView2* sender, ICoreWebView2SourceChangedEventArgs* args);
|
||||||
HRESULT OnNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args);
|
HRESULT OnNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args);
|
||||||
HRESULT OnNewWindowRequested(ICoreWebView2* sender, ICoreWebView2NewWindowRequestedEventArgs* args);
|
HRESULT OnNewWindowRequested(ICoreWebView2* sender, ICoreWebView2NewWindowRequestedEventArgs* args);
|
||||||
HRESULT OnDocumentTitleChanged(ICoreWebView2* sender, IUnknown* args);
|
HRESULT OnDocumentTitleChanged(ICoreWebView2* sender, IUnknown* args);
|
||||||
|
@@ -67,6 +67,7 @@ wxWebViewEdgeImpl::~wxWebViewEdgeImpl()
|
|||||||
if (m_webView)
|
if (m_webView)
|
||||||
{
|
{
|
||||||
m_webView->remove_NavigationCompleted(m_navigationCompletedToken);
|
m_webView->remove_NavigationCompleted(m_navigationCompletedToken);
|
||||||
|
m_webView->remove_SourceChanged(m_sourceChangedToken);
|
||||||
m_webView->remove_NavigationStarting(m_navigationStartingToken);
|
m_webView->remove_NavigationStarting(m_navigationStartingToken);
|
||||||
m_webView->remove_NewWindowRequested(m_newWindowRequestedToken);
|
m_webView->remove_NewWindowRequested(m_newWindowRequestedToken);
|
||||||
m_webView->remove_DocumentTitleChanged(m_documentTitleChangedToken);
|
m_webView->remove_DocumentTitleChanged(m_documentTitleChangedToken);
|
||||||
@@ -175,10 +176,27 @@ HRESULT wxWebViewEdgeImpl::OnNavigationStarting(ICoreWebView2* WXUNUSED(sender),
|
|||||||
return S_OK;
|
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)
|
HRESULT wxWebViewEdgeImpl::OnNavigationCompleted(ICoreWebView2* WXUNUSED(sender), ICoreWebView2NavigationCompletedEventArgs* args)
|
||||||
{
|
{
|
||||||
BOOL isSuccess;
|
BOOL isSuccess;
|
||||||
if (FAILED(args->get_IsSuccess(&isSuccess)))
|
if (!args)
|
||||||
|
isSuccess = true;
|
||||||
|
else if (FAILED(args->get_IsSuccess(&isSuccess)))
|
||||||
isSuccess = false;
|
isSuccess = false;
|
||||||
m_isBusy = false;
|
m_isBusy = false;
|
||||||
wxString uri = m_ctrl->GetCurrentURL();
|
wxString uri = m_ctrl->GetCurrentURL();
|
||||||
@@ -303,6 +321,10 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control
|
|||||||
Callback<ICoreWebView2NavigationStartingEventHandler>(
|
Callback<ICoreWebView2NavigationStartingEventHandler>(
|
||||||
this, &wxWebViewEdgeImpl::OnNavigationStarting).Get(),
|
this, &wxWebViewEdgeImpl::OnNavigationStarting).Get(),
|
||||||
&m_navigationStartingToken);
|
&m_navigationStartingToken);
|
||||||
|
m_webView->add_SourceChanged(
|
||||||
|
Callback<ICoreWebView2SourceChangedEventHandler>(
|
||||||
|
this, &wxWebViewEdgeImpl::OnSourceChanged).Get(),
|
||||||
|
&m_sourceChangedToken);
|
||||||
m_webView->add_NavigationCompleted(
|
m_webView->add_NavigationCompleted(
|
||||||
Callback<ICoreWebView2NavigationCompletedEventHandler>(
|
Callback<ICoreWebView2NavigationCompletedEventHandler>(
|
||||||
this, &wxWebViewEdgeImpl::OnNavigationCompleted).Get(),
|
this, &wxWebViewEdgeImpl::OnNavigationCompleted).Get(),
|
||||||
|
Reference in New Issue
Block a user