startup_browser_creator_browsertest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_path.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/infobars/infobar_tab_helper.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/pref_service.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/session_startup_pref.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_impl.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_restore.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list_observer.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/tab_contents.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StartupBrowserCreatorTest : public ExtensionBrowserTest {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SetUpUserDataDirectory() OVERRIDE {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the first run sentinel file exists before running these tests,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // since some of them customize the session startup pref whose value can
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be different than the default during the first run.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(bauerb): set the first run flag instead of creating a sentinel file.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_run::CreateSentinel();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ExtensionBrowserTest::SetUpUserDataDirectory();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionBrowserTest::SetUpCommandLine(command_line);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kEnablePanels);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kHomePage,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    chrome::kAboutBlankURL);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(nkostylev): Investigate if we can remove this switch.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kCreateBrowserOnStartupForTests);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper functions return void so that we can ASSERT*().
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use ASSERT_NO_FATAL_FAILURE around calls to these functions to stop the
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test if an assert fails.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadApp(const std::string& app_name,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const Extension** out_app_extension) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(app_name.c_str())));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionService* service = browser()->profile()->GetExtensionService();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *out_app_extension = service->GetExtensionById(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        last_loaded_extension_id_, false);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(*out_app_extension);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Code that opens a new browser assumes we start with exactly one.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile()));
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAppLaunchPref(const std::string& app_id,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        extensions::ExtensionPrefs::LaunchType launch_type) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionService* service = browser()->profile()->GetExtensionService();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service->extension_prefs()->SetLaunchType(app_id, launch_type);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that there are two browsers.  Find the one that is not |browser()|.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FindOneOtherBrowser(Browser** out_other_browser) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There should only be one other browser.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile()));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Find the new browser.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* other_browser = NULL;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (BrowserList::const_iterator i = BrowserList::begin();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         i != BrowserList::end() && !other_browser; ++i) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (*i != browser())
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        other_browser = *i;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(other_browser);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(other_browser != browser());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *out_other_browser = other_browser;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* FindOneOtherBrowserForProfile(Profile* profile,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         Browser* not_this_browser) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (BrowserList::const_iterator i = BrowserList::begin();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         i != BrowserList::end(); ++i) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (*i != not_this_browser && (*i)->profile() == profile)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return *i;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OpenURLsPopupObserver : public chrome::BrowserListObserver {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenURLsPopupObserver() : added_browser_(NULL) { }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnBrowserAdded(Browser* browser) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    added_browser_ = browser;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnBrowserRemoved(Browser* browser) { }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* added_browser_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when there is a popup as the active browser any requests to
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// StartupBrowserCreatorImpl::OpenURLsInBrowser don't crash because there's no
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// explicit profile given.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenURLsPopup) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> urls;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls.push_back(GURL("http://localhost"));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that in our testing we do not ever query the BrowserList for the "last
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // active" browser. That's because the browsers are set as "active" by
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // platform UI toolkit messages, and those messages are not sent during unit
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // testing sessions.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenURLsPopupObserver observer;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserList::AddObserver(&observer);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup = new Browser(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile()));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(popup->is_type_popup());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(popup, observer.added_browser_);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine dummy(CommandLine::NO_PROGRAM);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreatorImpl launch(FilePath(), dummy, first_run);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should create a new window, but re-use the profile from |popup|. If
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it used a NULL or invalid profile, it would crash.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launch.OpenURLsInBrowser(popup, false, urls);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(popup, observer.added_browser_);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserList::RemoveObserver(&observer);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We don't do non-process-startup browser launches on ChromeOS.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Session restore for process-startup browser launches is tested
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in session_restore_uitest.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that startup URLs are honored when the process already exists but has
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// no tabbed browser windows (eg. as if the process is running only due to a
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// background application.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       StartupURLsOnNewWindowWithNoTabbedBrowsers) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a couple same-site HTTP URLs.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> urls;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls.push_back(test_server()->GetURL("files/title1.html"));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls.push_back(test_server()->GetURL("files/title2.html"));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the startup preference to open these URLs.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref(SessionStartupPref::URLS);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref.urls = urls;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(browser()->profile(), pref);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the browser.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->window()->Close();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do a simple non-process-startup browser launch.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine dummy(CommandLine::NO_PROGRAM);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreatorImpl launch(FilePath(), dummy, first_run);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should have created a new browser window.  |browser()| is still
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // around at this point, even though we've closed its window.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The new browser should have one tab for each URL.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<int>(urls.size()), new_browser->tab_count());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i=0; i < urls.size(); i++) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(urls[i], chrome::GetWebContentsAt(new_browser, i)->GetURL());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The two tabs, despite having the same site, should be in different
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SiteInstances.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(chrome::GetWebContentsAt(new_browser, 0)->GetSiteInstance(),
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            chrome::GetWebContentsAt(new_browser, 1)->GetSiteInstance());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that startup URLs aren't used when the process already exists
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and has other tabbed browser windows.  This is the common case of starting a
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// new browser.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       StartupURLsOnNewWindow) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a couple arbitrary URLs.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> urls;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls.push_back(ui_test_utils::GetTestUrl(
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FilePath::kCurrentDirectory),
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FILE_PATH_LITERAL("title1.html"))));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls.push_back(ui_test_utils::GetTestUrl(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FilePath::kCurrentDirectory),
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FILE_PATH_LITERAL("title2.html"))));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the startup preference to open these URLs.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref(SessionStartupPref::URLS);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref.urls = urls;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(browser()->profile(), pref);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do a simple non-process-startup browser launch.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine dummy(CommandLine::NO_PROGRAM);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreatorImpl launch(FilePath(), dummy, first_run);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should have created a new browser window.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The new browser should have exactly one tab (not the startup URLs).
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, new_browser->tab_count());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// App shortcuts are not implemented on mac os.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenAppShortcutNoPref) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an app with launch.container = 'tab'.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = NULL;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add --app-id=<extension->id()> to the command line.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine command_line(CommandLine::NO_PROGRAM);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreatorImpl launch(FilePath(), command_line, first_run);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No pref was set, so the app should have opened in a window.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect an app window.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_browser->is_app());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser's app_name should include the app's ID.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->app_name_.find(extension_app->id()),
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string::npos) << new_browser->app_name_;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenAppShortcutWindowPref) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = NULL;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a pref indicating that the user wants to open this app in a window.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetAppLaunchPref(extension_app->id(),
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   extensions::ExtensionPrefs::LAUNCH_WINDOW);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine command_line(CommandLine::NO_PROGRAM);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreatorImpl launch(FilePath(), command_line, first_run);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pref was set to open in a window, so the app should have opened in a
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window.  The launch should have created a new browser. Find the new
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect an app window.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_browser->is_app());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser's app_name should include the app's ID.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->app_name_.find(extension_app->id()),
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string::npos) << new_browser->app_name_;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, OpenAppShortcutTabPref) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an app with launch.container = 'tab'.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = NULL;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a pref indicating that the user wants to open this app in a window.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetAppLaunchPref(extension_app->id(),
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   extensions::ExtensionPrefs::LAUNCH_REGULAR);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine command_line(CommandLine::NO_PROGRAM);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreatorImpl launch(FilePath(), command_line, first_run);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launch.Launch(browser()->profile(), std::vector<GURL>(), false));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When an app shortcut is open and the pref indicates a tab should
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // open, the tab is open in a new browser window.  Expect a new window.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile()));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(FindOneOtherBrowser(&new_browser));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tab should be in a tabbed window.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_browser->is_type_tabbed());
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser's app_name should not include the app's ID: It is in a
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // normal browser.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->app_name_.find(extension_app->id()),
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string::npos) << new_browser->app_name_;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_MACOSX)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ReadingWasRestartedAfterRestart) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests that StartupBrowserCreator::WasRestarted reads and resets the
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preference kWasRestarted correctly.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreator::was_restarted_read_ = false;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* pref_service = g_browser_process->local_state();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service->SetBoolean(prefs::kWasRestarted, true);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(StartupBrowserCreator::WasRestarted());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pref_service->GetBoolean(prefs::kWasRestarted));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(StartupBrowserCreator::WasRestarted());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ReadingWasRestartedAfterNormalStart) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests that StartupBrowserCreator::WasRestarted reads and resets the
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preference kWasRestarted correctly.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreator::was_restarted_read_ = false;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* pref_service = g_browser_process->local_state();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service->SetBoolean(prefs::kWasRestarted, false);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(StartupBrowserCreator::WasRestarted());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pref_service->GetBoolean(prefs::kWasRestarted));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(StartupBrowserCreator::WasRestarted());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, StartupURLsForTwoProfiles) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* default_profile = browser()->profile();
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create another profile.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath dest_path = profile_manager->user_data_dir();
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile 1"));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* other_profile = profile_manager->GetProfile(dest_path);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(other_profile);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a couple arbitrary URLs.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> urls1;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls1.push_back(ui_test_utils::GetTestUrl(
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FilePath::kCurrentDirectory),
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FILE_PATH_LITERAL("title1.html"))));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> urls2;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls2.push_back(ui_test_utils::GetTestUrl(
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FilePath::kCurrentDirectory),
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FILE_PATH_LITERAL("title2.html"))));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set different startup preferences for the 2 profiles.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref1(SessionStartupPref::URLS);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref1.urls = urls1;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(default_profile, pref1);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref2(SessionStartupPref::URLS);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref2.urls = urls2;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(other_profile, pref2);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the browser.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->window()->Close();
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do a simple non-process-startup browser launch.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine dummy(CommandLine::NO_PROGRAM);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int return_code;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreator browser_creator;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Profile*> last_opened_profiles;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles.push_back(default_profile);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles.push_back(other_profile);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_creator.Start(dummy, profile_manager->user_data_dir(),
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        default_profile, last_opened_profiles, &return_code);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // urls1 were opened in a browser for default_profile, and urls2 were opened
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in a browser for other_profile.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |browser()| is still around at this point, even though we've closed its
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window. Thus the browser count for default_profile is 2.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(default_profile));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_browser = FindOneOtherBrowserForProfile(default_profile, browser());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, new_browser->tab_count());
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(urls1[0], chrome::GetWebContentsAt(new_browser, 0)->GetURL());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(other_profile));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_browser = FindOneOtherBrowserForProfile(other_profile, NULL);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, new_browser->tab_count());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(urls2[0], chrome::GetWebContentsAt(new_browser, 0)->GetURL());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, UpdateWithTwoProfiles) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make StartupBrowserCreator::WasRestarted() return true.
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreator::was_restarted_read_ = false;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* pref_service = g_browser_process->local_state();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service->SetBoolean(prefs::kWasRestarted, true);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create two profiles.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath dest_path = profile_manager->user_data_dir();
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile1 = profile_manager->GetProfile(
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dest_path.Append(FILE_PATH_LITERAL("New Profile 1")));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile1);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile2 = profile_manager->GetProfile(
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dest_path.Append(FILE_PATH_LITERAL("New Profile 2")));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile2);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a couple arbitrary URLs.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> urls1;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls1.push_back(ui_test_utils::GetTestUrl(
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FilePath::kCurrentDirectory),
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FILE_PATH_LITERAL("title1.html"))));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> urls2;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls2.push_back(ui_test_utils::GetTestUrl(
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FilePath::kCurrentDirectory),
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FILE_PATH_LITERAL("title2.html"))));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set different startup preferences for the 2 profiles.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref1(SessionStartupPref::URLS);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref1.urls = urls1;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(profile1, pref1);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref2(SessionStartupPref::URLS);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref2.urls = urls2;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(profile2, pref2);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a launch after a browser update.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine dummy(CommandLine::NO_PROGRAM);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int return_code;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreator browser_creator;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Profile*> last_opened_profiles;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles.push_back(profile1);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles.push_back(profile2);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_creator.Start(dummy, profile_manager->user_data_dir(), profile1,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        last_opened_profiles, &return_code);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (SessionRestore::IsRestoring(profile1) ||
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         SessionRestore::IsRestoring(profile2))
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageLoop::current()->RunAllPending();
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The startup URLs are ignored, and instead the last open sessions are
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // restored.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(profile1->restored_last_session());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(profile2->restored_last_session());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(profile1));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_browser = FindOneOtherBrowserForProfile(profile1, NULL);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, new_browser->tab_count());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(chrome::kAboutBlankURL),
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            chrome::GetWebContentsAt(new_browser, 0)->GetURL());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(profile2));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_browser = FindOneOtherBrowserForProfile(profile2, NULL);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, new_browser->tab_count());
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(chrome::kAboutBlankURL),
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            chrome::GetWebContentsAt(new_browser, 0)->GetURL());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ProfilesWithoutPagesNotLaunched) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* default_profile = browser()->profile();
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create 4 more profiles.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath dest_path1 = profile_manager->user_data_dir().Append(
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("New Profile 1"));
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath dest_path2 = profile_manager->user_data_dir().Append(
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("New Profile 2"));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath dest_path3 = profile_manager->user_data_dir().Append(
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("New Profile 3"));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath dest_path4 = profile_manager->user_data_dir().Append(
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("New Profile 4"));
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_home1 = profile_manager->GetProfile(dest_path1);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile_home1);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_home2 = profile_manager->GetProfile(dest_path2);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile_home2);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_last = profile_manager->GetProfile(dest_path3);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile_last);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_urls = profile_manager->GetProfile(dest_path4);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile_urls);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the profiles to open urls, open last visited pages or display the home
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page.
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref_home(SessionStartupPref::DEFAULT);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(profile_home1, pref_home);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(profile_home2, pref_home);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref_last(SessionStartupPref::LAST);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(profile_last, pref_last);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> urls;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls.push_back(ui_test_utils::GetTestUrl(
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FilePath::kCurrentDirectory),
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FILE_PATH_LITERAL("title1.html"))));
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref_urls(SessionStartupPref::URLS);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_urls.urls = urls;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(profile_urls, pref_urls);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the browser.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->window()->Close();
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do a simple non-process-startup browser launch.
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine dummy(CommandLine::NO_PROGRAM);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int return_code;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreator browser_creator;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Profile*> last_opened_profiles;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles.push_back(profile_home1);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles.push_back(profile_home2);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles.push_back(profile_last);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles.push_back(profile_urls);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_creator.Start(dummy, profile_manager->user_data_dir(), profile_home1,
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        last_opened_profiles, &return_code);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (SessionRestore::IsRestoring(default_profile) ||
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         SessionRestore::IsRestoring(profile_home1) ||
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         SessionRestore::IsRestoring(profile_home2) ||
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         SessionRestore::IsRestoring(profile_last) ||
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         SessionRestore::IsRestoring(profile_urls))
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageLoop::current()->RunAllPending();
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last open profile (the profile_home1 in this case) will always be
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launched, even if it will open just the home page.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(profile_home1));
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_browser = FindOneOtherBrowserForProfile(profile_home1, NULL);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, new_browser->tab_count());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            chrome::GetWebContentsAt(new_browser, 0)->GetURL());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile_urls opened the urls.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(profile_urls));
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_browser = FindOneOtherBrowserForProfile(profile_urls, NULL);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, new_browser->tab_count());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(urls[0], chrome::GetWebContentsAt(new_browser, 0)->GetURL());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile_last opened the last open pages.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(profile_last));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_browser = FindOneOtherBrowserForProfile(profile_last, NULL);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, new_browser->tab_count());
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(chrome::kAboutBlankURL),
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            chrome::GetWebContentsAt(new_browser, 0)->GetURL());
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile_home2 was not launched since it would've only opened the home page.
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, chrome::GetBrowserCount(profile_home2));
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, ProfilesLaunchedAfterCrash) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After an unclean exit, all profiles will be launched. However, they won't
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // open any pages automatically.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileManager* profile_manager = g_browser_process->profile_manager();
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create 3 profiles.
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath dest_path1 = profile_manager->user_data_dir().Append(
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("New Profile 1"));
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath dest_path2 = profile_manager->user_data_dir().Append(
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("New Profile 2"));
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath dest_path3 = profile_manager->user_data_dir().Append(
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("New Profile 3"));
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_home = profile_manager->GetProfile(dest_path1);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile_home);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_last = profile_manager->GetProfile(dest_path2);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile_last);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_urls = profile_manager->GetProfile(dest_path3);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(profile_urls);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the profiles to open the home page, last visited pages or URLs.
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref_home(SessionStartupPref::DEFAULT);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(profile_home, pref_home);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref_last(SessionStartupPref::LAST);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(profile_last, pref_last);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> urls;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  urls.push_back(ui_test_utils::GetTestUrl(
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FilePath::kCurrentDirectory),
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePath(FILE_PATH_LITERAL("title1.html"))));
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref pref_urls(SessionStartupPref::URLS);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_urls.urls = urls;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionStartupPref::SetStartupPref(profile_urls, pref_urls);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a launch after an unclear exit.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->window()->Close();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<ProfileImpl*>(profile_home)->last_session_exit_type_ =
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::EXIT_CRASHED;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<ProfileImpl*>(profile_last)->last_session_exit_type_ =
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::EXIT_CRASHED;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<ProfileImpl*>(profile_urls)->last_session_exit_type_ =
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::EXIT_CRASHED;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine dummy(CommandLine::NO_PROGRAM);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int return_code;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreator browser_creator;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Profile*> last_opened_profiles;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles.push_back(profile_home);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles.push_back(profile_last);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_opened_profiles.push_back(profile_urls);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_creator.Start(dummy, profile_manager->user_data_dir(), profile_home,
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        last_opened_profiles, &return_code);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No profiles are getting restored, since they all display the crash info
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bar.
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(SessionRestore::IsRestoring(profile_home));
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(SessionRestore::IsRestoring(profile_last));
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(SessionRestore::IsRestoring(profile_urls));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The profile which normally opens the home page displays the new tab page.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(profile_home));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_browser = FindOneOtherBrowserForProfile(profile_home, NULL);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, new_browser->tab_count());
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WebContents* web_contents = chrome::GetWebContentsAt(new_browser, 0);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            web_contents->GetURL());
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, InfoBarTabHelper::FromWebContents(web_contents)->
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetInfoBarCount());
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The profile which normally opens last open pages displays the new tab page.
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(profile_last));
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_browser = FindOneOtherBrowserForProfile(profile_last, NULL);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, new_browser->tab_count());
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents = chrome::GetWebContentsAt(new_browser, 0);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            web_contents->GetURL());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, InfoBarTabHelper::FromWebContents(web_contents)->
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetInfoBarCount());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The profile which normally opens URLs displays the new tab page.
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(profile_urls));
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_browser = FindOneOtherBrowserForProfile(profile_urls, NULL);
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, new_browser->tab_count());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents = chrome::GetWebContentsAt(new_browser, 0);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            web_contents->GetURL());
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, InfoBarTabHelper::FromWebContents(web_contents)->
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetInfoBarCount());
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !OS_CHROMEOS
683