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)#ifndef CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.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/ui/startup/startup_tab.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_types.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base {
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandLine;
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class containing helpers for BrowserMain to spin up a new instance and
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// initialize the profile.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StartupBrowserCreator {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<Profile*> Profiles;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartupBrowserCreator();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~StartupBrowserCreator();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a url to be opened during first run. This overrides the standard
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tabs shown at first run.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddFirstRunTab(const GURL& url);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function is equivalent to ProcessCommandLine but should only be
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called during actual process startup.
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool Start(const base::CommandLine& cmd_line,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             const base::FilePath& cur_dir,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             Profile* last_used_profile,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const Profiles& last_opened_profiles,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int* return_code) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ProcessCmdLineImpl(cmd_line, cur_dir, true, last_used_profile,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              last_opened_profiles, return_code, this);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function performs command-line handling and is invoked only after
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // start up (for example when we get a start request for another process).
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |command_line| holds the command line we need to process.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |cur_dir| is the current working directory that the original process was
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // invoked from.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |startup_profile_dir| is the directory that contains the profile that the
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // command line arguments will be executed under.
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void ProcessCommandLineAlreadyRunning(
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::CommandLine& command_line,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& cur_dir,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& startup_profile_dir);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if we're launching a profile synchronously. In that case, the
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // opened window should not cause a session restore.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool InSynchronousProfileLaunch();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launches a browser window associated with |profile|. |command_line| should
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be the command line passed to this process. |cur_dir| can be empty, which
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implies that the directory of the executable should be used.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |process_startup| indicates whether this is the first browser.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |is_first_run| indicates that this is a new profile.
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool LaunchBrowser(const base::CommandLine& command_line,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     Profile* profile,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const base::FilePath& cur_dir,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     chrome::startup::IsProcessStartup is_process_startup,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     chrome::startup::IsFirstRun is_first_run,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     int* return_code);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When called the first time, reads the value of the preference kWasRestarted
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and resets it to false. Subsequent calls return the value which was read
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the first time.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool WasRestarted();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static SessionStartupPref GetSessionStartupPref(
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::CommandLine& command_line,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile* profile);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_is_default_browser_dialog_suppressed(bool new_value) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_default_browser_dialog_suppressed_ = new_value;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_default_browser_dialog_suppressed() const {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return is_default_browser_dialog_suppressed_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_show_main_browser_window(bool show_main_browser_window) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_main_browser_window_ = show_main_browser_window;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool show_main_browser_window() const {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return show_main_browser_window_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For faking that no profiles have been launched yet.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void ClearLaunchedProfilesForTesting();
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class CloudPrintProxyPolicyTest;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class CloudPrintProxyPolicyStartupTest;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class StartupBrowserCreatorImpl;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ReadingWasRestartedAfterNormalStart);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ReadingWasRestartedAfterRestart);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest, UpdateWithTwoProfiles);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest, LastUsedProfileActivated);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the list of URLs to open from the command line. The returned
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // vector is empty if the user didn't specify any URLs on the command line.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::vector<GURL> GetURLsFromCommandLine(
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::CommandLine& command_line,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& cur_dir,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile* profile);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static bool ProcessCmdLineImpl(const base::CommandLine& command_line,
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const base::FilePath& cur_dir,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool process_startup,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 Profile* last_used_profile,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const Profiles& last_opened_profiles,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int* return_code,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 StartupBrowserCreator* browser_creator);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback after a profile has been created.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ProcessCommandLineOnProfileCreated(
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::CommandLine& command_line,
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& cur_dir,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile* profile,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::CreateStatus status);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true once a profile was activated. Used by the
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // StartupBrowserCreatorTest.LastUsedProfileActivated test.
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool ActivatedProfile();
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Additional tabs to open during first run.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> first_run_tabs_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // True if the set-as-default dialog has been explicitly suppressed.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This information is used to allow the default browser prompt to show on
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first-run when the dialog has been suppressed.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_default_browser_dialog_suppressed_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the browser window should be shown immediately after it has been
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // created. Default is true.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool show_main_browser_window_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if we have already read and reset the preference kWasRestarted. (A
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // member variable instead of a static variable inside WasRestarted because
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of testing.)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool was_restarted_read_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool in_synchronous_profile_launch_;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(StartupBrowserCreator);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns true if |profile| has exited uncleanly and has not been launched
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// after the unclean exit.
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HasPendingUncleanExit(Profile* profile);
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns the path that contains the profile that should be loaded on process
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// startup.
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::FilePath GetStartupProfilePath(const base::FilePath& user_data_dir,
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     const base::CommandLine& command_line);
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_H_
177