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