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