blob: aec9cf578fb04ec1e8a86e18b653d7f10aa17b2a [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
5#include "base/command_line.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00006#include "base/files/file_path.h"
7#include "base/prefs/pref_service.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +00008#include "chrome/browser/browser_process.h"
9#include "chrome/browser/extensions/extension_browsertest.h"
10#include "chrome/browser/extensions/extension_service.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000011#include "chrome/browser/extensions/extension_system.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000012#include "chrome/browser/first_run/first_run.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000013#include "chrome/browser/infobars/infobar_service.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000014#include "chrome/browser/prefs/session_startup_pref.h"
15#include "chrome/browser/profiles/profile.h"
16#include "chrome/browser/profiles/profile_impl.h"
17#include "chrome/browser/profiles/profile_manager.h"
18#include "chrome/browser/sessions/session_restore.h"
19#include "chrome/browser/ui/browser.h"
20#include "chrome/browser/ui/browser_finder.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000021#include "chrome/browser/ui/browser_iterator.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000022#include "chrome/browser/ui/browser_list.h"
23#include "chrome/browser/ui/browser_list_observer.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000024#include "chrome/browser/ui/browser_window.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000025#include "chrome/browser/ui/host_desktop.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000026#include "chrome/browser/ui/startup/startup_browser_creator.h"
27#include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000028#include "chrome/browser/ui/tabs/tab_strip_model.h"
29#include "chrome/browser/ui/webui/sync_promo/sync_promo_ui.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000030#include "chrome/common/chrome_switches.h"
31#include "chrome/common/pref_names.h"
32#include "chrome/common/url_constants.h"
33#include "chrome/test/base/in_process_browser_test.h"
34#include "chrome/test/base/ui_test_utils.h"
35#include "content/public/browser/web_contents.h"
36#include "testing/gtest/include/gtest/gtest.h"
37
38using extensions::Extension;
39
40class StartupBrowserCreatorTest : public ExtensionBrowserTest {
41 protected:
42 virtual bool SetUpUserDataDirectory() OVERRIDE {
43 // Make sure the first run sentinel file exists before running these tests,
44 // since some of them customize the session startup pref whose value can
45 // be different than the default during the first run.
46 // TODO(bauerb): set the first run flag instead of creating a sentinel file.
47 first_run::CreateSentinel();
48 return ExtensionBrowserTest::SetUpUserDataDirectory();
49 }
50
51 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
52 ExtensionBrowserTest::SetUpCommandLine(command_line);
53 command_line->AppendSwitch(switches::kEnablePanels);
54 command_line->AppendSwitchASCII(switches::kHomePage,
55 chrome::kAboutBlankURL);
56#if defined(OS_CHROMEOS)
57 // TODO(nkostylev): Investigate if we can remove this switch.
58 command_line->AppendSwitch(switches::kCreateBrowserOnStartupForTests);
59#endif
60 }
61
62 // Helper functions return void so that we can ASSERT*().
63 // Use ASSERT_NO_FATAL_FAILURE around calls to these functions to stop the
64 // test if an assert fails.
65 void LoadApp(const std::string& app_name,
66 const Extension** out_app_extension) {
67 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(app_name.c_str())));
68
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000069 ExtensionService* service = extensions::ExtensionSystem::Get(
70 browser()->profile())->extension_service();
Torne (Richard Coles)58218062012-11-14 11:43:16 +000071 *out_app_extension = service->GetExtensionById(
72 last_loaded_extension_id_, false);
73 ASSERT_TRUE(*out_app_extension);
74
75 // Code that opens a new browser assumes we start with exactly one.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000076 ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile(),
77 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +000078 }
79
80 void SetAppLaunchPref(const std::string& app_id,
81 extensions::ExtensionPrefs::LaunchType launch_type) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000082 ExtensionService* service = extensions::ExtensionSystem::Get(
83 browser()->profile())->extension_service();
Torne (Richard Coles)58218062012-11-14 11:43:16 +000084 service->extension_prefs()->SetLaunchType(app_id, launch_type);
85 }
86
87 // Check that there are two browsers. Find the one that is not |browser()|.
88 void FindOneOtherBrowser(Browser** out_other_browser) {
89 // There should only be one other browser.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000090 ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
91 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +000092
93 // Find the new browser.
94 Browser* other_browser = NULL;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000095 for (chrome::BrowserIterator it; !it.done() && !other_browser; it.Next()) {
96 if (*it != browser())
97 other_browser = *it;
Torne (Richard Coles)58218062012-11-14 11:43:16 +000098 }
99 ASSERT_TRUE(other_browser);
100 ASSERT_TRUE(other_browser != browser());
101 *out_other_browser = other_browser;
102 }
103
104 Browser* FindOneOtherBrowserForProfile(Profile* profile,
105 Browser* not_this_browser) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000106 for (chrome::BrowserIterator it; !it.done(); it.Next()) {
107 if (*it != not_this_browser && it->profile() == profile)
108 return *it;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000109 }
110 return NULL;
111 }
112};
113
114class OpenURLsPopupObserver : public chrome::BrowserListObserver {
115 public:
116 OpenURLsPopupObserver() : added_browser_(NULL) { }
117
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000118 virtual void OnBrowserAdded(Browser* browser) OVERRIDE {
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000119 added_browser_ = browser;
120 }
121
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000122 virtual void OnBrowserRemoved(Browser* browser) OVERRIDE { }
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000123
124 Browser* added_browser_;
125};
126
127// Test that when there is a popup as the active browser any requests to
128// StartupBrowserCreatorImpl::OpenURLsInBrowser don't crash because there's no
129// explicit profile given.
130IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenURLsPopup) {
131 std::vector<GURL> urls;
132 urls.push_back(GURL("http://localhost"));
133
134 // Note that in our testing we do not ever query the BrowserList for the "last
135 // active" browser. That's because the browsers are set as "active" by
136 // platform UI toolkit messages, and those messages are not sent during unit
137 // testing sessions.
138
139 OpenURLsPopupObserver observer;
140 BrowserList::AddObserver(&observer);
141
142 Browser* popup = new Browser(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000143 Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile(),
144 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000145 ASSERT_TRUE(popup->is_type_popup());
146 ASSERT_EQ(popup, observer.added_browser_);
147
148 CommandLine dummy(CommandLine::NO_PROGRAM);
149 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
150 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000151 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, first_run);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000152 // This should create a new window, but re-use the profile from |popup|. If
153 // it used a NULL or invalid profile, it would crash.
154 launch.OpenURLsInBrowser(popup, false, urls);
155 ASSERT_NE(popup, observer.added_browser_);
156 BrowserList::RemoveObserver(&observer);
157}
158
159// We don't do non-process-startup browser launches on ChromeOS.
160// Session restore for process-startup browser launches is tested
161// in session_restore_uitest.
162#if !defined(OS_CHROMEOS)
163// Verify that startup URLs are honored when the process already exists but has
164// no tabbed browser windows (eg. as if the process is running only due to a
165// background application.
166IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
167 StartupURLsOnNewWindowWithNoTabbedBrowsers) {
168 // Use a couple same-site HTTP URLs.
169 ASSERT_TRUE(test_server()->Start());
170 std::vector<GURL> urls;
171 urls.push_back(test_server()->GetURL("files/title1.html"));
172 urls.push_back(test_server()->GetURL("files/title2.html"));
173
174 // Set the startup preference to open these URLs.
175 SessionStartupPref pref(SessionStartupPref::URLS);
176 pref.urls = urls;
177 SessionStartupPref::SetStartupPref(browser()->profile(), pref);
178
179 // Close the browser.
180 browser()->window()->Close();
181
182 // Do a simple non-process-startup browser launch.
183 CommandLine dummy(CommandLine::NO_PROGRAM);
184 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
185 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000186 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, first_run);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000187 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
188
189 // This should have created a new browser window. |browser()| is still
190 // around at this point, even though we've closed its window.
191 Browser* new_browser = NULL;
192 ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
193
194 // The new browser should have one tab for each URL.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000195 TabStripModel* tab_strip = new_browser->tab_strip_model();
196 ASSERT_EQ(static_cast<int>(urls.size()), tab_strip->count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000197 for (size_t i=0; i < urls.size(); i++) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000198 EXPECT_EQ(urls[i], tab_strip->GetWebContentsAt(i)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000199 }
200
201 // The two tabs, despite having the same site, should be in different
202 // SiteInstances.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000203 EXPECT_NE(tab_strip->GetWebContentsAt(0)->GetSiteInstance(),
204 tab_strip->GetWebContentsAt(1)->GetSiteInstance());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000205}
206
207// Verify that startup URLs aren't used when the process already exists
208// and has other tabbed browser windows. This is the common case of starting a
209// new browser.
210IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
211 StartupURLsOnNewWindow) {
212 // Use a couple arbitrary URLs.
213 std::vector<GURL> urls;
214 urls.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000215 base::FilePath(base::FilePath::kCurrentDirectory),
216 base::FilePath(FILE_PATH_LITERAL("title1.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000217 urls.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000218 base::FilePath(base::FilePath::kCurrentDirectory),
219 base::FilePath(FILE_PATH_LITERAL("title2.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000220
221 // Set the startup preference to open these URLs.
222 SessionStartupPref pref(SessionStartupPref::URLS);
223 pref.urls = urls;
224 SessionStartupPref::SetStartupPref(browser()->profile(), pref);
225
226 // Do a simple non-process-startup browser launch.
227 CommandLine dummy(CommandLine::NO_PROGRAM);
228 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
229 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000230 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, first_run);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000231 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
232
233 // This should have created a new browser window.
234 Browser* new_browser = NULL;
235 ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
236
237 // The new browser should have exactly one tab (not the startup URLs).
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000238 ASSERT_EQ(1, new_browser->tab_strip_model()->count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000239}
240
241// App shortcuts are not implemented on mac os.
242#if !defined(OS_MACOSX)
243IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenAppShortcutNoPref) {
244 // Load an app with launch.container = 'tab'.
245 const Extension* extension_app = NULL;
246 ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
247
248 // Add --app-id=<extension->id()> to the command line.
249 CommandLine command_line(CommandLine::NO_PROGRAM);
250 command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
251
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(), command_line, first_run);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000255 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
256
257 // No pref was set, so the app should have opened in a window.
258 // The launch should have created a new browser.
259 Browser* new_browser = NULL;
260 ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
261
262 // Expect an app window.
263 EXPECT_TRUE(new_browser->is_app());
264
265 // The browser's app_name should include the app's ID.
266 EXPECT_NE(
267 new_browser->app_name_.find(extension_app->id()),
268 std::string::npos) << new_browser->app_name_;
269}
270
271IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenAppShortcutWindowPref) {
272 const Extension* extension_app = NULL;
273 ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
274
275 // Set a pref indicating that the user wants to open this app in a window.
276 SetAppLaunchPref(extension_app->id(),
277 extensions::ExtensionPrefs::LAUNCH_WINDOW);
278
279 CommandLine command_line(CommandLine::NO_PROGRAM);
280 command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
281 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
282 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000283 StartupBrowserCreatorImpl launch(base::FilePath(), command_line, first_run);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000284 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
285
286 // Pref was set to open in a window, so the app should have opened in a
287 // window. The launch should have created a new browser. Find the new
288 // browser.
289 Browser* new_browser = NULL;
290 ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
291
292 // Expect an app window.
293 EXPECT_TRUE(new_browser->is_app());
294
295 // The browser's app_name should include the app's ID.
296 EXPECT_NE(
297 new_browser->app_name_.find(extension_app->id()),
298 std::string::npos) << new_browser->app_name_;
299}
300
301IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenAppShortcutTabPref) {
302 // Load an app with launch.container = 'tab'.
303 const Extension* extension_app = NULL;
304 ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
305
306 // Set a pref indicating that the user wants to open this app in a window.
307 SetAppLaunchPref(extension_app->id(),
308 extensions::ExtensionPrefs::LAUNCH_REGULAR);
309
310 CommandLine command_line(CommandLine::NO_PROGRAM);
311 command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
312 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
313 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000314 StartupBrowserCreatorImpl launch(base::FilePath(), command_line, first_run);
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000315 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
316
317 // When an app shortcut is open and the pref indicates a tab should
318 // open, the tab is open in a new browser window. Expect a new window.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000319 ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
320 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000321
322 Browser* new_browser = NULL;
323 ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
324
325 // The tab should be in a tabbed window.
326 EXPECT_TRUE(new_browser->is_type_tabbed());
327
328 // The browser's app_name should not include the app's ID: It is in a
329 // normal browser.
330 EXPECT_EQ(
331 new_browser->app_name_.find(extension_app->id()),
332 std::string::npos) << new_browser->app_name_;
333}
334
335#endif // !defined(OS_MACOSX)
336
337#endif // !defined(OS_CHROMEOS)
338
339IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
340 ReadingWasRestartedAfterRestart) {
341 // Tests that StartupBrowserCreator::WasRestarted reads and resets the
342 // preference kWasRestarted correctly.
343 StartupBrowserCreator::was_restarted_read_ = false;
344 PrefService* pref_service = g_browser_process->local_state();
345 pref_service->SetBoolean(prefs::kWasRestarted, true);
346 EXPECT_TRUE(StartupBrowserCreator::WasRestarted());
347 EXPECT_FALSE(pref_service->GetBoolean(prefs::kWasRestarted));
348 EXPECT_TRUE(StartupBrowserCreator::WasRestarted());
349}
350
351IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
352 ReadingWasRestartedAfterNormalStart) {
353 // Tests that StartupBrowserCreator::WasRestarted reads and resets the
354 // preference kWasRestarted correctly.
355 StartupBrowserCreator::was_restarted_read_ = false;
356 PrefService* pref_service = g_browser_process->local_state();
357 pref_service->SetBoolean(prefs::kWasRestarted, false);
358 EXPECT_FALSE(StartupBrowserCreator::WasRestarted());
359 EXPECT_FALSE(pref_service->GetBoolean(prefs::kWasRestarted));
360 EXPECT_FALSE(StartupBrowserCreator::WasRestarted());
361}
362
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000363IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, AddFirstRunTab) {
364 StartupBrowserCreator browser_creator;
365 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
366 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title2.html"));
367
368 // Do a simple non-process-startup browser launch.
369 CommandLine dummy(CommandLine::NO_PROGRAM);
370 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
371 chrome::startup::IS_FIRST_RUN);
372 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
373
374 // This should have created a new browser window.
375 Browser* new_browser = NULL;
376 ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
377
378 TabStripModel* tab_strip = new_browser->tab_strip_model();
379 EXPECT_EQ(2, tab_strip->count());
380
381 EXPECT_EQ("title1.html",
382 tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName());
383 EXPECT_EQ("title2.html",
384 tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName());
385}
386
387// Test hard-coded special first run tabs (defined in
388// StartupBrowserCreatorImpl::AddStartupURLs()).
389IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, AddCustomFirstRunTab) {
390 StartupBrowserCreator browser_creator;
391 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
392 browser_creator.AddFirstRunTab(GURL("http://new_tab_page"));
393 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title2.html"));
394 browser_creator.AddFirstRunTab(GURL("http://welcome_page"));
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);
400 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
401
402 // This should have created a new browser window.
403 Browser* new_browser = NULL;
404 ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
405
406 TabStripModel* tab_strip = new_browser->tab_strip_model();
407 EXPECT_EQ(4, tab_strip->count());
408
409 EXPECT_EQ("title1.html",
410 tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName());
411 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
412 tab_strip->GetWebContentsAt(1)->GetURL());
413 EXPECT_EQ("title2.html",
414 tab_strip->GetWebContentsAt(2)->GetURL().ExtractFileName());
415 EXPECT_EQ(internals::GetWelcomePageURL(),
416 tab_strip->GetWebContentsAt(3)->GetURL());
417}
418
419IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, SyncPromoNoWelcomePage) {
420 // Trick this test into thinking the promo has been shown for this profile; so
421 // that it will show it again (otherwise it skips showing it since
422 // --no-first-run is specified in browser tests).
423 SyncPromoUI::DidShowSyncPromoAtStartup(browser()->profile());
424
425 // Do a simple non-process-startup browser launch.
426 CommandLine dummy(CommandLine::NO_PROGRAM);
427 StartupBrowserCreatorImpl launch(base::FilePath(), dummy,
428 chrome::startup::IS_FIRST_RUN);
429 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
430
431 // This should have created a new browser window.
432 Browser* new_browser = NULL;
433 ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
434
435 TabStripModel* tab_strip = new_browser->tab_strip_model();
436 EXPECT_EQ(1, tab_strip->count());
437
438 if (SyncPromoUI::ShouldShowSyncPromoAtStartup(browser()->profile(), true)) {
439 EXPECT_EQ("signin", tab_strip->GetWebContentsAt(0)->GetURL().host());
440 } else {
441 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
442 tab_strip->GetWebContentsAt(0)->GetURL());
443 }
444}
445
446IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, SyncPromoWithWelcomePage) {
447 // Trick this test into thinking the promo has been shown for this profile; so
448 // that it will show it again (otherwise it skips showing it since
449 // --no-first-run is specified in browser tests).
450 SyncPromoUI::DidShowSyncPromoAtStartup(browser()->profile());
451 first_run::SetShouldShowWelcomePage();
452
453 // Do a simple non-process-startup browser launch.
454 CommandLine dummy(CommandLine::NO_PROGRAM);
455 StartupBrowserCreatorImpl launch(base::FilePath(), dummy,
456 chrome::startup::IS_FIRST_RUN);
457 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
458
459 // This should have created a new browser window.
460 Browser* new_browser = NULL;
461 ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
462
463 TabStripModel* tab_strip = new_browser->tab_strip_model();
464 EXPECT_EQ(2, tab_strip->count());
465
466 if (SyncPromoUI::ShouldShowSyncPromoAtStartup(browser()->profile(), true)) {
467 EXPECT_EQ("signin", tab_strip->GetWebContentsAt(0)->GetURL().host());
468 } else {
469 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
470 tab_strip->GetWebContentsAt(0)->GetURL());
471 }
472 EXPECT_EQ(internals::GetWelcomePageURL(),
473 tab_strip->GetWebContentsAt(1)->GetURL());
474}
475
476IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, SyncPromoWithFirstRunTabs) {
477 StartupBrowserCreator browser_creator;
478 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
479
480 // Trick this test into thinking the promo has been shown for this profile; so
481 // that it will show it again (otherwise it skips showing it since
482 // --no-first-run is specified in browser tests).
483 SyncPromoUI::DidShowSyncPromoAtStartup(browser()->profile());
484
485 // The welcome page should not be shown, even if
486 // first_run::ShouldShowWelcomePage() says so, when there are already
487 // more than 2 first run tabs.
488 first_run::SetShouldShowWelcomePage();
489
490 // Do a simple non-process-startup browser launch.
491 CommandLine dummy(CommandLine::NO_PROGRAM);
492 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
493 chrome::startup::IS_FIRST_RUN);
494 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
495
496 // This should have created a new browser window.
497 Browser* new_browser = NULL;
498 ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
499
500 TabStripModel* tab_strip = new_browser->tab_strip_model();
501 if (SyncPromoUI::ShouldShowSyncPromoAtStartup(browser()->profile(), true)) {
502 EXPECT_EQ(2, tab_strip->count());
503 EXPECT_EQ("signin", tab_strip->GetWebContentsAt(0)->GetURL().host());
504 EXPECT_EQ("title1.html",
505 tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName());
506 } else {
507 EXPECT_EQ(1, tab_strip->count());
508 EXPECT_EQ("title1.html",
509 tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName());
510 }
511}
512
513// The welcome page should still be shown if there are more than 2 first run
514// tabs, but the welcome page was explcitly added to the first run tabs.
515IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
516 SyncPromoWithFirstRunTabsIncludingWelcomePage) {
517 StartupBrowserCreator browser_creator;
518 browser_creator.AddFirstRunTab(test_server()->GetURL("files/title1.html"));
519 browser_creator.AddFirstRunTab(GURL("http://welcome_page"));
520
521 // Trick this test into thinking the promo has been shown for this profile; so
522 // that it will show it again (otherwise it skips showing it since
523 // --no-first-run is specified in browser tests).
524 SyncPromoUI::DidShowSyncPromoAtStartup(browser()->profile());
525
526 // Do a simple non-process-startup browser launch.
527 CommandLine dummy(CommandLine::NO_PROGRAM);
528 StartupBrowserCreatorImpl launch(base::FilePath(), dummy, &browser_creator,
529 chrome::startup::IS_FIRST_RUN);
530 ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
531
532 // This should have created a new browser window.
533 Browser* new_browser = NULL;
534 ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
535
536 TabStripModel* tab_strip = new_browser->tab_strip_model();
537 if (SyncPromoUI::ShouldShowSyncPromoAtStartup(browser()->profile(), true)) {
538 EXPECT_EQ(3, tab_strip->count());
539 EXPECT_EQ("signin", tab_strip->GetWebContentsAt(0)->GetURL().host());
540 EXPECT_EQ("title1.html",
541 tab_strip->GetWebContentsAt(1)->GetURL().ExtractFileName());
542 EXPECT_EQ(internals::GetWelcomePageURL(),
543 tab_strip->GetWebContentsAt(2)->GetURL());
544 } else {
545 EXPECT_EQ(2, tab_strip->count());
546 EXPECT_EQ("title1.html",
547 tab_strip->GetWebContentsAt(0)->GetURL().ExtractFileName());
548 EXPECT_EQ(internals::GetWelcomePageURL(),
549 tab_strip->GetWebContentsAt(1)->GetURL());
550 }
551}
552
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000553#if !defined(OS_CHROMEOS)
554IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, StartupURLsForTwoProfiles) {
555 Profile* default_profile = browser()->profile();
556
557 ProfileManager* profile_manager = g_browser_process->profile_manager();
558 // Create another profile.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000559 base::FilePath dest_path = profile_manager->user_data_dir();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000560 dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile 1"));
561
562 Profile* other_profile = profile_manager->GetProfile(dest_path);
563 ASSERT_TRUE(other_profile);
564
565 // Use a couple arbitrary URLs.
566 std::vector<GURL> urls1;
567 urls1.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000568 base::FilePath(base::FilePath::kCurrentDirectory),
569 base::FilePath(FILE_PATH_LITERAL("title1.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000570 std::vector<GURL> urls2;
571 urls2.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000572 base::FilePath(base::FilePath::kCurrentDirectory),
573 base::FilePath(FILE_PATH_LITERAL("title2.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000574
575 // Set different startup preferences for the 2 profiles.
576 SessionStartupPref pref1(SessionStartupPref::URLS);
577 pref1.urls = urls1;
578 SessionStartupPref::SetStartupPref(default_profile, pref1);
579 SessionStartupPref pref2(SessionStartupPref::URLS);
580 pref2.urls = urls2;
581 SessionStartupPref::SetStartupPref(other_profile, pref2);
582
583 // Close the browser.
584 browser()->window()->Close();
585
586 // Do a simple non-process-startup browser launch.
587 CommandLine dummy(CommandLine::NO_PROGRAM);
588
589 int return_code;
590 StartupBrowserCreator browser_creator;
591 std::vector<Profile*> last_opened_profiles;
592 last_opened_profiles.push_back(default_profile);
593 last_opened_profiles.push_back(other_profile);
594 browser_creator.Start(dummy, profile_manager->user_data_dir(),
595 default_profile, last_opened_profiles, &return_code);
596
597 // urls1 were opened in a browser for default_profile, and urls2 were opened
598 // in a browser for other_profile.
599 Browser* new_browser = NULL;
600 // |browser()| is still around at this point, even though we've closed its
601 // window. Thus the browser count for default_profile is 2.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000602 ASSERT_EQ(2u, chrome::GetBrowserCount(default_profile,
603 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000604 new_browser = FindOneOtherBrowserForProfile(default_profile, browser());
605 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000606 TabStripModel* tab_strip = new_browser->tab_strip_model();
607 ASSERT_EQ(1, tab_strip->count());
608 EXPECT_EQ(urls1[0], tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000609
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000610 ASSERT_EQ(1u, chrome::GetBrowserCount(other_profile,
611 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000612 new_browser = FindOneOtherBrowserForProfile(other_profile, NULL);
613 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000614 tab_strip = new_browser->tab_strip_model();
615 ASSERT_EQ(1, tab_strip->count());
616 EXPECT_EQ(urls2[0], tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000617}
618
619IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, UpdateWithTwoProfiles) {
620 // Make StartupBrowserCreator::WasRestarted() return true.
621 StartupBrowserCreator::was_restarted_read_ = false;
622 PrefService* pref_service = g_browser_process->local_state();
623 pref_service->SetBoolean(prefs::kWasRestarted, true);
624
625 ProfileManager* profile_manager = g_browser_process->profile_manager();
626
627 // Create two profiles.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000628 base::FilePath dest_path = profile_manager->user_data_dir();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000629
630 Profile* profile1 = profile_manager->GetProfile(
631 dest_path.Append(FILE_PATH_LITERAL("New Profile 1")));
632 ASSERT_TRUE(profile1);
633
634 Profile* profile2 = profile_manager->GetProfile(
635 dest_path.Append(FILE_PATH_LITERAL("New Profile 2")));
636 ASSERT_TRUE(profile2);
637
638 // Use a couple arbitrary URLs.
639 std::vector<GURL> urls1;
640 urls1.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000641 base::FilePath(base::FilePath::kCurrentDirectory),
642 base::FilePath(FILE_PATH_LITERAL("title1.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000643 std::vector<GURL> urls2;
644 urls2.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000645 base::FilePath(base::FilePath::kCurrentDirectory),
646 base::FilePath(FILE_PATH_LITERAL("title2.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000647
648 // Set different startup preferences for the 2 profiles.
649 SessionStartupPref pref1(SessionStartupPref::URLS);
650 pref1.urls = urls1;
651 SessionStartupPref::SetStartupPref(profile1, pref1);
652 SessionStartupPref pref2(SessionStartupPref::URLS);
653 pref2.urls = urls2;
654 SessionStartupPref::SetStartupPref(profile2, pref2);
655
656 // Simulate a launch after a browser update.
657 CommandLine dummy(CommandLine::NO_PROGRAM);
658 int return_code;
659 StartupBrowserCreator browser_creator;
660 std::vector<Profile*> last_opened_profiles;
661 last_opened_profiles.push_back(profile1);
662 last_opened_profiles.push_back(profile2);
663 browser_creator.Start(dummy, profile_manager->user_data_dir(), profile1,
664 last_opened_profiles, &return_code);
665
666 while (SessionRestore::IsRestoring(profile1) ||
667 SessionRestore::IsRestoring(profile2))
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000668 MessageLoop::current()->RunUntilIdle();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000669
670 // The startup URLs are ignored, and instead the last open sessions are
671 // restored.
672 EXPECT_TRUE(profile1->restored_last_session());
673 EXPECT_TRUE(profile2->restored_last_session());
674
675 Browser* new_browser = NULL;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000676 ASSERT_EQ(1u, chrome::GetBrowserCount(profile1,
677 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000678 new_browser = FindOneOtherBrowserForProfile(profile1, NULL);
679 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000680 TabStripModel* tab_strip = new_browser->tab_strip_model();
681 ASSERT_EQ(1, tab_strip->count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000682 EXPECT_EQ(GURL(chrome::kAboutBlankURL),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000683 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000684
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000685 ASSERT_EQ(1u, chrome::GetBrowserCount(profile2,
686 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000687 new_browser = FindOneOtherBrowserForProfile(profile2, NULL);
688 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000689 tab_strip = new_browser->tab_strip_model();
690 ASSERT_EQ(1, tab_strip->count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000691 EXPECT_EQ(GURL(chrome::kAboutBlankURL),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000692 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000693}
694
695IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
696 ProfilesWithoutPagesNotLaunched) {
697 Profile* default_profile = browser()->profile();
698
699 ProfileManager* profile_manager = g_browser_process->profile_manager();
700
701 // Create 4 more profiles.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000702 base::FilePath dest_path1 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000703 FILE_PATH_LITERAL("New Profile 1"));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000704 base::FilePath dest_path2 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000705 FILE_PATH_LITERAL("New Profile 2"));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000706 base::FilePath dest_path3 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000707 FILE_PATH_LITERAL("New Profile 3"));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000708 base::FilePath dest_path4 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000709 FILE_PATH_LITERAL("New Profile 4"));
710
711 Profile* profile_home1 = profile_manager->GetProfile(dest_path1);
712 ASSERT_TRUE(profile_home1);
713 Profile* profile_home2 = profile_manager->GetProfile(dest_path2);
714 ASSERT_TRUE(profile_home2);
715 Profile* profile_last = profile_manager->GetProfile(dest_path3);
716 ASSERT_TRUE(profile_last);
717 Profile* profile_urls = profile_manager->GetProfile(dest_path4);
718 ASSERT_TRUE(profile_urls);
719
720 // Set the profiles to open urls, open last visited pages or display the home
721 // page.
722 SessionStartupPref pref_home(SessionStartupPref::DEFAULT);
723 SessionStartupPref::SetStartupPref(profile_home1, pref_home);
724 SessionStartupPref::SetStartupPref(profile_home2, pref_home);
725
726 SessionStartupPref pref_last(SessionStartupPref::LAST);
727 SessionStartupPref::SetStartupPref(profile_last, pref_last);
728
729 std::vector<GURL> urls;
730 urls.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000731 base::FilePath(base::FilePath::kCurrentDirectory),
732 base::FilePath(FILE_PATH_LITERAL("title1.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000733
734 SessionStartupPref pref_urls(SessionStartupPref::URLS);
735 pref_urls.urls = urls;
736 SessionStartupPref::SetStartupPref(profile_urls, pref_urls);
737
738 // Close the browser.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000739 chrome::HostDesktopType original_desktop_type =
740 browser()->host_desktop_type();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000741 browser()->window()->Close();
742
743 // Do a simple non-process-startup browser launch.
744 CommandLine dummy(CommandLine::NO_PROGRAM);
745
746 int return_code;
747 StartupBrowserCreator browser_creator;
748 std::vector<Profile*> last_opened_profiles;
749 last_opened_profiles.push_back(profile_home1);
750 last_opened_profiles.push_back(profile_home2);
751 last_opened_profiles.push_back(profile_last);
752 last_opened_profiles.push_back(profile_urls);
753 browser_creator.Start(dummy, profile_manager->user_data_dir(), profile_home1,
754 last_opened_profiles, &return_code);
755
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000756 while (SessionRestore::IsRestoring(default_profile) ||
757 SessionRestore::IsRestoring(profile_home1) ||
758 SessionRestore::IsRestoring(profile_home2) ||
759 SessionRestore::IsRestoring(profile_last) ||
760 SessionRestore::IsRestoring(profile_urls))
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000761 MessageLoop::current()->RunUntilIdle();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000762
763 Browser* new_browser = NULL;
764 // The last open profile (the profile_home1 in this case) will always be
765 // launched, even if it will open just the home page.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000766 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_home1, original_desktop_type));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000767 new_browser = FindOneOtherBrowserForProfile(profile_home1, NULL);
768 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000769 TabStripModel* tab_strip = new_browser->tab_strip_model();
770 ASSERT_EQ(1, tab_strip->count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000771 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000772 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000773
774 // profile_urls opened the urls.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000775 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_urls, original_desktop_type));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000776 new_browser = FindOneOtherBrowserForProfile(profile_urls, NULL);
777 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000778 tab_strip = new_browser->tab_strip_model();
779 ASSERT_EQ(1, tab_strip->count());
780 EXPECT_EQ(urls[0], tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000781
782 // profile_last opened the last open pages.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000783 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_last, original_desktop_type));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000784 new_browser = FindOneOtherBrowserForProfile(profile_last, NULL);
785 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000786 tab_strip = new_browser->tab_strip_model();
787 ASSERT_EQ(1, tab_strip->count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000788 EXPECT_EQ(GURL(chrome::kAboutBlankURL),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000789 tab_strip->GetWebContentsAt(0)->GetURL());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000790
791 // profile_home2 was not launched since it would've only opened the home page.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000792 ASSERT_EQ(0u, chrome::GetBrowserCount(profile_home2, original_desktop_type));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000793}
794
795IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, ProfilesLaunchedAfterCrash) {
796 // After an unclean exit, all profiles will be launched. However, they won't
797 // open any pages automatically.
798
799 ProfileManager* profile_manager = g_browser_process->profile_manager();
800
801 // Create 3 profiles.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000802 base::FilePath dest_path1 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000803 FILE_PATH_LITERAL("New Profile 1"));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000804 base::FilePath dest_path2 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000805 FILE_PATH_LITERAL("New Profile 2"));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000806 base::FilePath dest_path3 = profile_manager->user_data_dir().Append(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000807 FILE_PATH_LITERAL("New Profile 3"));
808
809 Profile* profile_home = profile_manager->GetProfile(dest_path1);
810 ASSERT_TRUE(profile_home);
811 Profile* profile_last = profile_manager->GetProfile(dest_path2);
812 ASSERT_TRUE(profile_last);
813 Profile* profile_urls = profile_manager->GetProfile(dest_path3);
814 ASSERT_TRUE(profile_urls);
815
816 // Set the profiles to open the home page, last visited pages or URLs.
817 SessionStartupPref pref_home(SessionStartupPref::DEFAULT);
818 SessionStartupPref::SetStartupPref(profile_home, pref_home);
819
820 SessionStartupPref pref_last(SessionStartupPref::LAST);
821 SessionStartupPref::SetStartupPref(profile_last, pref_last);
822
823 std::vector<GURL> urls;
824 urls.push_back(ui_test_utils::GetTestUrl(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000825 base::FilePath(base::FilePath::kCurrentDirectory),
826 base::FilePath(FILE_PATH_LITERAL("title1.html"))));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000827
828 SessionStartupPref pref_urls(SessionStartupPref::URLS);
829 pref_urls.urls = urls;
830 SessionStartupPref::SetStartupPref(profile_urls, pref_urls);
831
832 // Simulate a launch after an unclear exit.
833 browser()->window()->Close();
834 static_cast<ProfileImpl*>(profile_home)->last_session_exit_type_ =
835 Profile::EXIT_CRASHED;
836 static_cast<ProfileImpl*>(profile_last)->last_session_exit_type_ =
837 Profile::EXIT_CRASHED;
838 static_cast<ProfileImpl*>(profile_urls)->last_session_exit_type_ =
839 Profile::EXIT_CRASHED;
840
841 CommandLine dummy(CommandLine::NO_PROGRAM);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000842 dummy.AppendSwitchASCII(switches::kTestType, "browser");
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000843 int return_code;
844 StartupBrowserCreator browser_creator;
845 std::vector<Profile*> last_opened_profiles;
846 last_opened_profiles.push_back(profile_home);
847 last_opened_profiles.push_back(profile_last);
848 last_opened_profiles.push_back(profile_urls);
849 browser_creator.Start(dummy, profile_manager->user_data_dir(), profile_home,
850 last_opened_profiles, &return_code);
851
852 // No profiles are getting restored, since they all display the crash info
853 // bar.
854 EXPECT_FALSE(SessionRestore::IsRestoring(profile_home));
855 EXPECT_FALSE(SessionRestore::IsRestoring(profile_last));
856 EXPECT_FALSE(SessionRestore::IsRestoring(profile_urls));
857
858 // The profile which normally opens the home page displays the new tab page.
859 Browser* new_browser = NULL;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000860 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_home,
861 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000862 new_browser = FindOneOtherBrowserForProfile(profile_home, NULL);
863 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000864 TabStripModel* tab_strip = new_browser->tab_strip_model();
865 ASSERT_EQ(1, tab_strip->count());
866 content::WebContents* web_contents = tab_strip->GetWebContentsAt(0);
867 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), web_contents->GetURL());
868 EXPECT_EQ(1U,
869 InfoBarService::FromWebContents(web_contents)->GetInfoBarCount());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000870
871 // The profile which normally opens last open pages displays the new tab page.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000872 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_last,
873 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000874 new_browser = FindOneOtherBrowserForProfile(profile_last, NULL);
875 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000876 tab_strip = new_browser->tab_strip_model();
877 ASSERT_EQ(1, tab_strip->count());
878 web_contents = tab_strip->GetWebContentsAt(0);
879 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), web_contents->GetURL());
880 EXPECT_EQ(1U,
881 InfoBarService::FromWebContents(web_contents)->GetInfoBarCount());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000882
883 // The profile which normally opens URLs displays the new tab page.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000884 ASSERT_EQ(1u, chrome::GetBrowserCount(profile_urls,
885 browser()->host_desktop_type()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000886 new_browser = FindOneOtherBrowserForProfile(profile_urls, NULL);
887 ASSERT_TRUE(new_browser);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000888 tab_strip = new_browser->tab_strip_model();
889 ASSERT_EQ(1, tab_strip->count());
890 web_contents = tab_strip->GetWebContentsAt(0);
891 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), web_contents->GetURL());
892 EXPECT_EQ(1U,
893 InfoBarService::FromWebContents(web_contents)->GetInfoBarCount());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000894}
895#endif // !OS_CHROMEOS