OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_H_ | 5 #ifndef CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_H_ |
6 #define CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_H_ | 6 #define CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
13 #include "base/file_path.h" | 13 #include "base/file_path.h" |
14 #include "base/gtest_prod_util.h" | 14 #include "base/gtest_prod_util.h" |
15 #include "chrome/browser/prefs/session_startup_pref.h" | 15 #include "chrome/browser/prefs/session_startup_pref.h" |
16 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
17 #include "chrome/browser/ui/startup/startup_types.h" | |
18 #include "chrome/browser/ui/startup/startup_tab.h" | |
19 #include "googleurl/src/gurl.h" | 17 #include "googleurl/src/gurl.h" |
20 | 18 |
21 class Browser; | 19 class Browser; |
22 class CommandLine; | 20 class CommandLine; |
23 class GURL; | 21 class GURL; |
24 class PrefService; | 22 class PrefService; |
25 class TabContentsWrapper; | 23 class TabContentsWrapper; |
26 | 24 |
27 // class containing helpers for BrowserMain to spin up a new instance and | 25 // class containing helpers for BrowserMain to spin up a new instance and |
28 // initialize the profile. | 26 // initialize the profile. |
29 class StartupBrowserCreator { | 27 class StartupBrowserCreator { |
30 public: | 28 public: |
31 typedef std::vector<Profile*> Profiles; | 29 typedef std::vector<Profile*> Profiles; |
32 | 30 |
| 31 enum IsProcessStartup { |
| 32 IS_NOT_PROCESS_STARTUP, |
| 33 IS_PROCESS_STARTUP |
| 34 }; |
| 35 enum IsFirstRun { |
| 36 IS_NOT_FIRST_RUN, |
| 37 IS_FIRST_RUN |
| 38 }; |
| 39 |
33 StartupBrowserCreator(); | 40 StartupBrowserCreator(); |
34 ~StartupBrowserCreator(); | 41 ~StartupBrowserCreator(); |
35 | 42 |
36 // Adds a url to be opened during first run. This overrides the standard | 43 // Adds a url to be opened during first run. This overrides the standard |
37 // tabs shown at first run. | 44 // tabs shown at first run. |
38 void AddFirstRunTab(const GURL& url); | 45 void AddFirstRunTab(const GURL& url); |
39 | 46 |
40 // This function is equivalent to ProcessCommandLine but should only be | 47 // This function is equivalent to ProcessCommandLine but should only be |
41 // called during actual process startup. | 48 // called during actual process startup. |
42 bool Start(const CommandLine& cmd_line, | 49 bool Start(const CommandLine& cmd_line, |
(...skipping 21 matching lines...) Expand all Loading... |
64 static bool InSynchronousProfileLaunch(); | 71 static bool InSynchronousProfileLaunch(); |
65 | 72 |
66 // Launches a browser window associated with |profile|. |command_line| should | 73 // Launches a browser window associated with |profile|. |command_line| should |
67 // be the command line passed to this process. |cur_dir| can be empty, which | 74 // be the command line passed to this process. |cur_dir| can be empty, which |
68 // implies that the directory of the executable should be used. | 75 // implies that the directory of the executable should be used. |
69 // |process_startup| indicates whether this is the first browser. | 76 // |process_startup| indicates whether this is the first browser. |
70 // |is_first_run| indicates that this is a new profile. | 77 // |is_first_run| indicates that this is a new profile. |
71 bool LaunchBrowser(const CommandLine& command_line, | 78 bool LaunchBrowser(const CommandLine& command_line, |
72 Profile* profile, | 79 Profile* profile, |
73 const FilePath& cur_dir, | 80 const FilePath& cur_dir, |
74 browser::startup::IsProcessStartup is_process_startup, | 81 IsProcessStartup is_process_startup, |
75 browser::startup::IsFirstRun is_first_run, | 82 IsFirstRun is_first_run, |
76 int* return_code); | 83 int* return_code); |
77 | 84 |
78 // When called the first time, reads the value of the preference kWasRestarted | 85 // When called the first time, reads the value of the preference kWasRestarted |
79 // and resets it to false. Subsequent calls return the value which was read | 86 // and resets it to false. Subsequent calls return the value which was read |
80 // the first time. | 87 // the first time. |
81 static bool WasRestarted(); | 88 static bool WasRestarted(); |
82 | 89 |
83 static SessionStartupPref GetSessionStartupPref( | 90 static SessionStartupPref GetSessionStartupPref( |
84 const CommandLine& command_line, | 91 const CommandLine& command_line, |
85 Profile* profile); | 92 Profile* profile); |
86 | 93 |
| 94 // LaunchWithProfile --------------------------------------------------------- |
| 95 // |
| 96 // Assists launching the application and appending the initial tabs for a |
| 97 // browser window. |
| 98 |
| 99 class LaunchWithProfile { |
| 100 public: |
| 101 // Used by OpenTabsInBrowser. |
| 102 struct Tab { |
| 103 Tab(); |
| 104 ~Tab(); |
| 105 |
| 106 // The url to load. |
| 107 GURL url; |
| 108 |
| 109 // If true, the tab corresponds to an app an |app_id| gives the id of the |
| 110 // app. |
| 111 bool is_app; |
| 112 |
| 113 // True if the is tab pinned. |
| 114 bool is_pinned; |
| 115 |
| 116 // Id of the app. |
| 117 std::string app_id; |
| 118 }; |
| 119 |
| 120 // There are two ctors. The first one implies a NULL browser_creator object |
| 121 // and thus no access to distribution-specific first-run behaviors. The |
| 122 // second one is always called when the browser starts even if it is not |
| 123 // the first run. |is_first_run| indicates that this is a new profile. |
| 124 LaunchWithProfile(const FilePath& cur_dir, |
| 125 const CommandLine& command_line, |
| 126 IsFirstRun is_first_run); |
| 127 LaunchWithProfile(const FilePath& cur_dir, |
| 128 const CommandLine& command_line, |
| 129 StartupBrowserCreator* browser_creator, |
| 130 IsFirstRun is_first_run); |
| 131 ~LaunchWithProfile(); |
| 132 |
| 133 // Creates the necessary windows for startup. Returns true on success, |
| 134 // false on failure. process_startup is true if Chrome is just |
| 135 // starting up. If process_startup is false, it indicates Chrome was |
| 136 // already running and the user wants to launch another instance. |
| 137 bool Launch(Profile* profile, |
| 138 const std::vector<GURL>& urls_to_open, |
| 139 bool process_startup); |
| 140 |
| 141 // Convenience for OpenTabsInBrowser that converts |urls| into a set of |
| 142 // Tabs. |
| 143 Browser* OpenURLsInBrowser(Browser* browser, |
| 144 bool process_startup, |
| 145 const std::vector<GURL>& urls); |
| 146 |
| 147 // Creates a tab for each of the Tabs in |tabs|. If browser is non-null |
| 148 // and a tabbed browser, the tabs are added to it. Otherwise a new tabbed |
| 149 // browser is created and the tabs are added to it. The browser the tabs |
| 150 // are added to is returned, which is either |browser| or the newly created |
| 151 // browser. |
| 152 Browser* OpenTabsInBrowser(Browser* browser, |
| 153 bool process_startup, |
| 154 const std::vector<Tab>& tabs); |
| 155 |
| 156 private: |
| 157 FRIEND_TEST_ALL_PREFIXES(BrowserTest, RestorePinnedTabs); |
| 158 FRIEND_TEST_ALL_PREFIXES(BrowserTest, AppIdSwitch); |
| 159 |
| 160 // If the process was launched with the web application command line flags, |
| 161 // e.g. --app=http://www.google.com/ or --app_id=... return true. |
| 162 // In this case |app_url| or |app_id| are populated if they're non-null. |
| 163 bool IsAppLaunch(std::string* app_url, std::string* app_id); |
| 164 |
| 165 // If IsAppLaunch is true, tries to open an application window. |
| 166 // If the app is specified to start in a tab, or IsAppLaunch is false, |
| 167 // returns false to specify default processing. |
| 168 bool OpenApplicationWindow(Profile* profile); |
| 169 |
| 170 // If IsAppLaunch is true and the user set a pref indicating that the app |
| 171 // should open in a tab, do so. |
| 172 bool OpenApplicationTab(Profile* profile); |
| 173 |
| 174 // Invoked from Launch to handle processing of urls. This may do any of the |
| 175 // following: |
| 176 // . Invoke ProcessStartupURLs if |process_startup| is true. |
| 177 // . If |process_startup| is false, restore the last session if necessary, |
| 178 // or invoke ProcessSpecifiedURLs. |
| 179 // . Open the urls directly. |
| 180 void ProcessLaunchURLs(bool process_startup, |
| 181 const std::vector<GURL>& urls_to_open); |
| 182 |
| 183 // Does the following: |
| 184 // . If the user's startup pref is to restore the last session (or the |
| 185 // command line flag is present to force using last session), it is |
| 186 // restored. |
| 187 // . Otherwise invoke ProcessSpecifiedURLs |
| 188 // If a browser was created, true is returned. Otherwise returns false and |
| 189 // the caller must create a new browser. |
| 190 bool ProcessStartupURLs(const std::vector<GURL>& urls_to_open); |
| 191 |
| 192 // Invoked from either ProcessLaunchURLs or ProcessStartupURLs to handle |
| 193 // processing of URLs where the behavior is common between process startup |
| 194 // and launch via an existing process (i.e. those explicitly specified by |
| 195 // the user somehow). Does the following: |
| 196 // . Attempts to restore any pinned tabs from last run of chrome. |
| 197 // . If urls_to_open is non-empty, they are opened. |
| 198 // . If the user's startup pref is to launch a specific set of URLs they |
| 199 // are opened. |
| 200 // |
| 201 // If any tabs were opened, the Browser which was created is returned. |
| 202 // Otherwise null is returned and the caller must create a new browser. |
| 203 Browser* ProcessSpecifiedURLs(const std::vector<GURL>& urls_to_open); |
| 204 |
| 205 // Adds a Tab to |tabs| for each url in |urls| that doesn't already exist |
| 206 // in |tabs|. |
| 207 void AddUniqueURLs(const std::vector<GURL>& urls, |
| 208 std::vector<Tab>* tabs); |
| 209 |
| 210 // Adds any startup infobars to the selected tab of the given browser. |
| 211 void AddInfoBarsIfNecessary(Browser* browser, |
| 212 IsProcessStartup is_process_startup); |
| 213 |
| 214 // Adds additional startup URLs to the specified vector. |
| 215 void AddStartupURLs(std::vector<GURL>* startup_urls) const; |
| 216 |
| 217 // Checks whether the Preferences backup is invalid and notifies user in |
| 218 // that case. |
| 219 void CheckPreferencesBackup(Profile* profile); |
| 220 |
| 221 const FilePath cur_dir_; |
| 222 const CommandLine& command_line_; |
| 223 Profile* profile_; |
| 224 StartupBrowserCreator* browser_creator_; |
| 225 bool is_first_run_; |
| 226 DISALLOW_COPY_AND_ASSIGN(LaunchWithProfile); |
| 227 }; |
| 228 |
87 private: | 229 private: |
88 friend class CloudPrintProxyPolicyTest; | 230 friend class CloudPrintProxyPolicyTest; |
89 friend class CloudPrintProxyPolicyStartupTest; | 231 friend class CloudPrintProxyPolicyStartupTest; |
90 friend class StartupBrowserCreatorImpl; | |
91 FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest, | 232 FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest, |
92 ReadingWasRestartedAfterNormalStart); | 233 ReadingWasRestartedAfterNormalStart); |
93 FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest, | 234 FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest, |
94 ReadingWasRestartedAfterRestart); | 235 ReadingWasRestartedAfterRestart); |
95 FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest, UpdateWithTwoProfiles); | 236 FRIEND_TEST_ALL_PREFIXES(StartupBrowserCreatorTest, UpdateWithTwoProfiles); |
96 | 237 |
97 // Returns the list of URLs to open from the command line. The returned | 238 // Returns the list of URLs to open from the command line. The returned |
98 // vector is empty if the user didn't specify any URLs on the command line. | 239 // vector is empty if the user didn't specify any URLs on the command line. |
99 static std::vector<GURL> GetURLsFromCommandLine( | 240 static std::vector<GURL> GetURLsFromCommandLine( |
100 const CommandLine& command_line, | 241 const CommandLine& command_line, |
(...skipping 20 matching lines...) Expand all Loading... |
121 | 262 |
122 // True if we have already read and reset the preference kWasRestarted. (A | 263 // True if we have already read and reset the preference kWasRestarted. (A |
123 // member variable instead of a static variable inside WasRestarted because | 264 // member variable instead of a static variable inside WasRestarted because |
124 // of testing.) | 265 // of testing.) |
125 static bool was_restarted_read_; | 266 static bool was_restarted_read_; |
126 | 267 |
127 DISALLOW_COPY_AND_ASSIGN(StartupBrowserCreator); | 268 DISALLOW_COPY_AND_ASSIGN(StartupBrowserCreator); |
128 }; | 269 }; |
129 | 270 |
130 #endif // CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_H_ | 271 #endif // CHROME_BROWSER_UI_STARTUP_STARTUP_BROWSER_CREATOR_H_ |
OLD | NEW |