Skip to content

Commit e38720f

Browse files
authored
Merge pull request #292 from MicrosoftEdge/smoketest/1.0.3848-testing
Smoketest/1.0.3848 testing
2 parents f28213f + 22f350d commit e38720f

File tree

10 files changed

+336
-33
lines changed

10 files changed

+336
-33
lines changed

SampleApps/WebView2APISample/AppWindow.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@
3535
#include "ScenarioCustomDownloadExperience.h"
3636
#include "ScenarioCustomScheme.h"
3737
#include "ScenarioCustomSchemeNavigate.h"
38-
#include "ScenarioDefaultBackgroundColor.h"
3938
#include "ScenarioDOMContentLoaded.h"
39+
#include "ScenarioDedicatedWorker.h"
40+
#include "ScenarioDedicatedWorkerPostMessage.h"
41+
#include "ScenarioDefaultBackgroundColor.h"
4042
#include "ScenarioDragDrop.h"
4143
#include "ScenarioDragDropOverride.h"
4244
#include "ScenarioExtensionsManagement.h"
@@ -47,10 +49,9 @@
4749
#include "ScenarioNonClientRegionSupport.h"
4850
#include "ScenarioNotificationReceived.h"
4951
#include "ScenarioPermissionManagement.h"
50-
#include "ScenarioDedicatedWorker.h"
51-
#include "ScenarioDedicatedWorkerPostMessage.h"
5252
#include "ScenarioServiceWorkerManager.h"
5353
#include "ScenarioServiceWorkerPostMessage.h"
54+
#include "ScenarioServiceWorkerPostMessageSetting.h"
5455
#include "ScenarioSharedWorkerManager.h"
5556
#include "ScenarioSaveAs.h"
5657
#include "ScenarioScreenCapture.h"
@@ -821,6 +822,17 @@ bool AppWindow::ExecuteWebViewCommands(WPARAM wParam, LPARAM lParam)
821822
worker_manager->GetAllSharedWorkers();
822823
return true;
823824
}
825+
case IDM_TOGGLE_SERVICE_WORKER_JS_API_SETTING:
826+
{
827+
auto component = GetComponent<ScenarioServiceWorkerPostMessageSetting>();
828+
if (!component)
829+
{
830+
NewComponent<ScenarioServiceWorkerPostMessageSetting>(this);
831+
component = GetComponent<ScenarioServiceWorkerPostMessageSetting>();
832+
}
833+
component->ToggleServiceWorkerJsApiSetting();
834+
return true;
835+
}
824836
case IDM_SCENARIO_SCREEN_CAPTURE:
825837
{
826838
NewComponent<ScenarioScreenCapture>(this);
Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
// Copyright (C) Microsoft Corporation. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
#include "stdafx.h"
5+
#include <sstream>
6+
7+
#include "CheckFailure.h"
8+
9+
#include "ScenarioServiceWorkerPostMessageSetting.h"
10+
11+
using namespace Microsoft::WRL;
12+
13+
static constexpr WCHAR c_samplePath[] = L"scenario_sw_post_msg_scope/index2.html";
14+
15+
ScenarioServiceWorkerPostMessageSetting::ScenarioServiceWorkerPostMessageSetting(
16+
AppWindow* appWindow)
17+
: m_appWindow(appWindow), m_webView(appWindow->GetWebView())
18+
{
19+
SetupEventsOnWebview();
20+
}
21+
22+
ScenarioServiceWorkerPostMessageSetting::~ScenarioServiceWorkerPostMessageSetting()
23+
{
24+
UnregisterAllServiceWorkers();
25+
m_webView->remove_ContentLoading(m_contentLoadingToken);
26+
m_webView->remove_WebMessageReceived(m_webMessageReceivedToken);
27+
if (m_serviceWorkerManager)
28+
{
29+
m_serviceWorkerManager->remove_ServiceWorkerRegistered(m_serviceWorkerRegisteredToken);
30+
}
31+
}
32+
33+
void ScenarioServiceWorkerPostMessageSetting::UnregisterAllServiceWorkers()
34+
{
35+
m_webView->ExecuteScript(
36+
L"navigator.serviceWorker.getRegistrations().then(function(registrations) {"
37+
L" for(let registration of registrations) {"
38+
L" registration.unregister();"
39+
L" }"
40+
L"});",
41+
nullptr);
42+
}
43+
44+
void ScenarioServiceWorkerPostMessageSetting::ToggleServiceWorkerJsApiSetting()
45+
{
46+
// Unregister all the existing service workers before toggling the setting.
47+
// So that the setting can be applied to new service workers.
48+
UnregisterAllServiceWorkers();
49+
auto webView2_13 = m_webView.try_query<ICoreWebView2_13>();
50+
CHECK_FEATURE_RETURN_EMPTY(webView2_13);
51+
52+
wil::com_ptr<ICoreWebView2Profile> webView2Profile;
53+
CHECK_FAILURE(webView2_13->get_Profile(&webView2Profile));
54+
auto webViewExperimentalProfile15 =
55+
webView2Profile.try_query<ICoreWebView2ExperimentalProfile15>();
56+
57+
if (webViewExperimentalProfile15)
58+
{
59+
BOOL isEnabled;
60+
//! [AreWebViewScriptApisEnabledForServiceWorkers]
61+
CHECK_FAILURE(
62+
webViewExperimentalProfile15->get_AreWebViewScriptApisEnabledForServiceWorkers(
63+
&isEnabled));
64+
CHECK_FAILURE(
65+
webViewExperimentalProfile15->put_AreWebViewScriptApisEnabledForServiceWorkers(
66+
!isEnabled));
67+
//! [AreWebViewScriptApisEnabledForServiceWorkers]
68+
69+
MessageBox(
70+
nullptr,
71+
(std::wstring(L"Service Worker JS API setting has been ") +
72+
(!isEnabled ? L"enabled." : L"disabled."))
73+
.c_str(),
74+
L"Service Worker JS API Setting", MB_OK);
75+
}
76+
77+
// Setup events on webview2 to listen message from service worker
78+
// main thread.
79+
m_sampleUri = m_appWindow->GetLocalUri(c_samplePath);
80+
CHECK_FAILURE(m_webView->Navigate(m_sampleUri.c_str()));
81+
}
82+
83+
void ScenarioServiceWorkerPostMessageSetting::SetupEventsOnWebview()
84+
{
85+
86+
// Turn off this scenario if we navigate away from the sample page.
87+
CHECK_FAILURE(m_webView->add_ContentLoading(
88+
Callback<ICoreWebView2ContentLoadingEventHandler>(
89+
[this](ICoreWebView2* sender, ICoreWebView2ContentLoadingEventArgs* args) -> HRESULT
90+
{
91+
wil::unique_cotaskmem_string uri;
92+
sender->get_Source(&uri);
93+
if (uri.get() != m_sampleUri)
94+
{
95+
m_appWindow->DeleteComponent(this);
96+
}
97+
return S_OK;
98+
})
99+
.Get(),
100+
&m_contentLoadingToken));
101+
102+
// Setup WebMessageReceived event to receive message from main thread.
103+
m_webView->add_WebMessageReceived(
104+
Callback<ICoreWebView2WebMessageReceivedEventHandler>(
105+
[this](ICoreWebView2* sender, ICoreWebView2WebMessageReceivedEventArgs* args)
106+
-> HRESULT
107+
{
108+
wil::unique_cotaskmem_string message;
109+
CHECK_FAILURE(args->TryGetWebMessageAsString(&message));
110+
111+
std::wstring msgStr = message.get();
112+
if (msgStr == L"MessageFromMainThread")
113+
{
114+
std::wstringstream message{};
115+
message << L"Message: " << std::endl
116+
<< L"Service Worker Message from Main thread. Service worker "
117+
L"direct messaging disabled."
118+
<< std::endl;
119+
m_appWindow->AsyncMessageBox(message.str(), L"Message from Service Worker");
120+
}
121+
return S_OK;
122+
})
123+
.Get(),
124+
&m_webMessageReceivedToken);
125+
126+
// Get ServiceWorkerManager from profile and setup events to listen to service worker post
127+
// messages.
128+
auto webView2_13 = m_webView.try_query<ICoreWebView2_13>();
129+
CHECK_FEATURE_RETURN_EMPTY(webView2_13);
130+
131+
wil::com_ptr<ICoreWebView2Profile> webView2Profile;
132+
CHECK_FAILURE(webView2_13->get_Profile(&webView2Profile));
133+
auto webViewExperimentalProfile13 =
134+
webView2Profile.try_query<ICoreWebView2ExperimentalProfile13>();
135+
CHECK_FEATURE_RETURN_EMPTY(webViewExperimentalProfile13);
136+
CHECK_FAILURE(
137+
webViewExperimentalProfile13->get_ServiceWorkerManager(&m_serviceWorkerManager));
138+
139+
CHECK_FAILURE(m_serviceWorkerManager->add_ServiceWorkerRegistered(
140+
Callback<ICoreWebView2ExperimentalServiceWorkerRegisteredEventHandler>(
141+
[this](
142+
ICoreWebView2ExperimentalServiceWorkerManager* sender,
143+
ICoreWebView2ExperimentalServiceWorkerRegisteredEventArgs* args)
144+
{
145+
wil::com_ptr<ICoreWebView2ExperimentalServiceWorkerRegistration>
146+
serviceWorkerRegistration;
147+
CHECK_FAILURE(args->get_ServiceWorkerRegistration(&serviceWorkerRegistration));
148+
149+
if (serviceWorkerRegistration)
150+
{
151+
wil::com_ptr<ICoreWebView2ExperimentalServiceWorker> serviceWorker;
152+
CHECK_FAILURE(
153+
serviceWorkerRegistration->get_ActiveServiceWorker(&serviceWorker));
154+
155+
if (serviceWorker)
156+
{
157+
SetupEventsOnServiceWorker(serviceWorker);
158+
}
159+
else
160+
{
161+
CHECK_FAILURE(serviceWorkerRegistration->add_ServiceWorkerActivated(
162+
Callback<
163+
ICoreWebView2ExperimentalServiceWorkerActivatedEventHandler>(
164+
[this](
165+
ICoreWebView2ExperimentalServiceWorkerRegistration* sender,
166+
ICoreWebView2ExperimentalServiceWorkerActivatedEventArgs*
167+
args) -> HRESULT
168+
{
169+
wil::com_ptr<ICoreWebView2ExperimentalServiceWorker>
170+
serviceWorker;
171+
CHECK_FAILURE(
172+
args->get_ActiveServiceWorker(&serviceWorker));
173+
SetupEventsOnServiceWorker(serviceWorker);
174+
175+
return S_OK;
176+
})
177+
.Get(),
178+
nullptr));
179+
}
180+
}
181+
182+
return S_OK;
183+
})
184+
.Get(),
185+
&m_serviceWorkerRegisteredToken));
186+
}
187+
188+
void ScenarioServiceWorkerPostMessageSetting::SetupEventsOnServiceWorker(
189+
wil::com_ptr<ICoreWebView2ExperimentalServiceWorker> serviceWorker)
190+
{
191+
serviceWorker->add_WebMessageReceived(
192+
Callback<ICoreWebView2ExperimentalServiceWorkerWebMessageReceivedEventHandler>(
193+
[this](
194+
ICoreWebView2ExperimentalServiceWorker* sender,
195+
ICoreWebView2WebMessageReceivedEventArgs* args) -> HRESULT
196+
{
197+
wil::unique_cotaskmem_string messageRaw;
198+
CHECK_FAILURE(args->TryGetWebMessageAsString(&messageRaw));
199+
std::wstring messageFromWorker = messageRaw.get();
200+
201+
std::wstringstream message{};
202+
message << L"Message: " << std::endl << messageFromWorker << std::endl;
203+
m_appWindow->AsyncMessageBox(message.str(), L"Message from Service Worker");
204+
205+
return S_OK;
206+
})
207+
.Get(),
208+
nullptr);
209+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright (C) Microsoft Corporation. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#pragma once
6+
#include "stdafx.h"
7+
8+
#include "AppWindow.h"
9+
#include "ComponentBase.h"
10+
11+
class ScenarioServiceWorkerPostMessageSetting : public ComponentBase
12+
{
13+
public:
14+
ScenarioServiceWorkerPostMessageSetting(AppWindow* appWindow);
15+
~ScenarioServiceWorkerPostMessageSetting() override;
16+
void SetupEventsOnWebview();
17+
void SetupEventsOnServiceWorker(
18+
wil::com_ptr<ICoreWebView2ExperimentalServiceWorker> serviceWorker);
19+
20+
void ToggleServiceWorkerJsApiSetting();
21+
void UnregisterAllServiceWorkers();
22+
23+
private:
24+
AppWindow* m_appWindow;
25+
wil::com_ptr<ICoreWebView2> m_webView;
26+
wil::com_ptr<ICoreWebView2ExperimentalServiceWorkerManager> m_serviceWorkerManager;
27+
std::wstring m_sampleUri;
28+
EventRegistrationToken m_serviceWorkerRegisteredToken = {};
29+
EventRegistrationToken m_contentLoadingToken = {};
30+
EventRegistrationToken m_webMessageReceivedToken = {};
31+
};

SampleApps/WebView2APISample/SettingsComponent.cpp

Lines changed: 58 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -953,20 +953,64 @@ bool SettingsComponent::HandleWindowMessage(
953953
//! [ToggleSwipeNavigationEnabled]
954954
return true;
955955
}
956-
case ID_SETTINGS_TOGGLE_HIDE_PDF_TOOLBAR_ITEMS:
956+
case ID_SETTINGS_TOGGLE_HIDE_PDF_TOOLBAR_ITEMS_NONE:
957+
case ID_SETTINGS_TOGGLE_HIDE_PDF_TOOLBAR_ITEMS_LEFT:
958+
case ID_SETTINGS_TOGGLE_HIDE_PDF_TOOLBAR_ITEMS_CENTER:
959+
case ID_SETTINGS_TOGGLE_HIDE_PDF_TOOLBAR_ITEMS_RIGHT:
960+
case ID_SETTINGS_TOGGLE_HIDE_PDF_TOOLBAR_ITEMS_ALL:
957961
{
958962
//! [ToggleHidePdfToolbarItems]
959963
CHECK_FEATURE_RETURN(m_settings7);
960964

961-
COREWEBVIEW2_PDF_TOOLBAR_ITEMS hiddenPdfToolbarItems;
962-
CHECK_FAILURE(m_settings7->get_HiddenPdfToolbarItems(&hiddenPdfToolbarItems));
963-
if (hiddenPdfToolbarItems ==
964-
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_NONE)
965+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS itemsToHide =
966+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_NONE;
967+
std::wstring message;
968+
969+
switch (LOWORD(wParam))
965970
{
966-
CHECK_FAILURE(
967-
m_settings7->put_HiddenPdfToolbarItems(
968-
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_PRINT |
969-
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_SAVE) |
971+
case ID_SETTINGS_TOGGLE_HIDE_PDF_TOOLBAR_ITEMS_NONE:
972+
// Show all items (hide none)
973+
itemsToHide =
974+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_NONE;
975+
message = L"All PDF toolbar items are shown after the next navigation.";
976+
break;
977+
case ID_SETTINGS_TOGGLE_HIDE_PDF_TOOLBAR_ITEMS_LEFT:
978+
// Left items: Bookmarks
979+
itemsToHide = static_cast<COREWEBVIEW2_PDF_TOOLBAR_ITEMS>(
980+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_BOOKMARKS);
981+
message =
982+
L"PDF toolbar left items (Bookmarks) are hidden after the next navigation.";
983+
break;
984+
case ID_SETTINGS_TOGGLE_HIDE_PDF_TOOLBAR_ITEMS_CENTER:
985+
// Center items: Page Selector, Zoom In, Zoom Out, Fit Page, Page Layout, Rotate
986+
itemsToHide = static_cast<COREWEBVIEW2_PDF_TOOLBAR_ITEMS>(
987+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::
988+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS_PAGE_SELECTOR |
989+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_ZOOM_IN |
990+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_ZOOM_OUT |
991+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_FIT_PAGE |
992+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_PAGE_LAYOUT |
993+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_ROTATE);
994+
message = L"PDF toolbar center items (Page Selector, Zoom, Fit Page, Page "
995+
L"Layout, Rotate) are hidden after the next navigation.";
996+
break;
997+
case ID_SETTINGS_TOGGLE_HIDE_PDF_TOOLBAR_ITEMS_RIGHT:
998+
// Right items: Search, Print, Save, Full Screen, More Settings
999+
itemsToHide = static_cast<COREWEBVIEW2_PDF_TOOLBAR_ITEMS>(
1000+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_SEARCH |
1001+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_PRINT |
1002+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_SAVE |
1003+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_FULL_SCREEN |
1004+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::
1005+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS_MORE_SETTINGS);
1006+
message = L"PDF toolbar right items (Search, Print, Save, Full Screen, More "
1007+
L"Settings) are hidden after the next navigation.";
1008+
break;
1009+
case ID_SETTINGS_TOGGLE_HIDE_PDF_TOOLBAR_ITEMS_ALL:
1010+
// All items
1011+
itemsToHide = static_cast<COREWEBVIEW2_PDF_TOOLBAR_ITEMS>(
1012+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_PRINT |
1013+
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_SAVE |
9701014
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_BOOKMARKS |
9711015
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_FIT_PAGE |
9721016
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_PAGE_LAYOUT |
@@ -980,20 +1024,12 @@ bool SettingsComponent::HandleWindowMessage(
9801024
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_FULL_SCREEN |
9811025
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::
9821026
COREWEBVIEW2_PDF_TOOLBAR_ITEMS_MORE_SETTINGS);
983-
MessageBox(
984-
nullptr,
985-
L"PDF toolbar print and save buttons are hidden after the next navigation.",
986-
L"Settings change", MB_OK);
987-
}
988-
else
989-
{
990-
CHECK_FAILURE(m_settings7->put_HiddenPdfToolbarItems(
991-
COREWEBVIEW2_PDF_TOOLBAR_ITEMS::COREWEBVIEW2_PDF_TOOLBAR_ITEMS_NONE));
992-
MessageBox(
993-
nullptr,
994-
L"PDF toolbar print and save buttons are shown after the next navigation.",
995-
L"Settings change", MB_OK);
1027+
message = L"All PDF toolbar items are hidden after the next navigation.";
1028+
break;
9961029
}
1030+
1031+
CHECK_FAILURE(m_settings7->put_HiddenPdfToolbarItems(itemsToHide));
1032+
MessageBox(nullptr, message.c_str(), L"Settings change", MB_OK);
9971033
//! [ToggleHidePdfToolbarItems]
9981034
return true;
9991035
}

0 commit comments

Comments
 (0)