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

View File

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

View File

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