1 // Copyright 2019 The Chromium Authors. 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 #include <string>
6 #include <vector>
7
8 #include "base/test/metrics/histogram_tester.h"
9 #include "base/test/metrics/user_action_tester.h"
10 #include "base/test/scoped_feature_list.h"
11 #include "build/branding_buildflags.h"
12 #include "build/build_config.h"
13 #include "chrome/browser/apps/app_service/app_launch_params.h"
14 #include "chrome/browser/apps/app_service/app_service_proxy.h"
15 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
16 #include "chrome/browser/chromeos/release_notes/release_notes_notification.h"
17 #include "chrome/browser/chromeos/release_notes/release_notes_storage.h"
18 #include "chrome/browser/chromeos/web_applications/system_web_app_integration_test.h"
19 #include "chrome/browser/notifications/notification_display_service_tester.h"
20 #include "chrome/browser/ui/ash/system_tray_client.h"
21 #include "chrome/browser/ui/browser.h"
22 #include "chrome/browser/ui/browser_finder.h"
23 #include "chrome/browser/ui/browser_window.h"
24 #include "chrome/browser/ui/chrome_pages.h"
25 #include "chrome/browser/web_applications/system_web_app_manager.h"
26 #include "chrome/browser/web_applications/system_web_app_manager_browsertest.h"
27 #include "chrome/common/chrome_switches.h"
28 #include "chrome/common/pref_names.h"
29 #include "chrome/common/url_constants.h"
30 #include "chrome/test/base/interactive_test_utils.h"
31 #include "chrome/test/base/ui_test_utils.h"
32 #include "chromeos/components/help_app_ui/url_constants.h"
33 #include "chromeos/components/web_applications/test/sandboxed_web_ui_test_base.h"
34 #include "chromeos/constants/chromeos_features.h"
35 #include "chromeos/constants/chromeos_switches.h"
36 #include "components/user_manager/user_names.h"
37 #include "content/public/test/browser_test.h"
38 #include "content/public/test/test_navigation_observer.h"
39 #include "testing/gtest/include/gtest/gtest.h"
40 #include "ui/display/screen.h"
41 #include "ui/display/types/display_constants.h"
42 #include "ui/events/keycodes/keyboard_codes.h"
43 #include "ui/gfx/geometry/rect.h"
44 #include "ui/gfx/geometry/size.h"
45
46 class HelpAppIntegrationTest : public SystemWebAppIntegrationTest {
47 public:
HelpAppIntegrationTest()48 HelpAppIntegrationTest() {
49 scoped_feature_list_.InitWithFeatures(
50 {chromeos::features::kHelpAppSearchServiceIntegration,
51 chromeos::features::kReleaseNotesNotificationAllChannels},
52 {});
53 }
54
55 private:
56 base::test::ScopedFeatureList scoped_feature_list_;
57 };
58
59 using HelpAppAllProfilesIntegrationTest = HelpAppIntegrationTest;
60
GetActiveWebContents()61 content::WebContents* GetActiveWebContents() {
62 return chrome::FindLastActive()->tab_strip_model()->GetActiveWebContents();
63 }
64
65 // Waits for and expects that the correct url is opened.
WaitForAppToOpen(const GURL & expected_url)66 void WaitForAppToOpen(const GURL& expected_url) {
67 // Start with a number of browsers (may include an incognito browser).
68 size_t num_browsers = chrome::GetTotalBrowserCount();
69 content::TestNavigationObserver navigation_observer(expected_url);
70 navigation_observer.StartWatchingNewWebContents();
71 // If no navigation happens, then this test will time out due to the wait.
72 navigation_observer.Wait();
73
74 // There should be another browser window for the newly opened app.
75 EXPECT_EQ(num_browsers + 1, chrome::GetTotalBrowserCount());
76 // Help app should have opened at the expected page.
77 EXPECT_EQ(expected_url, GetActiveWebContents()->GetVisibleURL());
78 }
79
80 // Test that the Help App installs and launches correctly. Runs some spot
81 // checks on the manifest.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2)82 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2) {
83 const GURL url(chromeos::kChromeUIHelpAppURL);
84 EXPECT_NO_FATAL_FAILURE(
85 ExpectSystemWebAppValid(web_app::SystemAppType::HELP, url, "Explore"));
86 }
87
88 // Test that the Help App is searchable by additional strings.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2SearchInLauncher)89 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2SearchInLauncher) {
90 WaitForTestSystemAppInstall();
91 EXPECT_EQ(
92 std::vector<std::string>({"Get Help", "Perks", "Offers"}),
93 GetManager().GetAdditionalSearchTerms(web_app::SystemAppType::HELP));
94 }
95
96 // Test that the Help App has a minimum window size of 600x320.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2MinWindowSize)97 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2MinWindowSize) {
98 WaitForTestSystemAppInstall();
99 auto app_id = LaunchParamsForApp(web_app::SystemAppType::HELP).app_id;
100 EXPECT_EQ(GetManager().GetMinimumWindowSize(app_id), gfx::Size(600, 320));
101 }
102
103 // Test that the Help App has a default size of 960x600 and is in the center of
104 // the screen.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2DefaultWindowBounds)105 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2DefaultWindowBounds) {
106 WaitForTestSystemAppInstall();
107 Browser* browser;
108 LaunchApp(web_app::SystemAppType::HELP, &browser);
109 gfx::Rect work_area =
110 display::Screen::GetScreen()->GetDisplayForNewWindows().work_area();
111 int x = (work_area.width() - 960) / 2;
112 int y = (work_area.height() - 600) / 2;
113 EXPECT_EQ(browser->window()->GetBounds(), gfx::Rect(x, y, 960, 600));
114 }
115
116 // Test that the Help App logs metric when launching the app using the
117 // AppServiceProxy.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2AppServiceMetrics)118 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2AppServiceMetrics) {
119 WaitForTestSystemAppInstall();
120 base::HistogramTester histogram_tester;
121
122 // The metric is recorded in LaunchSystemWebApp (crbug/1112660), but using
123 // AppServiceProxy gives more coverage of the launch path and ensures the
124 // metric is not recorded twice.
125 auto* proxy = apps::AppServiceProxyFactory::GetForProfile(profile());
126 content::TestNavigationObserver navigation_observer(
127 GURL("chrome://help-app/"));
128 navigation_observer.StartWatchingNewWebContents();
129
130 proxy->Launch(
131 *GetManager().GetAppIdForSystemApp(web_app::SystemAppType::HELP),
132 ui::EventFlags::EF_NONE, apps::mojom::LaunchSource::kFromKeyboard,
133 display::kDefaultDisplayId);
134
135 navigation_observer.Wait();
136 // The HELP app is 18, see DefaultAppName in
137 // src/chrome/browser/apps/app_service/app_service_metrics.cc
138 histogram_tester.ExpectUniqueSample("Apps.DefaultAppLaunch.FromKeyboard", 18,
139 1);
140 }
141
142 // Test that the Help App can log metrics in the untrusted frame.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2InAppMetrics)143 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2InAppMetrics) {
144 WaitForTestSystemAppInstall();
145 content::WebContents* web_contents = LaunchApp(web_app::SystemAppType::HELP);
146
147 base::UserActionTester user_action_tester;
148
149 constexpr char kScript[] = R"(
150 chrome.metricsPrivate.recordUserAction("Discover.Help.TabClicked");
151 )";
152
153 EXPECT_EQ(0, user_action_tester.GetActionCount("Discover.Help.TabClicked"));
154 EXPECT_EQ(nullptr,
155 SandboxedWebUiAppTestBase::EvalJsInAppFrame(web_contents, kScript));
156 EXPECT_EQ(1, user_action_tester.GetActionCount("Discover.Help.TabClicked"));
157 }
158
IN_PROC_BROWSER_TEST_P(HelpAppAllProfilesIntegrationTest,HelpAppV2ShowHelp)159 IN_PROC_BROWSER_TEST_P(HelpAppAllProfilesIntegrationTest, HelpAppV2ShowHelp) {
160 WaitForTestSystemAppInstall();
161
162 chrome::ShowHelp(browser(), chrome::HELP_SOURCE_KEYBOARD);
163
164 #if defined(OS_CHROMEOS) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
165 EXPECT_NO_FATAL_FAILURE(WaitForAppToOpen(GURL("chrome://help-app/")));
166 #else
167 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
168 EXPECT_EQ(GURL(chrome::kChromeHelpViaKeyboardURL),
169 GetActiveWebContents()->GetVisibleURL());
170 #endif
171 }
172
173 // Test that launching the Help App's release notes opens the app on the Release
174 // Notes page.
IN_PROC_BROWSER_TEST_P(HelpAppAllProfilesIntegrationTest,HelpAppV2LaunchReleaseNotes)175 IN_PROC_BROWSER_TEST_P(HelpAppAllProfilesIntegrationTest,
176 HelpAppV2LaunchReleaseNotes) {
177 WaitForTestSystemAppInstall();
178
179 // There should be 1 browser window initially.
180 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
181
182 const GURL expected_url("chrome://help-app/updates");
183 content::TestNavigationObserver navigation_observer(expected_url);
184 navigation_observer.StartWatchingNewWebContents();
185
186 chrome::LaunchReleaseNotes(profile(),
187 apps::mojom::LaunchSource::kFromOtherApp);
188 #if defined(OS_CHROMEOS) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
189 // If no navigation happens, then this test will time out due to the wait.
190 navigation_observer.Wait();
191
192 // There should be two browser windows, one regular and one for the newly
193 // opened app.
194 EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
195
196 // The opened window should be showing the url with attached WebUI.
197 // The inner frame should be the pathname for the release notes pathname.
198 EXPECT_EQ("chrome-untrusted://help-app/updates",
199 SandboxedWebUiAppTestBase::EvalJsInAppFrame(
200 GetActiveWebContents(), "window.location.href"));
201 #else
202 // Nothing should happen on non-branded builds.
203 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
204 #endif
205 }
206
207 // Test that launching the Help App's release notes logs metrics.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2ReleaseNotesMetrics)208 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2ReleaseNotesMetrics) {
209 WaitForTestSystemAppInstall();
210
211 base::UserActionTester user_action_tester;
212 chrome::LaunchReleaseNotes(profile(),
213 apps::mojom::LaunchSource::kFromOtherApp);
214 #if defined(OS_CHROMEOS) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
215 EXPECT_EQ(1,
216 user_action_tester.GetActionCount("ReleaseNotes.ShowReleaseNotes"));
217 #else
218 EXPECT_EQ(0,
219 user_action_tester.GetActionCount("ReleaseNotes.ShowReleaseNotes"));
220 #endif
221 }
222
223 // Test that clicking the release notes notification opens Help App.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2LaunchReleaseNotesFromNotification)224 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,
225 HelpAppV2LaunchReleaseNotesFromNotification) {
226 WaitForTestSystemAppInstall();
227 base::UserActionTester user_action_tester;
228 auto display_service =
229 std::make_unique<NotificationDisplayServiceTester>(/*profile=*/nullptr);
230 auto release_notes_notification =
231 std::make_unique<chromeos::ReleaseNotesNotification>(profile());
232 auto release_notes_storage =
233 std::make_unique<chromeos::ReleaseNotesStorage>(profile());
234
235 // Force the release notes notification to show up.
236 profile()->GetPrefs()->SetInteger(prefs::kReleaseNotesLastShownMilestone, 20);
237 release_notes_notification->MaybeShowReleaseNotes();
238 // Assert that the notification really is there.
239 auto notifications = display_service->GetDisplayedNotificationsForType(
240 NotificationHandler::Type::TRANSIENT);
241 ASSERT_EQ(1u, notifications.size());
242 ASSERT_EQ("show_release_notes_notification", notifications[0].id());
243 // Then click.
244 display_service->SimulateClick(NotificationHandler::Type::TRANSIENT,
245 "show_release_notes_notification",
246 base::nullopt, base::nullopt);
247
248 EXPECT_EQ(
249 1, user_action_tester.GetActionCount("ReleaseNotes.NotificationShown"));
250 EXPECT_EQ(1, user_action_tester.GetActionCount(
251 "ReleaseNotes.LaunchedNotification"));
252 #if defined(OS_CHROMEOS) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
253 EXPECT_NO_FATAL_FAILURE(WaitForAppToOpen(GURL("chrome://help-app/updates")));
254 EXPECT_EQ(1,
255 user_action_tester.GetActionCount("ReleaseNotes.ShowReleaseNotes"));
256 #else
257 // We just have the original browser. No new app opens.
258 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
259 EXPECT_EQ(0,
260 user_action_tester.GetActionCount("ReleaseNotes.ShowReleaseNotes"));
261 #endif
262 }
263
264 // Test that the Help App does a navigation on launch even when it was already
265 // open with the same URL.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2NavigateOnRelaunch)266 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2NavigateOnRelaunch) {
267 WaitForTestSystemAppInstall();
268
269 // There should initially be a single browser window.
270 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
271
272 Browser* browser;
273 content::WebContents* web_contents =
274 LaunchApp(web_app::SystemAppType::HELP, &browser);
275
276 // There should be two browser windows, one regular and one for the newly
277 // opened app.
278 EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
279
280 content::TestNavigationObserver navigation_observer(web_contents);
281 LaunchAppWithoutWaiting(web_app::SystemAppType::HELP);
282 // If no navigation happens, then this test will time out due to the wait.
283 navigation_observer.Wait();
284
285 // LaunchApp should navigate the existing window and not open any new windows.
286 EXPECT_EQ(browser, chrome::FindLastActive());
287 EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
288 }
289
290 // Test direct navigation to a subpage.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2DirectNavigation)291 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2DirectNavigation) {
292 WaitForTestSystemAppInstall();
293 auto params = LaunchParamsForApp(web_app::SystemAppType::HELP);
294 params.override_url = GURL("chrome://help-app/help/");
295
296 content::WebContents* web_contents = LaunchApp(std::move(params));
297
298 // The inner frame should have the same pathname as the launch URL.
299 EXPECT_EQ("chrome-untrusted://help-app/help/",
300 SandboxedWebUiAppTestBase::EvalJsInAppFrame(
301 web_contents, "window.location.href"));
302 }
303
304 // Test that the Help App can open the feedback dialog.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2OpenFeedbackDialog)305 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2OpenFeedbackDialog) {
306 WaitForTestSystemAppInstall();
307 content::WebContents* web_contents = LaunchApp(web_app::SystemAppType::HELP);
308
309 // Script that tells the Help App to open the feedback dialog.
310 constexpr char kScript[] = R"(
311 (async () => {
312 const app = document.querySelector('showoff-app');
313 const res = await app.getDelegate().openFeedbackDialog();
314 window.domAutomationController.send(res);
315 })();
316 )";
317 std::string result;
318 // Use ExecuteScript instead of EvalJsInAppFrame because the script needs to
319 // run in the same world as the page's code.
320 EXPECT_TRUE(content::ExecuteScriptAndExtractString(
321 SandboxedWebUiAppTestBase::GetAppFrame(web_contents), kScript, &result));
322 // A result of empty string means no error in opening feedback.
323 EXPECT_EQ(result, "");
324 }
325
326 // Test that the Help App opens the OS Settings family link page.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2ShowParentalControls)327 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2ShowParentalControls) {
328 WaitForTestSystemAppInstall();
329 content::WebContents* web_contents = LaunchApp(web_app::SystemAppType::HELP);
330
331 // There should be two browser windows, one regular and one for the newly
332 // opened help app.
333 EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
334
335 const GURL expected_url("chrome://os-settings/osPeople");
336 content::TestNavigationObserver navigation_observer(expected_url);
337 navigation_observer.StartWatchingNewWebContents();
338
339 // Script that tells the Help App to show parental controls.
340 constexpr char kScript[] = R"(
341 (async () => {
342 const app = document.querySelector('showoff-app');
343 await app.getDelegate().showParentalControls();
344 })();
345 )";
346 // Trigger the script, then wait for settings to open. Use ExecuteScript
347 // instead of EvalJsInAppFrame because the script needs to run in the same
348 // world as the page's code.
349 EXPECT_TRUE(content::ExecuteScript(
350 SandboxedWebUiAppTestBase::GetAppFrame(web_contents), kScript));
351 navigation_observer.Wait();
352
353 // Settings should be active in a new window.
354 EXPECT_EQ(3u, chrome::GetTotalBrowserCount());
355 EXPECT_EQ(expected_url, GetActiveWebContents()->GetVisibleURL());
356 }
357
358 // Test that the Help App delegate uses the local search service methods.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppV2UsesLocalSearchServiceMethods)359 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,
360 HelpAppV2UsesLocalSearchServiceMethods) {
361 WaitForTestSystemAppInstall();
362 content::WebContents* web_contents = LaunchApp(web_app::SystemAppType::HELP);
363
364 // Script that adds a data item to the search index, then tries to find that
365 // data item.
366 constexpr char kScript[] = R"(
367 (async () => {
368 const delegate = document.querySelector('showoff-app').getDelegate();
369
370 await delegate.addOrUpdateSearchIndex([{
371 id: 'test-id',
372 title: 'foobar',
373 body: 'foo bar baz',
374 mainCategoryName: 'Help',
375 locale: 'en-US',
376 }]);
377
378 // Polling is required as addOrUpdateSearchIndex resolves before the
379 // search index is actually updated.
380 setInterval(async () => {
381 // Note that the LSS will fuzzy match into foobar.
382 const {results} = await delegate.findInSearchIndex('foober');
383 if (results && results.length === 1) {
384 window.domAutomationController.send(results[0].id);
385 }
386 }, 10);
387 })();
388 )";
389 std::string result;
390 // Use ExecuteScript instead of EvalJsInAppFrame because the script needs to
391 // run in the same world as the page's code.
392 EXPECT_TRUE(content::ExecuteScriptAndExtractString(
393 SandboxedWebUiAppTestBase::GetAppFrame(web_contents), kScript, &result));
394 EXPECT_EQ(result, "test-id");
395 }
396
397 // Test that the Help App opens when Gesture help requested.
IN_PROC_BROWSER_TEST_P(HelpAppAllProfilesIntegrationTest,HelpAppOpenGestures)398 IN_PROC_BROWSER_TEST_P(HelpAppAllProfilesIntegrationTest, HelpAppOpenGestures) {
399 WaitForTestSystemAppInstall();
400 base::HistogramTester histogram_tester;
401
402 SystemTrayClient::Get()->ShowGestureEducationHelp();
403
404 EXPECT_NO_FATAL_FAILURE(
405 WaitForAppToOpen(GURL("chrome://help-app/help/sub/3399710/id/9739838")));
406 // The HELP app is 18, see DefaultAppName in
407 // src/chrome/browser/apps/app_service/app_service_metrics.cc
408 histogram_tester.ExpectUniqueSample("Apps.DefaultAppLaunch.FromOtherApp", 18,
409 1);
410 }
411
412 // Test that the Help App opens from keyboard shortcut.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppOpenKeyboardShortcut)413 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppOpenKeyboardShortcut) {
414 WaitForTestSystemAppInstall();
415 base::HistogramTester histogram_tester;
416
417 // The /? key is OEM_2 on a US standard keyboard.
418 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
419 browser(), ui::VKEY_OEM_2, /*control=*/true,
420 /*shift=*/false, /*alt=*/false, /*command=*/false));
421
422 #if defined(OS_CHROMEOS) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
423 // Default browser tab and Help app are open.
424 EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
425 EXPECT_EQ("chrome://help-app/", GetActiveWebContents()->GetVisibleURL());
426 // The HELP app is 18, see DefaultAppName in
427 // src/chrome/browser/apps/app_service/app_service_metrics.cc
428 histogram_tester.ExpectUniqueSample("Apps.DefaultAppLaunch.FromKeyboard", 18,
429 1);
430 #else
431 // We just have the one browser. Navigates chrome.
432 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
433 EXPECT_EQ(GURL(chrome::kChromeHelpViaKeyboardURL),
434 GetActiveWebContents()->GetVisibleURL());
435 // The HELP app is 18, see DefaultAppName in
436 // src/chrome/browser/apps/app_service/app_service_metrics.cc
437 histogram_tester.ExpectUniqueSample("Apps.DefaultAppLaunch.FromKeyboard", 18,
438 0);
439 #endif
440 }
441
442 // Test that the Help App opens in a new window if try to navigate there in a
443 // browser.
IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,HelpAppCapturesBrowserNavigation)444 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,
445 HelpAppCapturesBrowserNavigation) {
446 WaitForTestSystemAppInstall();
447 content::TestNavigationObserver navigation_observer(
448 GURL("chrome://help-app"));
449 navigation_observer.StartWatchingNewWebContents();
450 ASSERT_EQ(1u, chrome::GetTotalBrowserCount());
451
452 // Try to navigate to the help app in the browser.
453 ui_test_utils::SendToOmniboxAndSubmit(browser(), "chrome://help-app");
454 navigation_observer.Wait();
455
456 // We now have two browsers, one for the chrome window, one for the Help app.
457 EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
458 EXPECT_EQ(GURL("chrome://help-app"), GetActiveWebContents()->GetVisibleURL());
459 }
460
461 INSTANTIATE_SYSTEM_WEB_APP_MANAGER_TEST_SUITE_WEB_APP_INFO_INSTALL_P(
462 HelpAppIntegrationTest);
463
464 INSTANTIATE_SYSTEM_WEB_APP_MANAGER_TEST_SUITE_ALL_PROFILE_TYPES_P(
465 HelpAppAllProfilesIntegrationTest,
466 kWebAppInfoInstall);
467