Skip to content

Commit 9501cf6

Browse files
authored
Move project to use latest WebView2 SDK 0.9.430 (#8)
* Update WebView2 sdk to 0.9.430 * Revert "Add arm64 config" This reverts commit 7f16c08. * Update minimum browser version * Rename m_contentReceiver to m_securityStateChangedReceiver
1 parent 1a27038 commit 9501cf6

File tree

8 files changed

+205
-234
lines changed

8 files changed

+205
-234
lines changed

BrowserWindow.cpp

Lines changed: 61 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,9 @@ BOOL BrowserWindow::InitInstance(HINSTANCE hInstance, int nCmdShow)
186186
// tabs will be created from this environment and kept isolated from the
187187
// browser UI. This enviroment is created first so the UI can request new
188188
// tabs when it's ready.
189-
HRESULT hr = CreateWebView2EnvironmentWithDetails(nullptr, userDataDirectory.c_str(),
190-
L"", Callback<IWebView2CreateWebView2EnvironmentCompletedHandler>(
191-
[this](HRESULT result, IWebView2Environment* env) -> HRESULT
189+
HRESULT hr = CreateCoreWebView2EnvironmentWithDetails(nullptr, userDataDirectory.c_str(),
190+
L"", Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>(
191+
[this](HRESULT result, ICoreWebView2Environment* env) -> HRESULT
192192
{
193193
RETURN_IF_FAILED(result);
194194

@@ -220,9 +220,9 @@ HRESULT BrowserWindow::InitUIWebViews()
220220

221221
// Create WebView environment for browser UI. A separate data directory is
222222
// used to isolate the browser UI from web content requested by the user.
223-
return CreateWebView2EnvironmentWithDetails(nullptr, browserDataDirectory.c_str(),
224-
L"", Callback<IWebView2CreateWebView2EnvironmentCompletedHandler>(
225-
[this](HRESULT result, IWebView2Environment* env) -> HRESULT
223+
return CreateCoreWebView2EnvironmentWithDetails(nullptr, browserDataDirectory.c_str(),
224+
L"", Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>(
225+
[this](HRESULT result, ICoreWebView2Environment* env) -> HRESULT
226226
{
227227
// Environment is ready, create the WebView
228228
m_uiEnv = env;
@@ -236,26 +236,26 @@ HRESULT BrowserWindow::InitUIWebViews()
236236

237237
HRESULT BrowserWindow::CreateBrowserControlsWebView()
238238
{
239-
return m_uiEnv->CreateWebView(m_hWnd, Callback<IWebView2CreateWebViewCompletedHandler>(
240-
[this](HRESULT result, IWebView2WebView* webview) -> HRESULT
239+
return m_uiEnv->CreateCoreWebView2Host(m_hWnd, Callback<ICoreWebView2CreateCoreWebView2HostCompletedHandler>(
240+
[this](HRESULT result, ICoreWebView2Host* host) -> HRESULT
241241
{
242242
if (!SUCCEEDED(result))
243243
{
244244
OutputDebugString(L"Controls WebView creation failed\n");
245245
return result;
246246
}
247247
// WebView created
248-
m_controlsWebView = webview;
248+
m_controlsHost = host;
249+
CheckFailure(m_controlsHost->get_CoreWebView2(&m_controlsWebView), L"");
249250

250-
wil::com_ptr<IWebView2Settings> settings;
251+
wil::com_ptr<ICoreWebView2Settings> settings;
251252
RETURN_IF_FAILED(m_controlsWebView->get_Settings(&settings));
252253
RETURN_IF_FAILED(settings->put_AreDevToolsEnabled(FALSE));
253-
RETURN_IF_FAILED(settings->put_IsFullscreenAllowed(FALSE));
254254

255-
RETURN_IF_FAILED(m_controlsWebView->add_ZoomFactorChanged(Callback<IWebView2ZoomFactorChangedEventHandler>(
256-
[](IWebView2WebView* webview, IUnknown* args) -> HRESULT
255+
RETURN_IF_FAILED(m_controlsHost->add_ZoomFactorChanged(Callback<ICoreWebView2ZoomFactorChangedEventHandler>(
256+
[](ICoreWebView2Host* host, IUnknown* args) -> HRESULT
257257
{
258-
webview->put_ZoomFactor(1.0);
258+
host->put_ZoomFactor(1.0);
259259
return S_OK;
260260
}
261261
).Get(), &m_controlsZoomToken));
@@ -272,37 +272,37 @@ HRESULT BrowserWindow::CreateBrowserControlsWebView()
272272

273273
HRESULT BrowserWindow::CreateBrowserOptionsWebView()
274274
{
275-
return m_uiEnv->CreateWebView(m_hWnd, Callback<IWebView2CreateWebViewCompletedHandler>(
276-
[this](HRESULT result, IWebView2WebView* webview) -> HRESULT
275+
return m_uiEnv->CreateCoreWebView2Host(m_hWnd, Callback<ICoreWebView2CreateCoreWebView2HostCompletedHandler>(
276+
[this](HRESULT result, ICoreWebView2Host* host) -> HRESULT
277277
{
278278
if (!SUCCEEDED(result))
279279
{
280280
OutputDebugString(L"Options WebView creation failed\n");
281281
return result;
282282
}
283283
// WebView created
284-
m_optionsWebView = webview;
284+
m_optionsHost = host;
285+
CheckFailure(m_optionsHost->get_CoreWebView2(&m_optionsWebView), L"");
285286

286-
wil::com_ptr<IWebView2Settings> settings;
287+
wil::com_ptr<ICoreWebView2Settings> settings;
287288
RETURN_IF_FAILED(m_optionsWebView->get_Settings(&settings));
288289
RETURN_IF_FAILED(settings->put_AreDevToolsEnabled(FALSE));
289-
RETURN_IF_FAILED(settings->put_IsFullscreenAllowed(FALSE));
290290

291-
RETURN_IF_FAILED(m_optionsWebView->add_ZoomFactorChanged(Callback<IWebView2ZoomFactorChangedEventHandler>(
292-
[](IWebView2WebView* webview, IUnknown* args) -> HRESULT
291+
RETURN_IF_FAILED(m_optionsHost->add_ZoomFactorChanged(Callback<ICoreWebView2ZoomFactorChangedEventHandler>(
292+
[](ICoreWebView2Host* host, IUnknown* args) -> HRESULT
293293
{
294-
webview->put_ZoomFactor(1.0);
294+
host->put_ZoomFactor(1.0);
295295
return S_OK;
296296
}
297297
).Get(), &m_optionsZoomToken));
298298

299299
// Hide by default
300-
RETURN_IF_FAILED(m_optionsWebView->put_IsVisible(FALSE));
300+
RETURN_IF_FAILED(m_optionsHost->put_IsVisible(FALSE));
301301
RETURN_IF_FAILED(m_optionsWebView->add_WebMessageReceived(m_uiMessageBroker.Get(), &m_optionsUIMessageBrokerToken));
302302

303303
// Hide menu when focus is lost
304-
RETURN_IF_FAILED(m_optionsWebView->add_LostFocus(Callback<IWebView2FocusChangedEventHandler>(
305-
[this](IWebView2WebView* sender, IUnknown* args) -> HRESULT
304+
RETURN_IF_FAILED(m_optionsHost->add_LostFocus(Callback<ICoreWebView2FocusChangedEventHandler>(
305+
[this](ICoreWebView2Host* sender, IUnknown* args) -> HRESULT
306306
{
307307
web::json::value jsonObj = web::json::value::parse(L"{}");
308308
jsonObj[L"message"] = web::json::value(MG_OPTIONS_LOST_FOCUS);
@@ -326,8 +326,8 @@ HRESULT BrowserWindow::CreateBrowserOptionsWebView()
326326
// Lambda is used to capture the instance while satisfying Microsoft::WRL::Callback<T>()
327327
void BrowserWindow::SetUIMessageBroker()
328328
{
329-
m_uiMessageBroker = Callback<IWebView2WebMessageReceivedEventHandler>(
330-
[this](IWebView2WebView* webview, IWebView2WebMessageReceivedEventArgs* eventArgs) -> HRESULT
329+
m_uiMessageBroker = Callback<ICoreWebView2WebMessageReceivedEventHandler>(
330+
[this](ICoreWebView2* webview, ICoreWebView2WebMessageReceivedEventArgs* eventArgs) -> HRESULT
331331
{
332332
wil::unique_cotaskmem_string jsonString;
333333
CheckFailure(eventArgs->get_WebMessageAsJson(&jsonString), L""); // Get the message from the UI WebView as JSON formatted string
@@ -363,7 +363,7 @@ void BrowserWindow::SetUIMessageBroker()
363363
}
364364
else
365365
{
366-
m_tabs.at(id)->m_contentWebView->Close();
366+
m_tabs.at(id)->m_contentHost->Close();
367367
it->second = std::move(newTab);
368368
}
369369
}
@@ -428,7 +428,7 @@ void BrowserWindow::SetUIMessageBroker()
428428
case MG_CLOSE_TAB:
429429
{
430430
size_t id = args.at(L"tabId").as_number().to_uint32();
431-
m_tabs.at(id)->m_contentWebView->Close();
431+
m_tabs.at(id)->m_contentHost->Close();
432432
m_tabs.erase(id);
433433
}
434434
break;
@@ -439,18 +439,18 @@ void BrowserWindow::SetUIMessageBroker()
439439
break;
440440
case MG_SHOW_OPTIONS:
441441
{
442-
CheckFailure(m_optionsWebView->put_IsVisible(TRUE), L"");
443-
m_optionsWebView->MoveFocus(WEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC);
442+
CheckFailure(m_optionsHost->put_IsVisible(TRUE), L"");
443+
m_optionsHost->MoveFocus(CORE_WEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC);
444444
}
445445
break;
446446
case MG_HIDE_OPTIONS:
447447
{
448-
CheckFailure(m_optionsWebView->put_IsVisible(FALSE), L"Something went wrong when trying to close the options dropdown.");
448+
CheckFailure(m_optionsHost->put_IsVisible(FALSE), L"Something went wrong when trying to close the options dropdown.");
449449
}
450450
break;
451451
case MG_OPTION_SELECTED:
452452
{
453-
m_tabs.at(m_activeTabId)->m_contentWebView->MoveFocus(WEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC);
453+
m_tabs.at(m_activeTabId)->m_contentHost->MoveFocus(CORE_WEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC);
454454
}
455455
break;
456456
case MG_GET_FAVORITES:
@@ -480,18 +480,18 @@ HRESULT BrowserWindow::SwitchToTab(size_t tabId)
480480
size_t previousActiveTab = m_activeTabId;
481481

482482
RETURN_IF_FAILED(m_tabs.at(tabId)->ResizeWebView());
483-
RETURN_IF_FAILED(m_tabs.at(tabId)->m_contentWebView->put_IsVisible(TRUE));
483+
RETURN_IF_FAILED(m_tabs.at(tabId)->m_contentHost->put_IsVisible(TRUE));
484484
m_activeTabId = tabId;
485485

486486
if (previousActiveTab != INVALID_TAB_ID && previousActiveTab != m_activeTabId)
487487
{
488-
RETURN_IF_FAILED(m_tabs.at(previousActiveTab)->m_contentWebView->put_IsVisible(FALSE));
488+
RETURN_IF_FAILED(m_tabs.at(previousActiveTab)->m_contentHost->put_IsVisible(FALSE));
489489
}
490490

491491
return S_OK;
492492
}
493493

494-
HRESULT BrowserWindow::HandleTabURIUpdate(size_t tabId, IWebView2WebView* webview)
494+
HRESULT BrowserWindow::HandleTabURIUpdate(size_t tabId, ICoreWebView2* webview)
495495
{
496496
wil::unique_cotaskmem_string source;
497497
RETURN_IF_FAILED(webview->get_Source(&source));
@@ -520,6 +520,22 @@ HRESULT BrowserWindow::HandleTabURIUpdate(size_t tabId, IWebView2WebView* webvie
520520
jsonObj[L"args"][L"uriToShow"] = web::json::value(L"browser://history");
521521
}
522522

523+
RETURN_IF_FAILED(PostJsonToWebView(jsonObj, m_controlsWebView.Get()));
524+
525+
return S_OK;
526+
}
527+
528+
HRESULT BrowserWindow::HandleTabHistoryUpdate(size_t tabId, ICoreWebView2* webview)
529+
{
530+
wil::unique_cotaskmem_string source;
531+
RETURN_IF_FAILED(webview->get_Source(&source));
532+
533+
web::json::value jsonObj = web::json::value::parse(L"{}");
534+
jsonObj[L"message"] = web::json::value(MG_UPDATE_URI);
535+
jsonObj[L"args"] = web::json::value::parse(L"{}");
536+
jsonObj[L"args"][L"tabId"] = web::json::value::number(tabId);
537+
jsonObj[L"args"][L"uri"] = web::json::value(source.get());
538+
523539
BOOL canGoForward = FALSE;
524540
RETURN_IF_FAILED(webview->get_CanGoForward(&canGoForward));
525541
jsonObj[L"args"][L"canGoForward"] = web::json::value::boolean(canGoForward);
@@ -533,7 +549,7 @@ HRESULT BrowserWindow::HandleTabURIUpdate(size_t tabId, IWebView2WebView* webvie
533549
return S_OK;
534550
}
535551

536-
HRESULT BrowserWindow::HandleTabNavStarting(size_t tabId, IWebView2WebView* webview)
552+
HRESULT BrowserWindow::HandleTabNavStarting(size_t tabId, ICoreWebView2* webview)
537553
{
538554
web::json::value jsonObj = web::json::value::parse(L"{}");
539555
jsonObj[L"message"] = web::json::value(MG_NAV_STARTING);
@@ -543,7 +559,7 @@ HRESULT BrowserWindow::HandleTabNavStarting(size_t tabId, IWebView2WebView* webv
543559
return PostJsonToWebView(jsonObj, m_controlsWebView.Get());
544560
}
545561

546-
HRESULT BrowserWindow::HandleTabNavCompleted(size_t tabId, IWebView2WebView* webview, IWebView2NavigationCompletedEventArgs* args)
562+
HRESULT BrowserWindow::HandleTabNavCompleted(size_t tabId, ICoreWebView2* webview, ICoreWebView2NavigationCompletedEventArgs* args)
547563
{
548564
std::wstring getTitleScript(
549565
// Look for a title tag
@@ -602,7 +618,7 @@ HRESULT BrowserWindow::HandleTabNavCompleted(size_t tabId, IWebView2WebView* web
602618
L"})();"
603619
);
604620

605-
CheckFailure(webview->ExecuteScript(getTitleScript.c_str(), Callback<IWebView2ExecuteScriptCompletedHandler>(
621+
CheckFailure(webview->ExecuteScript(getTitleScript.c_str(), Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
606622
[this, tabId](HRESULT error, PCWSTR result) -> HRESULT
607623
{
608624
RETURN_IF_FAILED(error);
@@ -617,7 +633,7 @@ HRESULT BrowserWindow::HandleTabNavCompleted(size_t tabId, IWebView2WebView* web
617633
return S_OK;
618634
}).Get()), L"Can't update title.");
619635

620-
CheckFailure(webview->ExecuteScript(getFaviconURI.c_str(), Callback<IWebView2ExecuteScriptCompletedHandler>(
636+
CheckFailure(webview->ExecuteScript(getFaviconURI.c_str(), Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
621637
[this, tabId](HRESULT error, PCWSTR result) -> HRESULT
622638
{
623639
RETURN_IF_FAILED(error);
@@ -646,7 +662,7 @@ HRESULT BrowserWindow::HandleTabNavCompleted(size_t tabId, IWebView2WebView* web
646662
return PostJsonToWebView(jsonObj, m_controlsWebView.Get());
647663
}
648664

649-
HRESULT BrowserWindow::HandleTabSecurityUpdate(size_t tabId, IWebView2WebView* webview, IWebView2DevToolsProtocolEventReceivedEventArgs* args)
665+
HRESULT BrowserWindow::HandleTabSecurityUpdate(size_t tabId, ICoreWebView2* webview, ICoreWebView2DevToolsProtocolEventReceivedEventArgs* args)
650666
{
651667
wil::unique_cotaskmem_string jsonArgs;
652668
RETURN_IF_FAILED(args->get_ParameterObjectAsJson(&jsonArgs));
@@ -669,7 +685,7 @@ void BrowserWindow::HandleTabCreated(size_t tabId, bool shouldBeActive)
669685
}
670686
}
671687

672-
HRESULT BrowserWindow::HandleTabMessageReceived(size_t tabId, IWebView2WebView* webview, IWebView2WebMessageReceivedEventArgs* eventArgs)
688+
HRESULT BrowserWindow::HandleTabMessageReceived(size_t tabId, ICoreWebView2* webview, ICoreWebView2WebMessageReceivedEventArgs* eventArgs)
673689
{
674690
wil::unique_cotaskmem_string jsonString;
675691
RETURN_IF_FAILED(eventArgs->get_WebMessageAsJson(&jsonString));
@@ -808,7 +824,7 @@ HRESULT BrowserWindow::ResizeUIWebViews()
808824
bounds.bottom = bounds.top + GetDPIAwareBound(c_uiBarHeight);
809825
bounds.bottom += 1;
810826

811-
RETURN_IF_FAILED(m_controlsWebView->put_Bounds(bounds));
827+
RETURN_IF_FAILED(m_controlsHost->put_Bounds(bounds));
812828
}
813829

814830
if (m_optionsWebView != nullptr)
@@ -819,7 +835,7 @@ HRESULT BrowserWindow::ResizeUIWebViews()
819835
bounds.bottom = bounds.top + GetDPIAwareBound(c_optionsDropdownHeight);
820836
bounds.left = bounds.right - GetDPIAwareBound(c_optionsDropdownWidth);
821837

822-
RETURN_IF_FAILED(m_optionsWebView->put_Bounds(bounds));
838+
RETURN_IF_FAILED(m_optionsHost->put_Bounds(bounds));
823839
}
824840

825841
// Workaround for black controls WebView issue in Windows 7
@@ -922,7 +938,7 @@ std::wstring BrowserWindow::GetFilePathAsURI(std::wstring fullPath)
922938
return fileURI;
923939
}
924940

925-
HRESULT BrowserWindow::PostJsonToWebView(web::json::value jsonObj, IWebView2WebView* webview)
941+
HRESULT BrowserWindow::PostJsonToWebView(web::json::value jsonObj, ICoreWebView2* webview)
926942
{
927943
utility::stringstream_t stream;
928944
jsonObj.serialize(stream);

BrowserWindow.h

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@ class BrowserWindow
2121
static BOOL LaunchWindow(_In_ HINSTANCE hInstance, _In_ int nCmdShow);
2222
static std::wstring GetAppDataDirectory();
2323
std::wstring GetFullPathFor(LPCWSTR relativePath);
24-
HRESULT HandleTabURIUpdate(size_t tabId, IWebView2WebView* webview);
25-
HRESULT HandleTabNavStarting(size_t tabId, IWebView2WebView* webview);
26-
HRESULT HandleTabNavCompleted(size_t tabId, IWebView2WebView* webview, IWebView2NavigationCompletedEventArgs* args);
27-
HRESULT HandleTabSecurityUpdate(size_t tabId, IWebView2WebView* webview, IWebView2DevToolsProtocolEventReceivedEventArgs* args);
24+
HRESULT HandleTabURIUpdate(size_t tabId, ICoreWebView2* webview);
25+
HRESULT HandleTabHistoryUpdate(size_t tabId, ICoreWebView2* webview);
26+
HRESULT HandleTabNavStarting(size_t tabId, ICoreWebView2* webview);
27+
HRESULT HandleTabNavCompleted(size_t tabId, ICoreWebView2* webview, ICoreWebView2NavigationCompletedEventArgs* args);
28+
HRESULT HandleTabSecurityUpdate(size_t tabId, ICoreWebView2* webview, ICoreWebView2DevToolsProtocolEventReceivedEventArgs* args);
2829
void HandleTabCreated(size_t tabId, bool shouldBeActive);
29-
HRESULT HandleTabMessageReceived(size_t tabId, IWebView2WebView* webview, IWebView2WebMessageReceivedEventArgs* eventArgs);
30+
HRESULT HandleTabMessageReceived(size_t tabId, ICoreWebView2* webview, ICoreWebView2WebMessageReceivedEventArgs* eventArgs);
3031
int GetDPIAwareBound(int bound);
3132
static void CheckFailure(HRESULT hr, LPCWSTR errorMessage);
3233
protected:
@@ -39,10 +40,12 @@ class BrowserWindow
3940
int m_minWindowWidth = 0;
4041
int m_minWindowHeight = 0;
4142

42-
Microsoft::WRL::ComPtr<IWebView2Environment> m_uiEnv;
43-
Microsoft::WRL::ComPtr<IWebView2Environment> m_contentEnv;
44-
Microsoft::WRL::ComPtr<IWebView2WebView> m_controlsWebView;
45-
Microsoft::WRL::ComPtr<IWebView2WebView> m_optionsWebView;
43+
Microsoft::WRL::ComPtr<ICoreWebView2Environment> m_uiEnv;
44+
Microsoft::WRL::ComPtr<ICoreWebView2Environment> m_contentEnv;
45+
Microsoft::WRL::ComPtr<ICoreWebView2Host> m_controlsHost;
46+
Microsoft::WRL::ComPtr<ICoreWebView2Host> m_optionsHost;
47+
Microsoft::WRL::ComPtr<ICoreWebView2> m_controlsWebView;
48+
Microsoft::WRL::ComPtr<ICoreWebView2> m_optionsWebView;
4649
std::map<size_t,std::unique_ptr<Tab>> m_tabs;
4750
size_t m_activeTabId = 0;
4851

@@ -51,7 +54,7 @@ class BrowserWindow
5154
EventRegistrationToken m_optionsUIMessageBrokerToken = {}; // Token for the UI message handler in options WebView
5255
EventRegistrationToken m_optionsZoomToken = {};
5356
EventRegistrationToken m_lostOptionsFocus = {}; // Token for the lost focus handler in options WebView
54-
Microsoft::WRL::ComPtr<IWebView2WebMessageReceivedEventHandler> m_uiMessageBroker;
57+
Microsoft::WRL::ComPtr<ICoreWebView2WebMessageReceivedEventHandler> m_uiMessageBroker;
5558

5659
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
5760
HRESULT InitUIWebViews();
@@ -65,7 +68,7 @@ class BrowserWindow
6568
void SetUIMessageBroker();
6669
HRESULT ResizeUIWebViews();
6770
void UpdateMinWindowSize();
68-
HRESULT PostJsonToWebView(web::json::value jsonObj, IWebView2WebView* webview);
71+
HRESULT PostJsonToWebView(web::json::value jsonObj, ICoreWebView2* webview);
6972
HRESULT SwitchToTab(size_t tabId);
7073
std::wstring GetFilePathAsURI(std::wstring fullPath);
7174
};

0 commit comments

Comments
 (0)