blob: d76ca8de49a148695ae2699029f27e57c477a973 [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// Copyright (c) 2012 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
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01005#include <algorithm>
6#include <string>
7
Torne (Richard Coles)58218062012-11-14 11:43:16 +00008#include "base/command_line.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00009#include "base/files/file_path.h"
10#include "base/prefs/pref_service.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010011#include "base/strings/utf_string_conversions.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000012#include "chrome/browser/browser_process.h"
13#include "chrome/browser/extensions/extension_browsertest.h"
14#include "chrome/browser/extensions/extension_service.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000015#include "chrome/browser/extensions/extension_system.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000016#include "chrome/browser/first_run/first_run.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000017#include "chrome/browser/infobars/infobar_service.h"
Ben Murdoch2385ea32013-08-06 11:01:04 +010018#include "chrome/browser/managed_mode/managed_mode_navigation_observer.h"
19#include "chrome/browser/managed_mode/managed_user_service.h"
20#include "chrome/browser/managed_mode/managed_user_service_factory.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000021#include "chrome/browser/prefs/session_startup_pref.h"
22#include "chrome/browser/profiles/profile.h"
23#include "chrome/browser/profiles/profile_impl.h"
24#include "chrome/browser/profiles/profile_manager.h"
25#include "chrome/browser/sessions/session_restore.h"
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +010026#include "chrome/browser/signin/signin_promo.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000027#include "chrome/browser/ui/browser.h"
28#include "chrome/browser/ui/browser_finder.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000029#include "chrome/browser/ui/browser_iterator.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000030#include "chrome/browser/ui/browser_list.h"
31#include "chrome/browser/ui/browser_list_observer.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000032#include "chrome/browser/ui/browser_window.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000033#include "chrome/browser/ui/host_desktop.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000034#include "chrome/browser/ui/startup/startup_browser_creator.h"
35#include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000036#include "chrome/browser/ui/tabs/tab_strip_model.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000037#include "chrome/common/chrome_switches.h"
38#include "chrome/common/pref_names.h"
39#include "chrome/common/url_constants.h"
40#include "chrome/test/base/in_process_browser_test.h"
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +010041#include "chrome/test/base/test_switches.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000042#include "chrome/test/base/ui_test_utils.h"
43#include "content/public/browser/web_contents.h"
44#include "testing/gtest/include/gtest/gtest.h"
Ben Murdoch2385ea32013-08-06 11:01:04 +010045#include "url/gurl.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010046
47#if defined(ENABLE_CONFIGURATION_POLICY) && !defined(OS_CHROMEOS)
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010048#include "base/callback.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010049#include "base/run_loop.h"
50#include "base/values.h"
51#include "chrome/browser/policy/browser_policy_connector.h"
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010052#include "chrome/browser/policy/external_data_fetcher.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010053#include "chrome/browser/policy/mock_configuration_policy_provider.h"
54#include "chrome/browser/policy/policy_map.h"
55#include "chrome/browser/policy/policy_types.h"
56#include "policy/policy_constants.h"
57#include "testing/gmock/include/gmock/gmock.h"
58
59using testing::_;
60using testing::AnyNumber;
61using testing::Return;
62#endif // defined(ENABLE_CONFIGURATION_POLICY) && !defined(OS_CHROMEOS)
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010063
Torne (Richard Coles)58218062012-11-14 11:43:16 +000064using extensions::Extension;
65
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010066namespace {
67
68// Check that there are two browsers. Find the one that is not |browser|.
69Browser* FindOneOtherBrowser(Browser* browser) {
70 // There should only be one other browser.
71 EXPECT_EQ(2u, chrome::GetBrowserCount(browser->profile(),
72 browser->host_desktop_type()));
73
74 // Find the new browser.
75 Browser* other_browser = NULL;
76 for (chrome::BrowserIterator it; !it.done() && !other_browser; it.Next()) {
77 if (*it != browser)
78 other_browser = *it;
79 }
80 return other_browser;
81}
82
83} // namespace
84
Torne (Richard Coles)58218062012-11-14 11:43:16 +000085class StartupBrowserCreatorTest : public ExtensionBrowserTest {
86 protected:
87 virtual bool SetUpUserDataDirectory() OVERRIDE {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000088 return ExtensionBrowserTest::SetUpUserDataDirectory();
89 }
90
91 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
92 ExtensionBrowserTest::SetUpCommandLine(command_line);
93 command_line->AppendSwitch(switches::kEnablePanels);
94 command_line->AppendSwitchASCII(switches::kHomePage,
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010095 content::kAboutBlankURL);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000096#if defined(OS_CHROMEOS)
97 // TODO(nkostylev): Investigate if we can remove this switch.
98 command_line->AppendSwitch(switches::kCreateBrowserOnStartupForTests);
99#endif
100 }
101
102 // Helper functions return void so that we can ASSERT*().
103 // Use ASSERT_NO_FATAL_FAILURE around calls to these functions to stop the
104 // test if an assert fails.
105 void LoadApp(const std::string& app_name,
106 const Extension** out_app_extension) {
107 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(app_name.c_str())));
108
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000109 ExtensionService* service = extensions::ExtensionSystem::Get(
110 browser()->profile())->extension_service();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000111 *out_app_extension = service->GetExtensionById(
112 last_loaded_extension_id_, false);
113 ASSERT_TRUE(*out_app_extension);
114
115 // Code that opens a new browser assumes we start with exactly one.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000116 ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile(),
117 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000118 }
119
120 void SetAppLaunchPref(const std::string& app_id,
121 extensions::ExtensionPrefs::LaunchType launch_type) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000122 ExtensionService* service = extensions::ExtensionSystem::Get(
123 browser()->profile())->extension_service();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000124 service->extension_prefs()->SetLaunchType(app_id, launch_type);
125 }
126
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000127 Browser* FindOneOtherBrowserForProfile(Profile* profile,
128 Browser* not_this_browser) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000129 for (chrome::BrowserIterator it; !it.done(); it.Next()) {
130 if (*it != not_this_browser && it->profile() == profile)
131 return *it;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000132 }
133 return NULL;
134 }
135};
136
137class OpenURLsPopupObserver : public chrome::BrowserListObserver {
138 public:
139 OpenURLsPopupObserver() : added_browser_(NULL) { }
140
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000141 virtual void OnBrowserAdded(Browser* browser) OVERRIDE {
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000142 added_browser_ = browser;
143 }
144
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000145 virtual void OnBrowserRemoved(Browser* browser) OVERRIDE { }
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000146
147 Browser* added_browser_;
148};
149
150// Test that when there is a popup as the active browser any requests to
151// StartupBrowserCreatorImpl::OpenURLsInBrowser don't crash because there's no
152// explicit profile given.
153IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenURLsPopup) {
154 std::vector<GURL> urls;
155 urls.push_back(GURL("http://localhost"));
156
157 // Note that in our testing we do not ever query the BrowserList for the "last
158 // active" browser. That's because the browsers are set as "active" by
159 // platform UI toolkit messages, and those messages are not sent during unit
160 // testing sessions.
161
162 OpenURLsPopupObserver observer;
163 BrowserList::AddObserver(&observer);
164
165 Browser* popup = new Browser(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000166 Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile(),
167 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000168 ASSERT_TRUE(popup->is_type_popup());
169 ASSERT_EQ(popup, observer.added_browser_);
170
171 CommandLine dummy(CommandLine::NO_PROGRAM);
172 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
173 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000174 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, first_run);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000175 // This should create a new window, but re-use the profile from |popup|. If
176 // it used a NULL or invalid profile, it would crash.
Ben Murdochbbcdd452013-07-25 10:06:34 +0100177 launch.OpenURLsInBrowser(popup, false, urls, chrome::GetActiveDesktop());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000178 ASSERT_NE(popup, observer.added_browser_);
179 BrowserList::RemoveObserver(&observer);
180}
181
182// We don't do non-process-startup browser launches on ChromeOS.
183// Session restore for process-startup browser launches is tested
184// in session_restore_uitest.
185#if !defined(OS_CHROMEOS)
186// Verify that startup URLs are honored when the process already exists but has
187// no tabbed browser windows (eg. as if the process is running only due to a
188// background application.
189IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
190 StartupURLsOnNewWindowWithNoTabbedBrowsers) {
191 // Use a couple same-site HTTP URLs.
192 ASSERT_TRUE(test_server()->Start());
193 std::vector<GURL> urls;
194 urls.push_back(test_server()->GetURL("files/title1.html"));
195 urls.push_back(test_server()->GetURL("files/title2.html"));
196
197 // Set the startup preference to open these URLs.
198 SessionStartupPref pref(SessionStartupPref::URLS);
199 pref.urls = urls;
200 SessionStartupPref::SetStartupPref(browser()->profile(), pref);
201
202 // Close the browser.
203 browser()->window()->Close();
204
205 // Do a simple non-process-startup browser launch.
206 CommandLine dummy(CommandLine::NO_PROGRAM);
207 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
208 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000209 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, first_run);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100210 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
211 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000212
213 // This should have created a new browser window. |browser()| is still
214 // around at this point, even though we've closed its window.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100215 Browser* new_browser = FindOneOtherBrowser(browser());
216 ASSERT_TRUE(new_browser);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000217
218 // The new browser should have one tab for each URL.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000219 TabStripModel* tab_strip = new_browser->tab_strip_model();
220 ASSERT_EQ(static_cast<int>(urls.size()), tab_strip->count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000221 for (size_t i=0; i < urls.size(); i++) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000222 EXPECT_EQ(urls[i], tab_strip->GetWebContentsAt(i)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000223 }
224
225 // The two tabs, despite having the same site, should be in different
226 // SiteInstances.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000227 EXPECT_NE(tab_strip->GetWebContentsAt(0)->GetSiteInstance(),
228 tab_strip->GetWebContentsAt(1)->GetSiteInstance());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000229}
230
231// Verify that startup URLs aren't used when the process already exists
232// and has other tabbed browser windows. This is the common case of starting a
233// new browser.
234IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
235 StartupURLsOnNewWindow) {
236 // Use a couple arbitrary URLs.
237 std::vector<GURL> urls;
238 urls.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000239 base::FilePath(base::FilePath::kCurrentDirectory),
240 base::FilePath(FILE_PATH_LITERAL("title1.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000241 urls.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000242 base::FilePath(base::FilePath::kCurrentDirectory),
243 base::FilePath(FILE_PATH_LITERAL("title2.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000244
245 // Set the startup preference to open these URLs.
246 SessionStartupPref pref(SessionStartupPref::URLS);
247 pref.urls = urls;
248 SessionStartupPref::SetStartupPref(browser()->profile(), pref);
249
250 // Do a simple non-process-startup browser launch.
251 CommandLine dummy(CommandLine::NO_PROGRAM);
252 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
253 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000254 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, first_run);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100255 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
256 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000257
258 // This should have created a new browser window.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100259 Browser* new_browser = FindOneOtherBrowser(browser());
260 ASSERT_TRUE(new_browser);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000261
262 // The new browser should have exactly one tab (not the startup URLs).
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000263 ASSERT_EQ(1, new_browser->tab_strip_model()->count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000264}
265
266// App shortcuts are not implemented on mac os.
267#if !defined(OS_MACOSX)
268IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenAppShortcutNoPref) {
269 // Load an app with launch.container = 'tab'.
270 const Extension* extension_app = NULL;
271 ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
272
273 // Add --app-id=<extension->id()> to the command line.
274 CommandLine command_line(CommandLine::NO_PROGRAM);
275 command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
276
277 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
278 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000279 StartupBrowserCreatorImpl launch(base::FilePath(), command_line, first_run);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100280 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
281 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000282
283 // No pref was set, so the app should have opened in a window.
284 // The launch should have created a new browser.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100285 Browser* new_browser = FindOneOtherBrowser(browser());
286 ASSERT_TRUE(new_browser);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000287
288 // Expect an app window.
289 EXPECT_TRUE(new_browser->is_app());
290
291 // The browser's app_name should include the app's ID.
292 EXPECT_NE(
293 new_browser->app_name_.find(extension_app->id()),
294 std::string::npos) << new_browser->app_name_;
295}
296
297IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenAppShortcutWindowPref) {
298 const Extension* extension_app = NULL;
299 ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
300
301 // Set a pref indicating that the user wants to open this app in a window.
302 SetAppLaunchPref(extension_app->id(),
303 extensions::ExtensionPrefs::LAUNCH_WINDOW);
304
305 CommandLine command_line(CommandLine::NO_PROGRAM);
306 command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
307 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
308 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000309 StartupBrowserCreatorImpl launch(base::FilePath(), command_line, first_run);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100310 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
311 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000312
313 // Pref was set to open in a window, so the app should have opened in a
314 // window. The launch should have created a new browser. Find the new
315 // browser.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100316 Browser* new_browser = FindOneOtherBrowser(browser());
317 ASSERT_TRUE(new_browser);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000318
319 // Expect an app window.
320 EXPECT_TRUE(new_browser->is_app());
321
322 // The browser's app_name should include the app's ID.
323 EXPECT_NE(
324 new_browser->app_name_.find(extension_app->id()),
325 std::string::npos) << new_browser->app_name_;
326}
327
328IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenAppShortcutTabPref) {
329 // Load an app with launch.container = 'tab'.
330 const Extension* extension_app = NULL;
331 ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
332
333 // Set a pref indicating that the user wants to open this app in a window.
334 SetAppLaunchPref(extension_app->id(),
335 extensions::ExtensionPrefs::LAUNCH_REGULAR);
336
337 CommandLine command_line(CommandLine::NO_PROGRAM);
338 command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
339 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
340 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000341 StartupBrowserCreatorImpl launch(base::FilePath(), command_line, first_run);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100342 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
343 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000344
345 // When an app shortcut is open and the pref indicates a tab should
346 // open, the tab is open in a new browser window. Expect a new window.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000347 ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
348 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000349
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100350 Browser* new_browser = FindOneOtherBrowser(browser());
351 ASSERT_TRUE(new_browser);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000352
353 // The tab should be in a tabbed window.
354 EXPECT_TRUE(new_browser->is_type_tabbed());
355
356 // The browser's app_name should not include the app's ID: It is in a
357 // normal browser.
358 EXPECT_EQ(
359 new_browser->app_name_.find(extension_app->id()),
360 std::string::npos) << new_browser->app_name_;
361}
362
363#endif // !defined(OS_MACOSX)
364
365#endif // !defined(OS_CHROMEOS)
366
367IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
368 ReadingWasRestartedAfterRestart) {
369 // Tests that StartupBrowserCreator::WasRestarted reads and resets the
370 // preference kWasRestarted correctly.
371 StartupBrowserCreator::was_restarted_read_ = false;
372 PrefService* pref_service = g_browser_process->local_state();
373 pref_service->SetBoolean(prefs::kWasRestarted, true);
374 EXPECT_TRUE(StartupBrowserCreator::WasRestarted());
375 EXPECT_FALSE(pref_service->GetBoolean(prefs::kWasRestarted));
376 EXPECT_TRUE(StartupBrowserCreator::WasRestarted());
377}
378
379IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
380 ReadingWasRestartedAfterNormalStart) {
381 // Tests that StartupBrowserCreator::WasRestarted reads and resets the
382 // preference kWasRestarted correctly.
383 StartupBrowserCreator::was_restarted_read_ = false;
384 PrefService* pref_service = g_browser_process->local_state();
385 pref_service->SetBoolean(prefs::kWasRestarted, false);
386 EXPECT_FALSE(StartupBrowserCreator::WasRestarted());
387 EXPECT_FALSE(pref_service->GetBoolean(prefs::kWasRestarted));
388 EXPECT_FALSE(StartupBrowserCreator::WasRestarted());
389}
390
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000391IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, AddFirstRunTab) {
392 StartupBrowserCreator browser_creator;
393 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
394 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title2.html"));
395
396 // Do a simple non-process-startup browser launch.
397 CommandLine dummy(CommandLine::NO_PROGRAM);
398 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
399 chrome::startup::IS_FIRST_RUN);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100400 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
401 browser()->host_desktop_type()));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000402
403 // This should have created a new browser window.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100404 Browser* new_browser = FindOneOtherBrowser(browser());
405 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000406
407 TabStripModel* tab_strip = new_browser->tab_strip_model();
408 EXPECT_EQ(2, tab_strip->count());
409
410 EXPECT_EQ("title1.html",
411 tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName());
412 EXPECT_EQ("title2.html",
413 tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName());
414}
415
416// Test hard-coded special first run tabs (defined in
417// StartupBrowserCreatorImpl::AddStartupURLs()).
418IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, AddCustomFirstRunTab) {
419 StartupBrowserCreator browser_creator;
420 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
421 browser_creator.AddFirstRunTab(GURL("http://new_tab_page"));
422 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title2.html"));
423 browser_creator.AddFirstRunTab(GURL("http://welcome_page"));
424
425 // Do a simple non-process-startup browser launch.
426 CommandLine dummy(CommandLine::NO_PROGRAM);
427 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
428 chrome::startup::IS_FIRST_RUN);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100429 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
430 browser()->host_desktop_type()));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000431
432 // This should have created a new browser window.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100433 Browser* new_browser = FindOneOtherBrowser(browser());
434 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000435
436 TabStripModel* tab_strip = new_browser->tab_strip_model();
437 EXPECT_EQ(4, tab_strip->count());
438
439 EXPECT_EQ("title1.html",
440 tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName());
441 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
442 tab_strip->GetWebContentsAt(1)->GetURL());
443 EXPECT_EQ("title2.html",
444 tab_strip->GetWebContentsAt(2)->GetURL().ExtractFileName());
445 EXPECT_EQ(internals::GetWelcomePageURL(),
446 tab_strip->GetWebContentsAt(3)->GetURL());
447}
448
449IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, SyncPromoNoWelcomePage) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000450 // Do a simple non-process-startup browser launch.
451 CommandLine dummy(CommandLine::NO_PROGRAM);
452 StartupBrowserCreatorImpl launch(base::FilePath(), dummy,
453 chrome::startup::IS_FIRST_RUN);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100454 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
455 browser()->host_desktop_type()));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000456
457 // This should have created a new browser window.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100458 Browser* new_browser = FindOneOtherBrowser(browser());
459 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000460
461 TabStripModel* tab_strip = new_browser->tab_strip_model();
462 EXPECT_EQ(1, tab_strip->count());
463
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100464 if (signin::ShouldShowPromoAtStartup(browser()->profile(), true)) {
Ben Murdoch2385ea32013-08-06 11:01:04 +0100465 EXPECT_EQ(signin::GetPromoURL(signin::SOURCE_START_PAGE, false),
466 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000467 } else {
468 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
469 tab_strip->GetWebContentsAt(0)->GetURL());
470 }
471}
472
473IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, SyncPromoWithWelcomePage) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000474 first_run::SetShouldShowWelcomePage();
475
476 // Do a simple non-process-startup browser launch.
477 CommandLine dummy(CommandLine::NO_PROGRAM);
478 StartupBrowserCreatorImpl launch(base::FilePath(), dummy,
479 chrome::startup::IS_FIRST_RUN);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100480 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
481 browser()->host_desktop_type()));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000482
483 // This should have created a new browser window.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100484 Browser* new_browser = FindOneOtherBrowser(browser());
485 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000486
487 TabStripModel* tab_strip = new_browser->tab_strip_model();
488 EXPECT_EQ(2, tab_strip->count());
489
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100490 if (signin::ShouldShowPromoAtStartup(browser()->profile(), true)) {
Ben Murdoch2385ea32013-08-06 11:01:04 +0100491 EXPECT_EQ(signin::GetPromoURL(signin::SOURCE_START_PAGE, false),
492 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000493 } else {
494 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
495 tab_strip->GetWebContentsAt(0)->GetURL());
496 }
497 EXPECT_EQ(internals::GetWelcomePageURL(),
498 tab_strip->GetWebContentsAt(1)->GetURL());
499}
500
501IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, SyncPromoWithFirstRunTabs) {
502 StartupBrowserCreator browser_creator;
503 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
504
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000505 // The welcome page should not be shown, even if
506 // first_run::ShouldShowWelcomePage() says so, when there are already
507 // more than 2 first run tabs.
508 first_run::SetShouldShowWelcomePage();
509
510 // Do a simple non-process-startup browser launch.
511 CommandLine dummy(CommandLine::NO_PROGRAM);
512 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
513 chrome::startup::IS_FIRST_RUN);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100514 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
515 browser()->host_desktop_type()));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000516
517 // This should have created a new browser window.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100518 Browser* new_browser = FindOneOtherBrowser(browser());
519 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000520
521 TabStripModel* tab_strip = new_browser->tab_strip_model();
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100522 if (signin::ShouldShowPromoAtStartup(browser()->profile(), true)) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000523 EXPECT_EQ(2, tab_strip->count());
Ben Murdoch2385ea32013-08-06 11:01:04 +0100524 EXPECT_EQ(signin::GetPromoURL(signin::SOURCE_START_PAGE, false),
525 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000526 EXPECT_EQ("title1.html",
527 tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName());
528 } else {
529 EXPECT_EQ(1, tab_strip->count());
530 EXPECT_EQ("title1.html",
531 tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName());
532 }
533}
534
535// The welcome page should still be shown if there are more than 2 first run
536// tabs, but the welcome page was explcitly added to the first run tabs.
537IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
538 SyncPromoWithFirstRunTabsIncludingWelcomePage) {
539 StartupBrowserCreator browser_creator;
540 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
541 browser_creator.AddFirstRunTab(GURL("http://welcome_page"));
542
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000543 // Do a simple non-process-startup browser launch.
544 CommandLine dummy(CommandLine::NO_PROGRAM);
545 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
546 chrome::startup::IS_FIRST_RUN);
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100547 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
548 browser()->host_desktop_type()));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000549
550 // This should have created a new browser window.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100551 Browser* new_browser = FindOneOtherBrowser(browser());
552 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000553
554 TabStripModel* tab_strip = new_browser->tab_strip_model();
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100555 if (signin::ShouldShowPromoAtStartup(browser()->profile(), true)) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000556 EXPECT_EQ(3, tab_strip->count());
Ben Murdoch2385ea32013-08-06 11:01:04 +0100557 EXPECT_EQ(signin::GetPromoURL(signin::SOURCE_START_PAGE, false),
558 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000559 EXPECT_EQ("title1.html",
560 tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName());
561 EXPECT_EQ(internals::GetWelcomePageURL(),
562 tab_strip->GetWebContentsAt(2)->GetURL());
563 } else {
564 EXPECT_EQ(2, tab_strip->count());
565 EXPECT_EQ("title1.html",
566 tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName());
567 EXPECT_EQ(internals::GetWelcomePageURL(),
568 tab_strip->GetWebContentsAt(1)->GetURL());
569 }
570}
571
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000572#if !defined(OS_CHROMEOS)
573IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, StartupURLsForTwoProfiles) {
Ben Murdoch558790d2013-07-30 15:19:42 +0100574#if defined(OS_WIN) && defined(USE_ASH)
575 // Disable this test in Metro+Ash for now (http://crbug.com/262796).
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100576 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
Ben Murdoch558790d2013-07-30 15:19:42 +0100577 return;
578#endif
579
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000580 Profile* default_profile = browser()->profile();
581
582 ProfileManager* profile_manager = g_browser_process->profile_manager();
583 // Create another profile.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000584 base::FilePath dest_path = profile_manager->user_data_dir();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000585 dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile 1"));
586
587 Profile* other_profile = profile_manager->GetProfile(dest_path);
588 ASSERT_TRUE(other_profile);
589
590 // Use a couple arbitrary URLs.
591 std::vector<GURL> urls1;
592 urls1.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000593 base::FilePath(base::FilePath::kCurrentDirectory),
594 base::FilePath(FILE_PATH_LITERAL("title1.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000595 std::vector<GURL> urls2;
596 urls2.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000597 base::FilePath(base::FilePath::kCurrentDirectory),
598 base::FilePath(FILE_PATH_LITERAL("title2.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000599
600 // Set different startup preferences for the 2 profiles.
601 SessionStartupPref pref1(SessionStartupPref::URLS);
602 pref1.urls = urls1;
603 SessionStartupPref::SetStartupPref(default_profile, pref1);
604 SessionStartupPref pref2(SessionStartupPref::URLS);
605 pref2.urls = urls2;
606 SessionStartupPref::SetStartupPref(other_profile, pref2);
607
608 // Close the browser.
609 browser()->window()->Close();
610
611 // Do a simple non-process-startup browser launch.
612 CommandLine dummy(CommandLine::NO_PROGRAM);
613
614 int return_code;
615 StartupBrowserCreator browser_creator;
616 std::vector<Profile*> last_opened_profiles;
617 last_opened_profiles.push_back(default_profile);
618 last_opened_profiles.push_back(other_profile);
619 browser_creator.Start(dummy, profile_manager->user_data_dir(),
620 default_profile, last_opened_profiles, &return_code);
621
622 // urls1 were opened in a browser for default_profile, and urls2 were opened
623 // in a browser for other_profile.
624 Browser* new_browser = NULL;
625 // |browser()| is still around at this point, even though we've closed its
626 // window. Thus the browser count for default_profile is 2.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000627 ASSERT_EQ(2u, chrome::GetBrowserCount(default_profile,
628 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000629 new_browser = FindOneOtherBrowserForProfile(default_profile, browser());
630 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000631 TabStripModel* tab_strip = new_browser->tab_strip_model();
632 ASSERT_EQ(1, tab_strip->count());
633 EXPECT_EQ(urls1[0], tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000634
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000635 ASSERT_EQ(1u, chrome::GetBrowserCount(other_profile,
636 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000637 new_browser = FindOneOtherBrowserForProfile(other_profile, NULL);
638 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000639 tab_strip = new_browser->tab_strip_model();
640 ASSERT_EQ(1, tab_strip->count());
641 EXPECT_EQ(urls2[0], tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000642}
643
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100644IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, PRE_UpdateWithTwoProfiles) {
645 // Simulate a browser restart by creating the profiles in the PRE_ part.
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000646 ProfileManager* profile_manager = g_browser_process->profile_manager();
647
648 // Create two profiles.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000649 base::FilePath dest_path = profile_manager->user_data_dir();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000650
651 Profile* profile1 = profile_manager->GetProfile(
652 dest_path.Append(FILE_PATH_LITERAL("New Profile 1")));
653 ASSERT_TRUE(profile1);
654
655 Profile* profile2 = profile_manager->GetProfile(
656 dest_path.Append(FILE_PATH_LITERAL("New Profile 2")));
657 ASSERT_TRUE(profile2);
658
659 // Use a couple arbitrary URLs.
660 std::vector<GURL> urls1;
661 urls1.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000662 base::FilePath(base::FilePath::kCurrentDirectory),
663 base::FilePath(FILE_PATH_LITERAL("title1.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000664 std::vector<GURL> urls2;
665 urls2.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000666 base::FilePath(base::FilePath::kCurrentDirectory),
667 base::FilePath(FILE_PATH_LITERAL("title2.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000668
669 // Set different startup preferences for the 2 profiles.
670 SessionStartupPref pref1(SessionStartupPref::URLS);
671 pref1.urls = urls1;
672 SessionStartupPref::SetStartupPref(profile1, pref1);
673 SessionStartupPref pref2(SessionStartupPref::URLS);
674 pref2.urls = urls2;
675 SessionStartupPref::SetStartupPref(profile2, pref2);
676
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100677 profile1->GetPrefs()->CommitPendingWrite();
678 profile2->GetPrefs()->CommitPendingWrite();
679}
680
681IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, UpdateWithTwoProfiles) {
Ben Murdoch558790d2013-07-30 15:19:42 +0100682#if defined(OS_WIN) && defined(USE_ASH)
683 // Disable this test in Metro+Ash for now (http://crbug.com/262796).
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100684 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
Ben Murdoch558790d2013-07-30 15:19:42 +0100685 return;
686#endif
687
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100688 // Make StartupBrowserCreator::WasRestarted() return true.
689 StartupBrowserCreator::was_restarted_read_ = false;
690 PrefService* pref_service = g_browser_process->local_state();
691 pref_service->SetBoolean(prefs::kWasRestarted, true);
692
693 ProfileManager* profile_manager = g_browser_process->profile_manager();
694
695 // Open the two profiles.
696 base::FilePath dest_path = profile_manager->user_data_dir();
697
698 Profile* profile1 = profile_manager->GetProfile(
699 dest_path.Append(FILE_PATH_LITERAL("New Profile 1")));
700 ASSERT_TRUE(profile1);
701
702 Profile* profile2 = profile_manager->GetProfile(
703 dest_path.Append(FILE_PATH_LITERAL("New Profile 2")));
704 ASSERT_TRUE(profile2);
705
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000706 // Simulate a launch after a browser update.
707 CommandLine dummy(CommandLine::NO_PROGRAM);
708 int return_code;
709 StartupBrowserCreator browser_creator;
710 std::vector<Profile*> last_opened_profiles;
711 last_opened_profiles.push_back(profile1);
712 last_opened_profiles.push_back(profile2);
713 browser_creator.Start(dummy, profile_manager->user_data_dir(), profile1,
714 last_opened_profiles, &return_code);
715
716 while (SessionRestore::IsRestoring(profile1) ||
717 SessionRestore::IsRestoring(profile2))
Torne (Richard Coles)b2df76e2013-05-13 16:52:09 +0100718 base::MessageLoop::current()->RunUntilIdle();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000719
720 // The startup URLs are ignored, and instead the last open sessions are
721 // restored.
722 EXPECT_TRUE(profile1->restored_last_session());
723 EXPECT_TRUE(profile2->restored_last_session());
724
725 Browser* new_browser = NULL;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000726 ASSERT_EQ(1u, chrome::GetBrowserCount(profile1,
727 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000728 new_browser = FindOneOtherBrowserForProfile(profile1, NULL);
729 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000730 TabStripModel* tab_strip = new_browser->tab_strip_model();
731 ASSERT_EQ(1, tab_strip->count());
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100732 EXPECT_EQ(GURL(content::kAboutBlankURL),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000733 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000734
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000735 ASSERT_EQ(1u, chrome::GetBrowserCount(profile2,
736 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000737 new_browser = FindOneOtherBrowserForProfile(profile2, NULL);
738 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000739 tab_strip = new_browser->tab_strip_model();
740 ASSERT_EQ(1, tab_strip->count());
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100741 EXPECT_EQ(GURL(content::kAboutBlankURL),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000742 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000743}
744
745IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
746 ProfilesWithoutPagesNotLaunched) {
Ben Murdoch558790d2013-07-30 15:19:42 +0100747#if defined(OS_WIN) && defined(USE_ASH)
748 // Disable this test in Metro+Ash for now (http://crbug.com/262796).
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100749 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
Ben Murdoch558790d2013-07-30 15:19:42 +0100750 return;
751#endif
752
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000753 Profile* default_profile = browser()->profile();
754
755 ProfileManager* profile_manager = g_browser_process->profile_manager();
756
757 // Create 4 more profiles.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000758 base::FilePath dest_path1 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000759 FILE_PATH_LITERAL("New Profile 1"));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000760 base::FilePath dest_path2 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000761 FILE_PATH_LITERAL("New Profile 2"));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000762 base::FilePath dest_path3 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000763 FILE_PATH_LITERAL("New Profile 3"));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000764 base::FilePath dest_path4 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000765 FILE_PATH_LITERAL("New Profile 4"));
766
767 Profile* profile_home1 = profile_manager->GetProfile(dest_path1);
768 ASSERT_TRUE(profile_home1);
769 Profile* profile_home2 = profile_manager->GetProfile(dest_path2);
770 ASSERT_TRUE(profile_home2);
771 Profile* profile_last = profile_manager->GetProfile(dest_path3);
772 ASSERT_TRUE(profile_last);
773 Profile* profile_urls = profile_manager->GetProfile(dest_path4);
774 ASSERT_TRUE(profile_urls);
775
776 // Set the profiles to open urls, open last visited pages or display the home
777 // page.
778 SessionStartupPref pref_home(SessionStartupPref::DEFAULT);
779 SessionStartupPref::SetStartupPref(profile_home1, pref_home);
780 SessionStartupPref::SetStartupPref(profile_home2, pref_home);
781
782 SessionStartupPref pref_last(SessionStartupPref::LAST);
783 SessionStartupPref::SetStartupPref(profile_last, pref_last);
784
785 std::vector<GURL> urls;
786 urls.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000787 base::FilePath(base::FilePath::kCurrentDirectory),
788 base::FilePath(FILE_PATH_LITERAL("title1.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000789
790 SessionStartupPref pref_urls(SessionStartupPref::URLS);
791 pref_urls.urls = urls;
792 SessionStartupPref::SetStartupPref(profile_urls, pref_urls);
793
794 // Close the browser.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000795 chrome::HostDesktopType original_desktop_type =
796 browser()->host_desktop_type();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000797 browser()->window()->Close();
798
799 // Do a simple non-process-startup browser launch.
800 CommandLine dummy(CommandLine::NO_PROGRAM);
801
802 int return_code;
803 StartupBrowserCreator browser_creator;
804 std::vector<Profile*> last_opened_profiles;
805 last_opened_profiles.push_back(profile_home1);
806 last_opened_profiles.push_back(profile_home2);
807 last_opened_profiles.push_back(profile_last);
808 last_opened_profiles.push_back(profile_urls);
809 browser_creator.Start(dummy, profile_manager->user_data_dir(), profile_home1,
810 last_opened_profiles, &return_code);
811
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000812 while (SessionRestore::IsRestoring(default_profile) ||
813 SessionRestore::IsRestoring(profile_home1) ||
814 SessionRestore::IsRestoring(profile_home2) ||
815 SessionRestore::IsRestoring(profile_last) ||
816 SessionRestore::IsRestoring(profile_urls))
Torne (Richard Coles)b2df76e2013-05-13 16:52:09 +0100817 base::MessageLoop::current()->RunUntilIdle();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000818
819 Browser* new_browser = NULL;
820 // The last open profile (the profile_home1 in this case) will always be
821 // launched, even if it will open just the home page.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000822 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_home1, original_desktop_type));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000823 new_browser = FindOneOtherBrowserForProfile(profile_home1, NULL);
824 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000825 TabStripModel* tab_strip = new_browser->tab_strip_model();
826 ASSERT_EQ(1, tab_strip->count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000827 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000828 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000829
830 // profile_urls opened the urls.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000831 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_urls, original_desktop_type));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000832 new_browser = FindOneOtherBrowserForProfile(profile_urls, NULL);
833 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000834 tab_strip = new_browser->tab_strip_model();
835 ASSERT_EQ(1, tab_strip->count());
836 EXPECT_EQ(urls[0], tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000837
838 // profile_last opened the last open pages.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000839 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_last, original_desktop_type));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000840 new_browser = FindOneOtherBrowserForProfile(profile_last, NULL);
841 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000842 tab_strip = new_browser->tab_strip_model();
843 ASSERT_EQ(1, tab_strip->count());
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100844 EXPECT_EQ(GURL(content::kAboutBlankURL),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000845 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000846
847 // profile_home2 was not launched since it would've only opened the home page.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000848 ASSERT_EQ(0u, chrome::GetBrowserCount(profile_home2, original_desktop_type));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000849}
850
851IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, ProfilesLaunchedAfterCrash) {
Ben Murdoch558790d2013-07-30 15:19:42 +0100852#if defined(OS_WIN) && defined(USE_ASH)
853 // Disable this test in Metro+Ash for now (http://crbug.com/262796).
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100854 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
Ben Murdoch558790d2013-07-30 15:19:42 +0100855 return;
856#endif
857
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000858 // After an unclean exit, all profiles will be launched. However, they won't
859 // open any pages automatically.
860
861 ProfileManager* profile_manager = g_browser_process->profile_manager();
862
863 // Create 3 profiles.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000864 base::FilePath dest_path1 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000865 FILE_PATH_LITERAL("New Profile 1"));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000866 base::FilePath dest_path2 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000867 FILE_PATH_LITERAL("New Profile 2"));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000868 base::FilePath dest_path3 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000869 FILE_PATH_LITERAL("New Profile 3"));
870
871 Profile* profile_home = profile_manager->GetProfile(dest_path1);
872 ASSERT_TRUE(profile_home);
873 Profile* profile_last = profile_manager->GetProfile(dest_path2);
874 ASSERT_TRUE(profile_last);
875 Profile* profile_urls = profile_manager->GetProfile(dest_path3);
876 ASSERT_TRUE(profile_urls);
877
878 // Set the profiles to open the home page, last visited pages or URLs.
879 SessionStartupPref pref_home(SessionStartupPref::DEFAULT);
880 SessionStartupPref::SetStartupPref(profile_home, pref_home);
881
882 SessionStartupPref pref_last(SessionStartupPref::LAST);
883 SessionStartupPref::SetStartupPref(profile_last, pref_last);
884
885 std::vector<GURL> urls;
886 urls.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000887 base::FilePath(base::FilePath::kCurrentDirectory),
888 base::FilePath(FILE_PATH_LITERAL("title1.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000889
890 SessionStartupPref pref_urls(SessionStartupPref::URLS);
891 pref_urls.urls = urls;
892 SessionStartupPref::SetStartupPref(profile_urls, pref_urls);
893
894 // Simulate a launch after an unclear exit.
895 browser()->window()->Close();
896 static_cast<ProfileImpl*>(profile_home)->last_session_exit_type_ =
897 Profile::EXIT_CRASHED;
898 static_cast<ProfileImpl*>(profile_last)->last_session_exit_type_ =
899 Profile::EXIT_CRASHED;
900 static_cast<ProfileImpl*>(profile_urls)->last_session_exit_type_ =
901 Profile::EXIT_CRASHED;
902
903 CommandLine dummy(CommandLine::NO_PROGRAM);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000904 dummy.AppendSwitchASCII(switches::kTestType, "browser");
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000905 int return_code;
906 StartupBrowserCreator browser_creator;
907 std::vector<Profile*> last_opened_profiles;
908 last_opened_profiles.push_back(profile_home);
909 last_opened_profiles.push_back(profile_last);
910 last_opened_profiles.push_back(profile_urls);
911 browser_creator.Start(dummy, profile_manager->user_data_dir(), profile_home,
912 last_opened_profiles, &return_code);
913
914 // No profiles are getting restored, since they all display the crash info
915 // bar.
916 EXPECT_FALSE(SessionRestore::IsRestoring(profile_home));
917 EXPECT_FALSE(SessionRestore::IsRestoring(profile_last));
918 EXPECT_FALSE(SessionRestore::IsRestoring(profile_urls));
919
920 // The profile which normally opens the home page displays the new tab page.
921 Browser* new_browser = NULL;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000922 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_home,
923 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000924 new_browser = FindOneOtherBrowserForProfile(profile_home, NULL);
925 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000926 TabStripModel* tab_strip = new_browser->tab_strip_model();
927 ASSERT_EQ(1, tab_strip->count());
928 content::WebContents* web_contents = tab_strip->GetWebContentsAt(0);
929 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), web_contents->GetURL());
930 EXPECT_EQ(1U,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100931 InfoBarService::FromWebContents(web_contents)->infobar_count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000932
933 // The profile which normally opens last open pages displays the new tab page.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000934 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_last,
935 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000936 new_browser = FindOneOtherBrowserForProfile(profile_last, NULL);
937 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000938 tab_strip = new_browser->tab_strip_model();
939 ASSERT_EQ(1, tab_strip->count());
940 web_contents = tab_strip->GetWebContentsAt(0);
941 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), web_contents->GetURL());
942 EXPECT_EQ(1U,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100943 InfoBarService::FromWebContents(web_contents)->infobar_count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000944
945 // The profile which normally opens URLs displays the new tab page.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000946 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_urls,
947 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000948 new_browser = FindOneOtherBrowserForProfile(profile_urls, NULL);
949 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000950 tab_strip = new_browser->tab_strip_model();
951 ASSERT_EQ(1, tab_strip->count());
952 web_contents = tab_strip->GetWebContentsAt(0);
953 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), web_contents->GetURL());
954 EXPECT_EQ(1U,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100955 InfoBarService::FromWebContents(web_contents)->infobar_count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000956}
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100957
958class ManagedModeBrowserCreatorTest : public InProcessBrowserTest {
959 protected:
960 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
961 InProcessBrowserTest::SetUpCommandLine(command_line);
962 command_line->AppendSwitch(switches::kEnableManagedUsers);
963 }
964};
965
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100966IN_PROC_BROWSER_TEST_F(ManagedModeBrowserCreatorTest,
967 StartupManagedModeProfile) {
968 // Make this a managed profile.
969 ManagedUserService* managed_user_service =
970 ManagedUserServiceFactory::GetForProfile(browser()->profile());
971 managed_user_service->InitForTesting();
972
973 StartupBrowserCreator browser_creator;
974
975 // Do a simple non-process-startup browser launch.
976 CommandLine dummy(CommandLine::NO_PROGRAM);
977 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
978 chrome::startup::IS_FIRST_RUN);
979 content::WindowedNotificationObserver observer(
980 content::NOTIFICATION_LOAD_STOP,
981 content::NotificationService::AllSources());
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100982 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false,
983 browser()->host_desktop_type()));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100984
985 // This should have created a new browser window.
986 Browser* new_browser = FindOneOtherBrowser(browser());
987 ASSERT_TRUE(new_browser);
988
989 TabStripModel* tab_strip = new_browser->tab_strip_model();
990 // There should be only one tab.
991 EXPECT_EQ(1, tab_strip->count());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100992}
993
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100994#endif // !defined(OS_CHROMEOS)
995
996// These tests are not applicable to Chrome OS as neither master_preferences nor
997// the sync promo exist there.
998#if !defined(OS_CHROMEOS)
999
1000// On a branded Linux build, policy is required to suppress the first-run
1001// dialog.
1002#if !defined(OS_LINUX) || !defined(GOOGLE_CHROME_BUILD) || \
1003 defined(ENABLE_CONFIGURATION_POLICY)
1004
1005class StartupBrowserCreatorFirstRunTest : public InProcessBrowserTest {
1006 protected:
Ben Murdoch2385ea32013-08-06 11:01:04 +01001007 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE;
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001008 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE;
1009
1010#if defined(ENABLE_CONFIGURATION_POLICY)
1011 policy::MockConfigurationPolicyProvider provider_;
1012 policy::PolicyMap policy_map_;
1013#endif // defined(ENABLE_CONFIGURATION_POLICY)
1014};
1015
Ben Murdoch2385ea32013-08-06 11:01:04 +01001016void StartupBrowserCreatorFirstRunTest::SetUpCommandLine(
1017 CommandLine* command_line) {
1018 command_line->AppendSwitch(switches::kForceFirstRun);
1019}
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001020
Ben Murdoch2385ea32013-08-06 11:01:04 +01001021void StartupBrowserCreatorFirstRunTest::SetUpInProcessBrowserTestFixture() {
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001022#if defined(ENABLE_CONFIGURATION_POLICY)
1023#if defined(OS_LINUX) && defined(GOOGLE_CHROME_BUILD)
1024 // Set a policy that prevents the first-run dialog from being shown.
1025 policy_map_.Set(policy::key::kMetricsReportingEnabled,
1026 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
Ben Murdoch7dbb3d52013-07-17 14:55:54 +01001027 base::Value::CreateBooleanValue(false), NULL);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001028 provider_.UpdateChromePolicy(policy_map_);
1029#endif // defined(OS_LINUX) && defined(GOOGLE_CHROME_BUILD)
1030
1031 EXPECT_CALL(provider_, IsInitializationComplete(_))
1032 .WillRepeatedly(Return(true));
1033 EXPECT_CALL(provider_, RegisterPolicyDomain(_)).Times(AnyNumber());
1034 policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
1035#endif // defined(ENABLE_CONFIGURATION_POLICY)
1036}
1037
1038IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest, SyncPromoForbidden) {
1039 // Consistently enable the welcome page on all platforms.
1040 first_run::SetShouldShowWelcomePage();
1041
1042 // Simulate the following master_preferences:
1043 // {
1044 // "sync_promo": {
1045 // "show_on_first_run_allowed": false
1046 // }
1047 // }
1048 StartupBrowserCreator browser_creator;
1049 browser()->profile()->GetPrefs()->SetBoolean(
Ben Murdochbb1529c2013-08-08 10:24:53 +01001050 prefs::kSignInPromoShowOnFirstRunAllowed, false);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001051
1052 // Do a process-startup browser launch.
1053 CommandLine dummy(CommandLine::NO_PROGRAM);
1054 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
1055 chrome::startup::IS_FIRST_RUN);
1056 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), true,
1057 browser()->host_desktop_type()));
1058
1059 // This should have created a new browser window.
1060 Browser* new_browser = FindOneOtherBrowser(browser());
1061 ASSERT_TRUE(new_browser);
1062
1063 // Verify that the NTP and the welcome page are shown.
1064 TabStripModel* tab_strip = new_browser->tab_strip_model();
1065 ASSERT_EQ(2, tab_strip->count());
1066 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
1067 tab_strip->GetWebContentsAt(0)->GetURL());
1068 EXPECT_EQ(internals::GetWelcomePageURL(),
1069 tab_strip->GetWebContentsAt(1)->GetURL());
1070}
1071
1072IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest, SyncPromoAllowed) {
1073 // Consistently enable the welcome page on all platforms.
1074 first_run::SetShouldShowWelcomePage();
1075
1076 // Simulate the following master_preferences:
1077 // {
1078 // "sync_promo": {
1079 // "show_on_first_run_allowed": true
1080 // }
1081 // }
1082 StartupBrowserCreator browser_creator;
1083 browser()->profile()->GetPrefs()->SetBoolean(
Ben Murdochbb1529c2013-08-08 10:24:53 +01001084 prefs::kSignInPromoShowOnFirstRunAllowed, true);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001085
1086 // Do a process-startup browser launch.
1087 CommandLine dummy(CommandLine::NO_PROGRAM);
1088 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
1089 chrome::startup::IS_FIRST_RUN);
1090 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), true,
1091 browser()->host_desktop_type()));
1092
1093 // This should have created a new browser window.
1094 Browser* new_browser = FindOneOtherBrowser(browser());
1095 ASSERT_TRUE(new_browser);
1096
1097 // Verify that the sync promo and the welcome page are shown.
1098 TabStripModel* tab_strip = new_browser->tab_strip_model();
1099 ASSERT_EQ(2, tab_strip->count());
Ben Murdoch2385ea32013-08-06 11:01:04 +01001100 EXPECT_EQ(signin::GetPromoURL(signin::SOURCE_START_PAGE, false),
1101 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001102 EXPECT_EQ(internals::GetWelcomePageURL(),
1103 tab_strip->GetWebContentsAt(1)->GetURL());
1104}
1105
1106IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest,
1107 FirstRunTabsPromoAllowed) {
1108 // Simulate the following master_preferences:
1109 // {
1110 // "first_run_tabs" : [
1111 // "files/title1.html"
1112 // ],
1113 // "sync_promo": {
1114 // "show_on_first_run_allowed": true
1115 // }
1116 // }
1117 StartupBrowserCreator browser_creator;
1118 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
1119 browser()->profile()->GetPrefs()->SetBoolean(
Ben Murdochbb1529c2013-08-08 10:24:53 +01001120 prefs::kSignInPromoShowOnFirstRunAllowed, true);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001121
1122 // Do a process-startup browser launch.
1123 CommandLine dummy(CommandLine::NO_PROGRAM);
1124 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
1125 chrome::startup::IS_FIRST_RUN);
1126 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), true,
1127 browser()->host_desktop_type()));
1128
1129 // This should have created a new browser window.
1130 Browser* new_browser = FindOneOtherBrowser(browser());
1131 ASSERT_TRUE(new_browser);
1132
1133 // Verify that the first-run tab is shown and the sync promo has been added.
1134 TabStripModel* tab_strip = new_browser->tab_strip_model();
1135 ASSERT_EQ(2, tab_strip->count());
Ben Murdoch2385ea32013-08-06 11:01:04 +01001136 EXPECT_EQ(signin::GetPromoURL(signin::SOURCE_START_PAGE, false),
1137 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001138 EXPECT_EQ("title1.html",
1139 tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName());
1140}
1141
1142IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest,
1143 FirstRunTabsContainSyncPromo) {
1144 // Simulate the following master_preferences:
1145 // {
1146 // "first_run_tabs" : [
1147 // "files/title1.html",
1148 // "chrome://signin/?source=0&next_page=chrome%3A%2F%2Fnewtab%2F"
1149 // ],
1150 // "sync_promo": {
1151 // "show_on_first_run_allowed": true
1152 // }
1153 // }
1154 StartupBrowserCreator browser_creator;
1155 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +01001156 browser_creator.AddFirstRunTab(signin::GetPromoURL(signin::SOURCE_START_PAGE,
1157 false));
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001158 browser()->profile()->GetPrefs()->SetBoolean(
Ben Murdochbb1529c2013-08-08 10:24:53 +01001159 prefs::kSignInPromoShowOnFirstRunAllowed, true);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001160
1161 // Do a process-startup browser launch.
1162 CommandLine dummy(CommandLine::NO_PROGRAM);
1163 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
1164 chrome::startup::IS_FIRST_RUN);
1165 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), true,
1166 browser()->host_desktop_type()));
1167
1168 // This should have created a new browser window.
1169 Browser* new_browser = FindOneOtherBrowser(browser());
1170 ASSERT_TRUE(new_browser);
1171
1172 // Verify that the first-run tabs are shown and no sync promo has been added
1173 // as the first-run tabs contain it already.
1174 TabStripModel* tab_strip = new_browser->tab_strip_model();
1175 ASSERT_EQ(2, tab_strip->count());
1176 EXPECT_EQ("title1.html",
1177 tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName());
Ben Murdoch2385ea32013-08-06 11:01:04 +01001178 EXPECT_EQ(signin::GetPromoURL(signin::SOURCE_START_PAGE, false),
1179 tab_strip->GetWebContentsAt(1)->GetURL());
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001180}
1181
1182IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest,
1183 FirstRunTabsContainNTPSyncPromoAllowed) {
1184 // Simulate the following master_preferences:
1185 // {
1186 // "first_run_tabs" : [
1187 // "new_tab_page",
1188 // "files/title1.html"
1189 // ],
1190 // "sync_promo": {
1191 // "show_on_first_run_allowed": true
1192 // }
1193 // }
1194 StartupBrowserCreator browser_creator;
1195 browser_creator.AddFirstRunTab(GURL("new_tab_page"));
1196 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
1197 browser()->profile()->GetPrefs()->SetBoolean(
Ben Murdochbb1529c2013-08-08 10:24:53 +01001198 prefs::kSignInPromoShowOnFirstRunAllowed, true);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001199
1200 // Do a process-startup browser launch.
1201 CommandLine dummy(CommandLine::NO_PROGRAM);
1202 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
1203 chrome::startup::IS_FIRST_RUN);
1204 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), true,
1205 browser()->host_desktop_type()));
1206
1207 // This should have created a new browser window.
1208 Browser* new_browser = FindOneOtherBrowser(browser());
1209 ASSERT_TRUE(new_browser);
1210
1211 // Verify that the first-run tabs are shown but the NTP that they contain has
1212 // been replaced by the sync promo.
1213 TabStripModel* tab_strip = new_browser->tab_strip_model();
1214 ASSERT_EQ(2, tab_strip->count());
Ben Murdoch2385ea32013-08-06 11:01:04 +01001215 EXPECT_EQ(signin::GetPromoURL(signin::SOURCE_START_PAGE, false),
1216 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001217 EXPECT_EQ("title1.html",
1218 tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName());
1219}
1220
1221IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest,
1222 FirstRunTabsContainNTPSyncPromoForbidden) {
1223 // Simulate the following master_preferences:
1224 // {
1225 // "first_run_tabs" : [
1226 // "new_tab_page",
1227 // "files/title1.html"
1228 // ],
1229 // "sync_promo": {
1230 // "show_on_first_run_allowed": false
1231 // }
1232 // }
1233 StartupBrowserCreator browser_creator;
1234 browser_creator.AddFirstRunTab(GURL("new_tab_page"));
1235 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
1236 browser()->profile()->GetPrefs()->SetBoolean(
Ben Murdochbb1529c2013-08-08 10:24:53 +01001237 prefs::kSignInPromoShowOnFirstRunAllowed, false);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001238
1239 // Do a process-startup browser launch.
1240 CommandLine dummy(CommandLine::NO_PROGRAM);
1241 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
1242 chrome::startup::IS_FIRST_RUN);
1243 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), true,
1244 browser()->host_desktop_type()));
1245
1246 // This should have created a new browser window.
1247 Browser* new_browser = FindOneOtherBrowser(browser());
1248 ASSERT_TRUE(new_browser);
1249
1250 // Verify that the first-run tabs are shown, the NTP that they contain has not
1251 // not been replaced by the sync promo and no sync promo has been added.
1252 TabStripModel* tab_strip = new_browser->tab_strip_model();
1253 ASSERT_EQ(2, tab_strip->count());
1254 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
1255 tab_strip->GetWebContentsAt(0)->GetURL());
1256 EXPECT_EQ("title1.html",
1257 tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName());
1258}
1259
1260IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest,
1261 FirstRunTabsSyncPromoForbidden) {
1262 // Simulate the following master_preferences:
1263 // {
1264 // "first_run_tabs" : [
1265 // "files/title1.html"
1266 // ],
1267 // "sync_promo": {
1268 // "show_on_first_run_allowed": false
1269 // }
1270 // }
1271 StartupBrowserCreator browser_creator;
1272 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
1273 browser()->profile()->GetPrefs()->SetBoolean(
Ben Murdochbb1529c2013-08-08 10:24:53 +01001274 prefs::kSignInPromoShowOnFirstRunAllowed, false);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001275
1276 // Do a process-startup browser launch.
1277 CommandLine dummy(CommandLine::NO_PROGRAM);
1278 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
1279 chrome::startup::IS_FIRST_RUN);
1280 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), true,
1281 browser()->host_desktop_type()));
1282
1283 // This should have created a new browser window.
1284 Browser* new_browser = FindOneOtherBrowser(browser());
1285 ASSERT_TRUE(new_browser);
1286
1287 // Verify that the first-run tab is shown and no sync promo has been added.
1288 TabStripModel* tab_strip = new_browser->tab_strip_model();
1289 ASSERT_EQ(1, tab_strip->count());
1290 EXPECT_EQ("title1.html",
1291 tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName());
1292}
1293
1294#if defined(ENABLE_CONFIGURATION_POLICY)
1295IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorFirstRunTest,
1296 RestoreOnStartupURLsPolicySpecified) {
1297 // Simulate the following master_preferences:
1298 // {
1299 // "sync_promo": {
1300 // "show_on_first_run_allowed": true
1301 // }
1302 // }
1303 StartupBrowserCreator browser_creator;
1304 browser()->profile()->GetPrefs()->SetBoolean(
Ben Murdochbb1529c2013-08-08 10:24:53 +01001305 prefs::kSignInPromoShowOnFirstRunAllowed, true);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001306
1307 // Set the following user policies:
1308 // * RestoreOnStartup = RestoreOnStartupIsURLs
1309 // * RestoreOnStartupURLs = [ "files/title1.html" ]
1310 policy_map_.Set(policy::key::kRestoreOnStartup,
1311 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
1312 base::Value::CreateIntegerValue(
Ben Murdoch7dbb3d52013-07-17 14:55:54 +01001313 SessionStartupPref::kPrefValueURLs),
1314 NULL);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001315 base::ListValue startup_urls;
1316 startup_urls.Append(base::Value::CreateStringValue(
1317 test_server()->GetURL("files/title1.html").spec()));
1318 policy_map_.Set(policy::key::kRestoreOnStartupURLs,
1319 policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
Ben Murdoch7dbb3d52013-07-17 14:55:54 +01001320 startup_urls.DeepCopy(), NULL);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001321 provider_.UpdateChromePolicy(policy_map_);
1322 base::RunLoop().RunUntilIdle();
1323
1324 // Do a process-startup browser launch.
1325 CommandLine dummy(CommandLine::NO_PROGRAM);
1326 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
1327 chrome::startup::IS_FIRST_RUN);
1328 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), true,
1329 browser()->host_desktop_type()));
1330
1331 // This should have created a new browser window.
1332 Browser* new_browser = FindOneOtherBrowser(browser());
1333 ASSERT_TRUE(new_browser);
1334
1335 // Verify that the URL specified through policy is shown and no sync promo has
1336 // been added.
1337 TabStripModel* tab_strip = new_browser->tab_strip_model();
1338 ASSERT_EQ(1, tab_strip->count());
1339 EXPECT_EQ("title1.html",
1340 tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName());
1341}
1342#endif // defined(ENABLE_CONFIGURATION_POLICY)
1343
1344#endif // !defined(OS_LINUX) || !defined(GOOGLE_CHROME_BUILD) ||
1345 // defined(ENABLE_CONFIGURATION_POLICY)
1346
1347#endif // !defined(OS_CHROMEOS)