blob: 7be752c272e02bffcb8048985c3a1b2093d77e88 [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2012 The Chromium Authors
[email protected]bd817c22011-02-09 08:16:462// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Henrique Ferreirof3fbcea22021-02-05 23:12:195#include "ash/constants/ash_switches.h"
[email protected]bd817c22011-02-09 08:16:466#include "base/command_line.h"
Stefan Kuhnead358c4b2021-11-23 03:14:127#include "build/chromeos_buildflags.h"
Henrique Ferreiroe70406062021-03-05 11:54:248#include "chrome/browser/ash/login/chrome_restart_request.h"
Yeunjoo Choi15ab1ac2021-02-04 17:15:079#include "chrome/browser/ash/profiles/profile_helper.h"
[email protected]ad4c2d32013-12-06 12:59:2610#include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
Scott Violet1e207c42019-05-06 19:58:0711#include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_helper.h"
12#include "chrome/browser/ui/ash/multi_user/test_multi_user_window_manager.h"
Sean Kau3af57e22021-10-18 19:33:1413#include "chrome/browser/ui/ash/window_pin_util.h"
[email protected]bd817c22011-02-09 08:16:4614#include "chrome/browser/ui/browser.h"
[email protected]0665ebe2013-02-13 09:53:1915#include "chrome/browser/ui/browser_finder.h"
[email protected]bd817c22011-02-09 08:16:4616#include "chrome/browser/ui/browser_navigator.h"
Aran Gilmand217b5b2019-04-11 17:45:4317#include "chrome/browser/ui/browser_navigator_browsertest.h"
Ivan Sandrkc8e238b62019-03-18 15:00:0218#include "chrome/browser/ui/browser_window.h"
[email protected]ee496952013-01-10 23:17:3319#include "chrome/browser/ui/tabs/tab_strip_model.h"
[email protected]78e2edc2012-07-01 23:32:2820#include "chrome/common/chrome_switches.h"
Ivan Sandrkc8e238b62019-03-18 15:00:0221#include "chrome/common/webui_url_constants.h"
Steven Bennettsc406dd22017-07-28 00:32:3622#include "chrome/test/base/ui_test_utils.h"
Alexander Alekseev3f09a8f2018-05-03 02:52:1023#include "components/account_id/account_id.h"
[email protected]4ca15302012-01-03 05:53:2024#include "content/public/browser/web_contents.h"
Peter Kasting919ce652020-05-07 10:22:3625#include "content/public/test/browser_test.h"
Ivan Sandrkc8e238b62019-03-18 15:00:0226#include "ui/aura/window.h"
[email protected]bd817c22011-02-09 08:16:4627
Stefan Kuhnead358c4b2021-11-23 03:14:1228#if BUILDFLAG(IS_CHROMEOS_LACROS)
29#include "chromeos/crosapi/mojom/crosapi.mojom.h"
30#include "chromeos/crosapi/mojom/test_controller.mojom-test-utils.h"
Stefan Kuhnead358c4b2021-11-23 03:14:1231#include "chromeos/lacros/lacros_test_helper.h"
Eriko Kurimoto72e9e372022-04-20 17:00:2932#include "chromeos/startup/browser_init_params.h"
Stefan Kuhnead358c4b2021-11-23 03:14:1233#endif
34
[email protected]bd817c22011-02-09 08:16:4635namespace {
36
Stefan Kuhnead358c4b2021-11-23 03:14:1237using BrowserNavigatorTestChromeOS = BrowserNavigatorTest;
38
39#if BUILDFLAG(IS_CHROMEOS_ASH)
40
[email protected]ddddfda2011-07-14 23:19:3941GURL GetGoogleURL() {
42 return GURL("http://www.google.com/");
43}
44
Roman Aleksandrovabee5ea22020-05-19 20:23:0745// Verifies that new browser is not opened for Signin profile.
46IN_PROC_BROWSER_TEST_F(BrowserNavigatorTestChromeOS, RestrictSigninProfile) {
47 EXPECT_EQ(chrome::GetTotalBrowserCount(), 1u);
48
Ramin Halavatic04ae902021-01-11 12:52:4149 EXPECT_EQ(Browser::CreationStatus::kErrorProfileUnsuitable,
50 Browser::GetCreationStatusForProfile(
Yeunjoo Choi36f21d542022-01-13 03:12:3351 ash::ProfileHelper::GetSigninProfile()));
Roman Aleksandrovabee5ea22020-05-19 20:23:0752}
53
Ivan Sandrkc8e238b62019-03-18 15:00:0254// Verify that page navigation is blocked in locked fullscreen mode.
55IN_PROC_BROWSER_TEST_F(BrowserNavigatorTestChromeOS,
56 NavigationBlockedInLockedFullscreen) {
57 // Set locked fullscreen state.
58 aura::Window* window = browser()->window()->GetNativeWindow();
Sean Kau3af57e22021-10-18 19:33:1459 PinWindow(window, /*trusted=*/true);
Ivan Sandrkc8e238b62019-03-18 15:00:0260
61 // Navigate to a page.
62 auto url = GURL(chrome::kChromeUIVersionURL);
63 NavigateParams params(MakeNavigateParams(browser()));
64 params.disposition = WindowOpenDisposition::NEW_WINDOW;
65 params.url = url;
66 params.window_action = NavigateParams::SHOW_WINDOW;
67 Navigate(&params);
68
69 // The page should not be opened, and the browser should still sit at the
70 // default about:blank page.
71 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
72 EXPECT_EQ(1, browser()->tab_strip_model()->count());
73 EXPECT_EQ(GURL(url::kAboutBlankURL),
74 browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
75
76 // As a sanity check unset the locked fullscreen state and make sure that the
77 // navigation happens (the following EXPECTs fail if the next line isn't
78 // executed).
Sean Kau3af57e22021-10-18 19:33:1479 UnpinWindow(window);
Ivan Sandrkc8e238b62019-03-18 15:00:0280
81 Navigate(&params);
82
83 // The original browser should still be at the same page, but the newly
84 // opened browser should sit on the chrome:version page.
85 EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
86 EXPECT_EQ(1, browser()->tab_strip_model()->count());
87 EXPECT_EQ(GURL(url::kAboutBlankURL),
88 browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
89 EXPECT_EQ(1, params.browser->tab_strip_model()->count());
90 EXPECT_EQ(
91 GURL(chrome::kChromeUIVersionURL),
92 params.browser->tab_strip_model()->GetActiveWebContents()->GetURL());
93}
94
[email protected]bd817c22011-02-09 08:16:4695// Subclass that tests navigation while in the Guest session.
Aran Gilmand217b5b2019-04-11 17:45:4396class BrowserGuestSessionNavigatorTest : public BrowserNavigatorTest {
[email protected]bd817c22011-02-09 08:16:4697 protected:
dcheng465662e2015-01-21 14:19:2198 void SetUpCommandLine(base::CommandLine* command_line) override {
avi556c05022014-12-22 23:31:4399 base::CommandLine command_line_copy = *command_line;
Henrique Ferreiro93dd33b2022-01-18 16:06:45100 command_line_copy.AppendSwitchASCII(ash::switches::kLoginProfile, "user");
101 command_line_copy.AppendSwitch(ash::switches::kGuestSession);
Henrique Ferreirob403be32021-09-22 07:15:36102 ash::GetOffTheRecordCommandLine(GetGoogleURL(), command_line_copy,
103 command_line);
[email protected]bd817c22011-02-09 08:16:46104 }
105};
106
107// This test verifies that the settings page is opened in the incognito window
108// in Guest Session (as well as all other windows in Guest session).
109IN_PROC_BROWSER_TEST_F(BrowserGuestSessionNavigatorTest,
110 Disposition_Settings_UseIncognitoWindow) {
111 Browser* incognito_browser = CreateIncognitoBrowser();
112
[email protected]0665ebe2013-02-13 09:53:19113 EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
[email protected]ee496952013-01-10 23:17:33114 EXPECT_EQ(1, browser()->tab_strip_model()->count());
115 EXPECT_EQ(1, incognito_browser->tab_strip_model()->count());
[email protected]bd817c22011-02-09 08:16:46116
117 // Navigate to the settings page.
cm.sanchi2522bc92017-12-04 08:04:13118 NavigateParams params(MakeNavigateParams(incognito_browser));
nick3b04f322016-08-31 19:29:19119 params.disposition = WindowOpenDisposition::SINGLETON_TAB;
Dan Beam141c48932019-08-22 02:29:39120 params.url = GURL("chrome://settings");
cm.sanchi2522bc92017-12-04 08:04:13121 params.window_action = NavigateParams::SHOW_WINDOW;
122 params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
123 Navigate(&params);
[email protected]bd817c22011-02-09 08:16:46124
125 // Settings page should be opened in incognito window.
[email protected]ad4c2d32013-12-06 12:59:26126 EXPECT_NE(browser(), params.browser);
127 EXPECT_EQ(incognito_browser, params.browser);
[email protected]ee496952013-01-10 23:17:33128 EXPECT_EQ(2, incognito_browser->tab_strip_model()->count());
Aran Gilmand217b5b2019-04-11 17:45:43129 EXPECT_EQ(
Dan Beam141c48932019-08-22 02:29:39130 GURL("chrome://settings"),
Aran Gilmand217b5b2019-04-11 17:45:43131 incognito_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
[email protected]bd817c22011-02-09 08:16:46132}
133
[email protected]ad4c2d32013-12-06 12:59:26134// Test that in multi user environments a newly created browser gets created
135// on the same desktop as the browser is shown on.
136IN_PROC_BROWSER_TEST_F(BrowserGuestSessionNavigatorTest,
Ahmed Fakhry6a3fddd42017-09-13 02:09:12137 Browser_Gets_Created_On_Visiting_Desktop) {
[email protected]ad4c2d32013-12-06 12:59:26138 // Test 1: Test that a browser created from a visiting browser will be on the
139 // same visiting desktop.
140 {
alematecdf46dd2015-11-12 03:15:16141 const AccountId desktop_account_id(
142 AccountId::FromUserEmail("[email protected]"));
Scott Violet7f44d5f02019-05-06 17:43:39143 TestMultiUserWindowManager* window_manager =
144 TestMultiUserWindowManager::Create(browser(), desktop_account_id);
[email protected]ad4c2d32013-12-06 12:59:26145
146 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
147
148 // Navigate to the settings page.
cm.sanchi2522bc92017-12-04 08:04:13149 NavigateParams params(MakeNavigateParams(browser()));
nick3b04f322016-08-31 19:29:19150 params.disposition = WindowOpenDisposition::NEW_POPUP;
Dan Beam141c48932019-08-22 02:29:39151 params.url = GURL("chrome://settings");
cm.sanchi2522bc92017-12-04 08:04:13152 params.window_action = NavigateParams::SHOW_WINDOW;
153 params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
[email protected]ad4c2d32013-12-06 12:59:26154 params.browser = browser();
cm.sanchi2522bc92017-12-04 08:04:13155 Navigate(&params);
[email protected]ad4c2d32013-12-06 12:59:26156
157 EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
158
Scott Violet7f44d5f02019-05-06 17:43:39159 aura::Window* created_window = window_manager->created_window();
[email protected]ad4c2d32013-12-06 12:59:26160 ASSERT_TRUE(created_window);
alematecdf46dd2015-11-12 03:15:16161 EXPECT_TRUE(
Scott Violet7f44d5f02019-05-06 17:43:39162 MultiUserWindowManagerHelper::GetInstance()->IsWindowOnDesktopOfUser(
163 created_window, desktop_account_id));
[email protected]ad4c2d32013-12-06 12:59:26164 }
165 // Test 2: Test that a window which is not visiting does not cause an owner
166 // assignment of a newly created browser.
167 {
alematecdf46dd2015-11-12 03:15:16168 const AccountId browser_owner =
169 multi_user_util::GetAccountIdFromProfile(browser()->profile());
Scott Violet7f44d5f02019-05-06 17:43:39170 TestMultiUserWindowManager* window_manager =
171 TestMultiUserWindowManager::Create(browser(), browser_owner);
[email protected]ad4c2d32013-12-06 12:59:26172
173 // Navigate to the settings page.
cm.sanchi2522bc92017-12-04 08:04:13174 NavigateParams params(MakeNavigateParams(browser()));
nick3b04f322016-08-31 19:29:19175 params.disposition = WindowOpenDisposition::NEW_POPUP;
Dan Beam141c48932019-08-22 02:29:39176 params.url = GURL("chrome://settings");
cm.sanchi2522bc92017-12-04 08:04:13177 params.window_action = NavigateParams::SHOW_WINDOW;
178 params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
[email protected]ad4c2d32013-12-06 12:59:26179 params.browser = browser();
cm.sanchi2522bc92017-12-04 08:04:13180 Navigate(&params);
[email protected]ad4c2d32013-12-06 12:59:26181
182 EXPECT_EQ(3u, chrome::GetTotalBrowserCount());
183
184 // The ShowWindowForUser should not have been called since the window is
185 // already on the correct desktop.
Scott Violet7f44d5f02019-05-06 17:43:39186 ASSERT_FALSE(window_manager->created_window());
[email protected]ad4c2d32013-12-06 12:59:26187 }
188}
189
Stefan Kuhnead358c4b2021-11-23 03:14:12190#endif // BUILDFLAG(IS_CHROMEOS_ASH)
191
192#if BUILDFLAG(IS_CHROMEOS_LACROS)
193// Verifies that the navigation is trying to open the os:// scheme page in
194// Ash, will fail and then open it as chrome:// in Lacros to show a 404 error.
195IN_PROC_BROWSER_TEST_F(BrowserNavigatorTestChromeOS, OsSchemeRedirectFail) {
196 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
197 EXPECT_EQ(1, browser()->tab_strip_model()->count());
198
199 // Navigate to an unknown page with an os:// scheme.
200 NavigateParams params(MakeNavigateParams(browser()));
201 params.disposition = WindowOpenDisposition::SINGLETON_TAB;
202 params.url = GURL("os://foobar");
203 params.window_action = NavigateParams::SHOW_WINDOW;
204 params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
205 Navigate(&params);
206
Stefan Kuhnec2dd85662022-07-29 12:36:35207 // A new blocked page should be shown in the browser.
Stefan Kuhnead358c4b2021-11-23 03:14:12208 EXPECT_EQ(browser(), params.browser);
209 EXPECT_EQ(2, browser()->tab_strip_model()->count());
Stefan Kuhnec2dd85662022-07-29 12:36:35210 EXPECT_EQ(GURL(content::kBlockedURL),
Stefan Kuhnead358c4b2021-11-23 03:14:12211 browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
212}
213
214// Verifies that the navigation of an os:// scheme page is opening an app on
215// the ash side and does not produce a navigation on the Lacros side.
216IN_PROC_BROWSER_TEST_F(BrowserNavigatorTestChromeOS, OsSchemeRedirectSucceed) {
217 if (chromeos::LacrosService::Get()->GetInterfaceVersion(
218 crosapi::mojom::TestController::Uuid_) <
219 static_cast<int>(crosapi::mojom::TestController::MethodMinVersions::
220 kGetOpenAshBrowserWindowsMinVersion)) {
221 LOG(WARNING) << "Unsupported ash version.";
222 return;
223 }
224
225 crosapi::mojom::TestControllerAsyncWaiter waiter(
226 chromeos::LacrosService::Get()
227 ->GetRemote<crosapi::mojom::TestController>()
228 .get());
229
230 // Ash shouldn't have a browser window open by now.
231 uint32_t number = 1;
232 waiter.GetOpenAshBrowserWindows(&number);
233 EXPECT_EQ(0u, number);
234
235 // First we make sure that the GURL we are interested in is in our allow list.
Stefan Kuhnead358c4b2021-11-23 03:14:12236 auto init_params = crosapi::mojom::BrowserInitParams::New();
237 init_params->accepted_internal_ash_urls =
238 std::vector<GURL>{GURL(chrome::kOsUIFlagsURL)};
Eriko Kurimoto72e9e372022-04-20 17:00:29239 chromeos::BrowserInitParams::SetInitParamsForTests(std::move(init_params));
Stefan Kuhnead358c4b2021-11-23 03:14:12240
241 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
242 EXPECT_EQ(1, browser()->tab_strip_model()->count());
243 GURL url_before_navigation =
244 browser()->tab_strip_model()->GetActiveWebContents()->GetURL();
245
246 // Navigate to a known Ash page.
247 NavigateParams params(MakeNavigateParams(browser()));
248 params.disposition = WindowOpenDisposition::SINGLETON_TAB;
249 params.url = GURL(chrome::kOsUIFlagsURL);
250 params.window_action = NavigateParams::SHOW_WINDOW;
251 params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
Stefan Kuhnebb55ab82021-11-30 18:06:52252 params.transition = ui::PageTransitionFromInt(
253 ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
Stefan Kuhnead358c4b2021-11-23 03:14:12254 Navigate(&params);
255
256 // No change should have happened on the Lacros side.
257 EXPECT_EQ(browser(), params.browser);
258 EXPECT_EQ(1, browser()->tab_strip_model()->count());
259 EXPECT_EQ(url_before_navigation,
260 browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
261
262 // Clean up the window we have created.
263
264 // Wait until we have the app running.
265 while (0 == number) {
266 usleep(25000);
267 waiter.GetOpenAshBrowserWindows(&number);
268 }
269
270 // Close it.
271 bool success = false;
272 waiter.CloseAllBrowserWindows(&success);
273 EXPECT_TRUE(success);
274
275 // Wait until all are gone.
276 while (0 != number) {
277 usleep(25000);
278 waiter.GetOpenAshBrowserWindows(&number);
279 }
280}
281
282#endif
283
[email protected]bd817c22011-02-09 08:16:46284} // namespace