Move WebView2 event handling from lambdas to functions

This commit is contained in:
Tobias Taschner
2020-01-15 21:51:58 +01:00
parent bbde6e2e88
commit 964992e7ff
2 changed files with 138 additions and 135 deletions

View File

@@ -32,18 +32,24 @@ public:
bool m_isBusy; bool m_isBusy;
wxString m_pendingURL; wxString m_pendingURL;
// WebView Events tokens
EventRegistrationToken m_navigationStartingToken = { }; EventRegistrationToken m_navigationStartingToken = { };
EventRegistrationToken m_navigationCompletedToken = { }; EventRegistrationToken m_navigationCompletedToken = { };
EventRegistrationToken m_newWindowRequestedToken = { }; EventRegistrationToken m_newWindowRequestedToken = { };
EventRegistrationToken m_documentStateChangedToken = { };
// WebView Event handlers
HRESULT OnNavigationStarting(IWebView2WebView* sender, IWebView2NavigationStartingEventArgs* args);
HRESULT OnNavigationCompleted(IWebView2WebView* sender, IWebView2NavigationCompletedEventArgs* args);
HRESULT OnNewWindowRequested(IWebView2WebView* sender, IWebView2NewWindowRequestedEventArgs* args);
HRESULT OnEnvironmentCreated(HRESULT result, IWebView2Environment* environment);
HRESULT OnWebViewCreated(HRESULT result, IWebView2WebView* webview);
wxVector<wxSharedPtr<wxWebViewHistoryItem> > m_historyList; wxVector<wxSharedPtr<wxWebViewHistoryItem> > m_historyList;
int m_historyPosition; int m_historyPosition;
bool m_historyLoadingFromList; bool m_historyLoadingFromList;
bool m_historyEnabled; bool m_historyEnabled;
void InitWebViewCtrl();
void UpdateBounds(); void UpdateBounds();
IWebView2Settings2* GetSettings(); IWebView2Settings2* GetSettings();

View File

@@ -65,7 +65,6 @@ wxWebViewEdgeImpl::~wxWebViewEdgeImpl()
{ {
m_webView->remove_NavigationCompleted(m_navigationCompletedToken); m_webView->remove_NavigationCompleted(m_navigationCompletedToken);
m_webView->remove_NavigationStarting(m_navigationStartingToken); m_webView->remove_NavigationStarting(m_navigationStartingToken);
m_webView->remove_DocumentStateChanged(m_documentStateChangedToken);
m_webView->remove_NewWindowRequested(m_newWindowRequestedToken); m_webView->remove_NewWindowRequested(m_newWindowRequestedToken);
} }
} }
@@ -85,20 +84,8 @@ bool wxWebViewEdgeImpl::Create()
nullptr, nullptr,
userDataPath.wc_str(), userDataPath.wc_str(),
nullptr, nullptr,
Callback<IWebView2CreateWebView2EnvironmentCompletedHandler>( Callback<IWebView2CreateWebView2EnvironmentCompletedHandler>(this,
[this](HRESULT WXUNUSED(result), IWebView2Environment* environment) -> HRESULT &wxWebViewEdgeImpl::OnEnvironmentCreated).Get());
{
environment->QueryInterface(IID_PPV_ARGS(&m_webViewEnvironment));
m_webViewEnvironment->CreateWebView(
m_ctrl->GetHWND(), Callback<IWebView2CreateWebViewCompletedHandler>(
[this](HRESULT WXUNUSED(result), IWebView2WebView* webview) -> HRESULT
{
webview->QueryInterface(IID_PPV_ARGS(&m_webView));
InitWebViewCtrl();
return S_OK;
}).Get());
return S_OK;
}).Get());
if (FAILED(hr)) if (FAILED(hr))
{ {
wxLogApiError("CreateWebView2EnvironmentWithDetails", hr); wxLogApiError("CreateWebView2EnvironmentWithDetails", hr);
@@ -108,6 +95,17 @@ bool wxWebViewEdgeImpl::Create()
return true; return true;
} }
HRESULT wxWebViewEdgeImpl::OnEnvironmentCreated(
HRESULT WXUNUSED(result), IWebView2Environment* environment)
{
environment->QueryInterface(IID_PPV_ARGS(&m_webViewEnvironment));
m_webViewEnvironment->CreateWebView(
m_ctrl->GetHWND(),
Callback<IWebView2CreateWebViewCompletedHandler>(
this, &wxWebViewEdgeImpl::OnWebViewCreated).Get());
return S_OK;
}
bool wxWebViewEdgeImpl::Initialize() bool wxWebViewEdgeImpl::Initialize()
{ {
if (!ms_loaderDll.Load("WebView2Loader.dll", wxDL_DEFAULT | wxDL_QUIET)) if (!ms_loaderDll.Load("WebView2Loader.dll", wxDL_DEFAULT | wxDL_QUIET))
@@ -150,17 +148,8 @@ void wxWebViewEdgeImpl::UpdateBounds()
m_webView->put_Bounds(r); m_webView->put_Bounds(r);
} }
void wxWebViewEdgeImpl::InitWebViewCtrl() HRESULT wxWebViewEdgeImpl::OnNavigationStarting(IWebView2WebView* WXUNUSED(sender), IWebView2NavigationStartingEventArgs* args)
{ {
m_initialized = true;
UpdateBounds();
// Connect and handle the various WebView events
m_webView->add_NavigationStarting(
Callback<IWebView2NavigationStartingEventHandler>(
[this](IWebView2WebView* WXUNUSED(sender), IWebView2NavigationStartingEventArgs* args) -> HRESULT
{
m_isBusy = true; m_isBusy = true;
wxString evtURL; wxString evtURL;
PWSTR uri; PWSTR uri;
@@ -174,39 +163,15 @@ void wxWebViewEdgeImpl::InitWebViewCtrl()
args->put_Cancel(true); args->put_Cancel(true);
return S_OK; return S_OK;
}) }
.Get(), &m_navigationStartingToken);
m_webView->add_DocumentStateChanged( HRESULT wxWebViewEdgeImpl::OnNavigationCompleted(IWebView2WebView* WXUNUSED(sender), IWebView2NavigationCompletedEventArgs* args)
Callback<IWebView2DocumentStateChangedEventHandler>( {
[this](IWebView2WebView* sender, IWebView2DocumentStateChangedEventArgs* WXUNUSED(args)) -> HRESULT
{
PWSTR uri;
sender->get_Source(&uri);
wxString evtURL(uri);
if (evtURL.Cmp(L"about:blank") == 0)
{
evtURL = L"";
}
// AddPendingEvent(wxWebViewEvent(wxEVT_WEBVIEW_NAVIGATED, GetId(), uri, wxString()));
// SetWindowText(m_toolbar->addressBarWindow, uri.get());
return S_OK;
})
.Get(),
&m_documentStateChangedToken);
m_webView->add_NavigationCompleted(
Callback<IWebView2NavigationCompletedEventHandler>(
[this](IWebView2WebView* sender, IWebView2NavigationCompletedEventArgs* args) -> HRESULT
{
BOOL isSuccess; BOOL isSuccess;
if (FAILED(args->get_IsSuccess(&isSuccess))) if (FAILED(args->get_IsSuccess(&isSuccess)))
isSuccess = false; isSuccess = false;
m_isBusy = false; m_isBusy = false;
PWSTR _uri; wxString uri = m_ctrl->GetCurrentURL();
sender->get_Source(&_uri);
wxString uri(_uri);
if (!isSuccess) if (!isSuccess)
{ {
@@ -264,12 +229,10 @@ void wxWebViewEdgeImpl::InitWebViewCtrl()
m_historyLoadingFromList = false; m_historyLoadingFromList = false;
} }
return S_OK; return S_OK;
}) }
.Get(), &m_navigationCompletedToken);
m_webView->add_NewWindowRequested( HRESULT wxWebViewEdgeImpl::OnNewWindowRequested(IWebView2WebView* WXUNUSED(sender), IWebView2NewWindowRequestedEventArgs* args)
Callback<IWebView2NewWindowRequestedEventHandler>( {
[this](IWebView2WebView* WXUNUSED(sender), IWebView2NewWindowRequestedEventArgs* args) -> HRESULT
{
PWSTR uri; PWSTR uri;
args->get_Uri(&uri); args->get_Uri(&uri);
wxString evtURL(uri); wxString evtURL(uri);
@@ -277,8 +240,42 @@ void wxWebViewEdgeImpl::InitWebViewCtrl()
m_ctrl->HandleWindowEvent(evt); m_ctrl->HandleWindowEvent(evt);
args->put_Handled(true); args->put_Handled(true);
return S_OK; return S_OK;
}).Get(), &m_newWindowRequestedToken); }
HRESULT wxWebViewEdgeImpl::OnWebViewCreated(HRESULT result, IWebView2WebView* webview)
{
if (FAILED(result))
{
wxLogApiError("WebView2::WebViewCreated", result);
return result;
}
webview->QueryInterface(IID_PPV_ARGS(&m_webView));
m_initialized = true;
UpdateBounds();
// Connect and handle the various WebView events
m_webView->add_NavigationStarting(
Callback<IWebView2NavigationStartingEventHandler>(
this, &wxWebViewEdgeImpl::OnNavigationStarting).Get(),
&m_navigationStartingToken);
m_webView->add_NavigationCompleted(
Callback<IWebView2NavigationCompletedEventHandler>(
this, &wxWebViewEdgeImpl::OnNavigationCompleted).Get(),
&m_navigationCompletedToken);
m_webView->add_NewWindowRequested(
Callback<IWebView2NewWindowRequestedEventHandler>(
this, &wxWebViewEdgeImpl::OnNewWindowRequested).Get(),
&m_newWindowRequestedToken);
if (!m_pendingURL.empty())
{
m_ctrl->LoadURL(m_pendingURL); m_ctrl->LoadURL(m_pendingURL);
m_pendingURL.clear();
}
return S_OK;
} }
IWebView2Settings2* wxWebViewEdgeImpl::GetSettings() IWebView2Settings2* wxWebViewEdgeImpl::GetSettings()