wxWebViewEdge: Improve wxEVT_WEBVIEW_LOADED

Previously the edge event ContentLoading was used which was
triggered earlier than DOMContentLoaded. This event wasn't
available in earlier SDK versions.

Minimum required SDK version is now:
1.0.705.50 (Released 2021-01-25)

Fixes #19202

See https://github.com/wxWidgets/wxWidgets/pull/2468
This commit is contained in:
Tobias Taschner
2021-08-17 10:23:14 +02:00
committed by Vadim Zeitlin
parent 6f372ad18a
commit a756ed93c2
3 changed files with 22 additions and 14 deletions

View File

@@ -15,8 +15,8 @@
#include <WebView2.h>
#ifndef __ICoreWebView2Environment_INTERFACE_DEFINED__
#error "WebView2 SDK version 0.9.430 or newer is required"
#ifndef __ICoreWebView2_2_INTERFACE_DEFINED__
#error "WebView2 SDK version 1.0.705.50 or newer is required"
#endif
#ifndef __VISUALC__
@@ -47,7 +47,7 @@ public:
wxWebViewEdge* m_ctrl;
wxCOMPtr<ICoreWebView2Environment> m_webViewEnvironment;
wxCOMPtr<ICoreWebView2> m_webView;
wxCOMPtr<ICoreWebView2_2> m_webView;
wxCOMPtr<ICoreWebView2Controller> m_webViewController;
bool m_initialized;
@@ -66,7 +66,7 @@ public:
EventRegistrationToken m_navigationCompletedToken = { };
EventRegistrationToken m_newWindowRequestedToken = { };
EventRegistrationToken m_documentTitleChangedToken = { };
EventRegistrationToken m_contentLoadingToken = { };
EventRegistrationToken m_DOMContentLoadedToken = { };
EventRegistrationToken m_containsFullScreenElementChangedToken = { };
EventRegistrationToken m_webMessageReceivedToken = { };
@@ -76,7 +76,7 @@ public:
HRESULT OnNavigationCompleted(ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args);
HRESULT OnNewWindowRequested(ICoreWebView2* sender, ICoreWebView2NewWindowRequestedEventArgs* args);
HRESULT OnDocumentTitleChanged(ICoreWebView2* sender, IUnknown* args);
HRESULT OnContentLoading(ICoreWebView2* sender, ICoreWebView2ContentLoadingEventArgs* args);
HRESULT OnDOMContentLoaded(ICoreWebView2* sender, ICoreWebView2DOMContentLoadedEventArgs* args);
HRESULT OnContainsFullScreenElementChanged(ICoreWebView2* sender, IUnknown* args);
HRESULT OnWebMessageReceived(ICoreWebView2* sender, ICoreWebView2WebMessageReceivedEventArgs* args);
HRESULT OnAddScriptToExecuteOnDocumentedCreatedCompleted(HRESULT errorCode, LPCWSTR id);

View File

@@ -348,7 +348,7 @@ public:
- With CMake just enable @c wxUSE_WEBVIEW_EDGE
- When not using CMake:
- Download the <a href="https://aka.ms/webviewnuget">WebView2 SDK</a>
nuget package (Version 1.0.622.22 or newer)
nuget package (Version 1.0.705.50 or newer)
- Extract the package (it's a zip archive) to @c wxWidgets/3rdparty/webview2
(you should have @c 3rdparty/webview2/build/native/include/WebView2.h
file after unpacking it)

View File

@@ -74,7 +74,7 @@ wxWebViewEdgeImpl::~wxWebViewEdgeImpl()
m_webView->remove_NavigationStarting(m_navigationStartingToken);
m_webView->remove_NewWindowRequested(m_newWindowRequestedToken);
m_webView->remove_DocumentTitleChanged(m_documentTitleChangedToken);
m_webView->remove_ContentLoading(m_contentLoadingToken);
m_webView->remove_DOMContentLoaded(m_DOMContentLoadedToken);
m_webView->remove_ContainsFullScreenElementChanged(m_containsFullScreenElementChangedToken);
m_webView->remove_WebMessageReceived(m_webMessageReceivedToken);
}
@@ -203,7 +203,7 @@ HRESULT wxWebViewEdgeImpl::OnSourceChanged(ICoreWebView2 * WXUNUSED(sender), ICo
event.SetEventObject(m_ctrl);
m_ctrl->HandleWindowEvent(event);
OnNavigationCompleted(NULL, NULL);
OnContentLoading(NULL, NULL);
OnDOMContentLoaded(NULL, NULL);
}
return S_OK;
}
@@ -309,7 +309,7 @@ HRESULT wxWebViewEdgeImpl::OnDocumentTitleChanged(ICoreWebView2* WXUNUSED(sender
return S_OK;
}
HRESULT wxWebViewEdgeImpl::OnContentLoading(ICoreWebView2* WXUNUSED(sender), ICoreWebView2ContentLoadingEventArgs* WXUNUSED(args))
HRESULT wxWebViewEdgeImpl::OnDOMContentLoaded(ICoreWebView2* WXUNUSED(sender), ICoreWebView2DOMContentLoadedEventArgs* WXUNUSED(args))
{
wxWebViewEvent event(wxEVT_WEBVIEW_LOADED, m_ctrl->GetId(),
m_ctrl->GetCurrentURL(), "");
@@ -373,12 +373,20 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control
return result;
}
HRESULT hr = webViewController->get_CoreWebView2(&m_webView);
wxCOMPtr<ICoreWebView2> baseWebView;
HRESULT hr = webViewController->get_CoreWebView2(&baseWebView);
if (FAILED(hr))
{
wxLogApiError("WebView2::WebViewCreated (get_CoreWebView2)", hr);
return result;
}
hr = baseWebView->QueryInterface(IID_PPV_ARGS(&m_webView));
if (FAILED(hr))
{
wxLogApiError("WebView2::WebViewCreated (QueryInterface)", hr);
return result;
}
m_webViewController = webViewController;
m_initialized = true;
@@ -406,10 +414,10 @@ HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, ICoreWebView2Control
Callback<ICoreWebView2DocumentTitleChangedEventHandler>(
this, &wxWebViewEdgeImpl::OnDocumentTitleChanged).Get(),
&m_documentTitleChangedToken);
m_webView->add_ContentLoading(
Callback<ICoreWebView2ContentLoadingEventHandler>(
this, &wxWebViewEdgeImpl::OnContentLoading).Get(),
&m_contentLoadingToken);
m_webView->add_DOMContentLoaded(
Callback<ICoreWebView2DOMContentLoadedEventHandler>(
this, &wxWebViewEdgeImpl::OnDOMContentLoaded).Get(),
&m_DOMContentLoadedToken);
m_webView->add_ContainsFullScreenElementChanged(
Callback<ICoreWebView2ContainsFullScreenElementChangedEventHandler>(
this, &wxWebViewEdgeImpl::OnContainsFullScreenElementChanged).Get(),