Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(191)

Side by Side Diff: chrome/browser/browser_init.cc

Issue 19746: Remove old web app code it's no longer needed. Simplifies startup a little. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 #include "chrome/browser/browser_init.h" 5 #include "chrome/browser/browser_init.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/event_recorder.h" 9 #include "base/event_recorder.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
(...skipping 20 matching lines...) Expand all
31 #include "base/win_util.h" 31 #include "base/win_util.h"
32 #include "chrome/app/locales/locale_settings.h" 32 #include "chrome/app/locales/locale_settings.h"
33 #include "chrome/app/theme/theme_resources.h" 33 #include "chrome/app/theme/theme_resources.h"
34 #include "chrome/browser/automation/automation_provider.h" 34 #include "chrome/browser/automation/automation_provider.h"
35 #include "chrome/browser/automation/automation_provider_list.h" 35 #include "chrome/browser/automation/automation_provider_list.h"
36 #include "chrome/browser/net/url_fixer_upper.h" 36 #include "chrome/browser/net/url_fixer_upper.h"
37 #include "chrome/browser/search_engines/template_url_model.h" 37 #include "chrome/browser/search_engines/template_url_model.h"
38 #include "chrome/browser/sessions/session_restore.h" 38 #include "chrome/browser/sessions/session_restore.h"
39 #include "chrome/browser/tab_contents/infobar_delegate.h" 39 #include "chrome/browser/tab_contents/infobar_delegate.h"
40 #include "chrome/browser/tab_contents/navigation_controller.h" 40 #include "chrome/browser/tab_contents/navigation_controller.h"
41 #include "chrome/browser/web_app_launcher.h"
42 #include "chrome/common/resource_bundle.h" 41 #include "chrome/common/resource_bundle.h"
43 42
44 #include "chromium_strings.h" 43 #include "chromium_strings.h"
45 #include "generated_resources.h" 44 #include "generated_resources.h"
46 45
47 #endif 46 #endif
48 47
49 namespace { 48 namespace {
50 49
51 // A delegate for the InfoBar shown when the previous session has crashed. The 50 // A delegate for the InfoBar shown when the previous session has crashed. The
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 return true; 95 return true;
97 } 96 }
98 97
99 private: 98 private:
100 // The Profile that we restore sessions from. 99 // The Profile that we restore sessions from.
101 Profile* profile_; 100 Profile* profile_;
102 101
103 DISALLOW_COPY_AND_ASSIGN(SessionCrashedInfoBarDelegate); 102 DISALLOW_COPY_AND_ASSIGN(SessionCrashedInfoBarDelegate);
104 }; 103 };
105 104
106 void SetOverrideHomePage(PrefService* prefs) { 105 void SetOverrideHomePage(const CommandLine& command_line,
107 const CommandLine* command_line = CommandLine::ForCurrentProcess(); 106 PrefService* prefs) {
108 // If homepage is specified on the command line, canonify & store it. 107 // If homepage is specified on the command line, canonify & store it.
109 if (command_line->HasSwitch(switches::kHomePage)) { 108 if (command_line.HasSwitch(switches::kHomePage)) {
110 std::wstring browser_directory; 109 std::wstring browser_directory;
111 PathService::Get(base::DIR_CURRENT, &browser_directory); 110 PathService::Get(base::DIR_CURRENT, &browser_directory);
112 std::wstring new_homepage = URLFixerUpper::FixupRelativeFile( 111 std::wstring new_homepage = URLFixerUpper::FixupRelativeFile(
113 browser_directory, 112 browser_directory,
114 command_line->GetSwitchValue(switches::kHomePage)); 113 command_line.GetSwitchValue(switches::kHomePage));
115 prefs->transient()->SetString(prefs::kHomePage, new_homepage); 114 prefs->transient()->SetString(prefs::kHomePage, new_homepage);
116 prefs->transient()->SetBoolean(prefs::kHomePageIsNewTabPage, false); 115 prefs->transient()->SetBoolean(prefs::kHomePageIsNewTabPage, false);
117 } 116 }
118 } 117 }
119 118
120 SessionStartupPref GetSessionStartupPref(Profile* profile) { 119 SessionStartupPref GetSessionStartupPref(const CommandLine& command_line,
121 const CommandLine* command_line = CommandLine::ForCurrentProcess(); 120 Profile* profile) {
122 SessionStartupPref pref = SessionStartupPref::GetStartupPref(profile); 121 SessionStartupPref pref = SessionStartupPref::GetStartupPref(profile);
123 if (command_line->HasSwitch(switches::kRestoreLastSession)) 122 if (command_line.HasSwitch(switches::kRestoreLastSession))
124 pref.type = SessionStartupPref::LAST; 123 pref.type = SessionStartupPref::LAST;
125 if (command_line->HasSwitch(switches::kIncognito) && 124 if (command_line.HasSwitch(switches::kIncognito) &&
126 pref.type == SessionStartupPref::LAST) { 125 pref.type == SessionStartupPref::LAST) {
127 // We don't store session information when incognito. If the user has 126 // We don't store session information when incognito. If the user has
128 // chosen to restore last session and launched incognito, fallback to 127 // chosen to restore last session and launched incognito, fallback to
129 // default launch behavior. 128 // default launch behavior.
130 pref.type = SessionStartupPref::DEFAULT; 129 pref.type = SessionStartupPref::DEFAULT;
131 } 130 }
132 return pref; 131 return pref;
133 } 132 }
134 133
135 } // namespace 134 } // namespace
136 135
137 static bool in_startup = false; 136 static bool in_startup = false;
138 137
139 // static 138 // static
140 bool BrowserInit::InProcessStartup() { 139 bool BrowserInit::InProcessStartup() {
141 return in_startup; 140 return in_startup;
142 } 141 }
143 142
144 // LaunchWithProfile ---------------------------------------------------------- 143 // LaunchWithProfile ----------------------------------------------------------
145 144
146 BrowserInit::LaunchWithProfile::LaunchWithProfile(const std::wstring& cur_dir) 145 BrowserInit::LaunchWithProfile::LaunchWithProfile(
147 : cur_dir_(cur_dir) { 146 const std::wstring& cur_dir,
147 const CommandLine& command_line)
148 : cur_dir_(cur_dir),
149 command_line_(command_line) {
148 } 150 }
149 151
150 bool BrowserInit::LaunchWithProfile::Launch(Profile* profile, 152 bool BrowserInit::LaunchWithProfile::Launch(Profile* profile,
151 bool process_startup) { 153 bool process_startup) {
152 DCHECK(profile); 154 DCHECK(profile);
153 profile_ = profile; 155 profile_ = profile;
154 156
155 const CommandLine* command_line = CommandLine::ForCurrentProcess(); 157 if (command_line_.HasSwitch(switches::kDnsLogDetails))
156 if (command_line->HasSwitch(switches::kDnsLogDetails))
157 chrome_browser_net::EnableDnsDetailedLog(true); 158 chrome_browser_net::EnableDnsDetailedLog(true);
158 if (command_line->HasSwitch(switches::kDnsPrefetchDisable)) 159 if (command_line_.HasSwitch(switches::kDnsPrefetchDisable))
159 chrome_browser_net::EnableDnsPrefetch(false); 160 chrome_browser_net::EnableDnsPrefetch(false);
160 161
161 if (command_line->HasSwitch(switches::kDumpHistogramsOnExit)) 162 if (command_line_.HasSwitch(switches::kDumpHistogramsOnExit))
162 StatisticsRecorder::set_dump_on_exit(true); 163 StatisticsRecorder::set_dump_on_exit(true);
163 164
164 if (command_line->HasSwitch(switches::kRemoteShellPort)) { 165 if (command_line_.HasSwitch(switches::kRemoteShellPort)) {
165 if (!RenderProcessHost::run_renderer_in_process()) { 166 if (!RenderProcessHost::run_renderer_in_process()) {
166 std::wstring port_str = 167 std::wstring port_str =
167 command_line->GetSwitchValue(switches::kRemoteShellPort); 168 command_line_.GetSwitchValue(switches::kRemoteShellPort);
168 int64 port = StringToInt64(port_str); 169 int64 port = StringToInt64(port_str);
169 if (port > 0 && port < 65535) { 170 if (port > 0 && port < 65535) {
170 g_browser_process->InitDebuggerWrapper(static_cast<int>(port)); 171 g_browser_process->InitDebuggerWrapper(static_cast<int>(port));
171 } else { 172 } else {
172 DLOG(WARNING) << "Invalid port number " << port; 173 DLOG(WARNING) << "Invalid port number " << port;
173 } 174 }
174 } 175 }
175 } 176 }
176 177
177 if (command_line->HasSwitch(switches::kEnableFileCookies)) 178 if (command_line_.HasSwitch(switches::kEnableFileCookies))
178 net::CookieMonster::EnableFileScheme(); 179 net::CookieMonster::EnableFileScheme();
179 180
180 if (command_line->HasSwitch(switches::kUserAgent)) { 181 if (command_line_.HasSwitch(switches::kUserAgent)) {
181 #if defined(OS_WIN) 182 #if defined(OS_WIN)
182 webkit_glue::SetUserAgent(WideToUTF8( 183 webkit_glue::SetUserAgent(WideToUTF8(
183 command_line->GetSwitchValue(switches::kUserAgent))); 184 command_line_.GetSwitchValue(switches::kUserAgent)));
184 // TODO(port): hook this up when we bring in webkit. 185 // TODO(port): hook this up when we bring in webkit.
185 #endif 186 #endif
186 } 187 }
187 188
188 #ifndef NDEBUG 189 // Open the required browser windows and tabs.
189 if (command_line->HasSwitch(switches::kApp)) 190 // First, see if we're being run as a web application (thin frame window).
190 NOTREACHED(); 191 if (!OpenApplicationURL(profile)) {
191 #endif // NDEBUG 192 std::vector<GURL> urls_to_open = GetURLsFromCommandLine(profile_);
192 193 // Always attempt to restore the last session. OpenStartupURLs only opens
193 std::vector<GURL> urls_to_open = GetURLsFromCommandLine(profile_); 194 // the home pages if no additional URLs were passed on the command line.
194 195 if (!OpenStartupURLs(process_startup, urls_to_open)) {
195 Browser* browser = NULL; 196 // Add the home page and any special first run URLs.
196 197 AddStartupURLs(&urls_to_open);
197 // Always attempt to restore the last session. OpenStartupURLs only opens the 198 OpenURLsInBrowser(BrowserList::GetLastActive(), process_startup,
198 // home pages if no additional URLs were passed on the command line. 199 urls_to_open);
199 bool opened_startup_urls = OpenStartupURLs(process_startup, urls_to_open);
200
201 if (!opened_startup_urls) {
202 if (urls_to_open.empty()) {
203 urls_to_open.push_back(GURL()); // New tab page.
204 PrefService* prefs = g_browser_process->local_state();
205 if (prefs->IsPrefRegistered(prefs::kShouldShowWelcomePage) &&
206 prefs->GetBoolean(prefs::kShouldShowWelcomePage)) {
207 // Reset the preference so we don't show the welcome page next time.
208 prefs->ClearPref(prefs::kShouldShowWelcomePage);
209
210 #if defined(OS_WIN)
211 // Add the welcome page.
212 std::wstring welcome_url = l10n_util::GetString(IDS_WELCOME_PAGE_URL);
213 urls_to_open.push_back(GURL(welcome_url));
214 #else
215 // TODO(port): implement welcome page.
216 NOTIMPLEMENTED();
217 #endif
218 }
219 } else {
220 browser = BrowserList::GetLastActive();
221 } 200 }
222
223 browser = OpenURLsInBrowser(browser, process_startup, urls_to_open);
224 } 201 }
225 202
226 // It is possible to end here with a NULL 'browser'. For example if the user 203 // If we're recording or playing back, startup the EventRecorder now
227 // has tweaked the startup session restore preferences. 204 // unless otherwise specified.
205 if (!command_line_.HasSwitch(switches::kNoEvents)) {
206 std::wstring script_path;
207 PathService::Get(chrome::FILE_RECORDED_SCRIPT, &script_path);
228 208
229 if (browser) { 209 bool record_mode = command_line_.HasSwitch(switches::kRecordMode);
230 // If we're recording or playing back, startup the EventRecorder now 210 bool playback_mode = command_line_.HasSwitch(switches::kPlaybackMode);
231 // unless otherwise specified.
232 if (!command_line->HasSwitch(switches::kNoEvents)) {
233 std::wstring script_path;
234 PathService::Get(chrome::FILE_RECORDED_SCRIPT, &script_path);
235 211
236 bool record_mode = command_line->HasSwitch(switches::kRecordMode); 212 if (record_mode && chrome::kRecordModeEnabled)
237 bool playback_mode = command_line->HasSwitch(switches::kPlaybackMode); 213 base::EventRecorder::current()->StartRecording(script_path);
238 214 if (playback_mode)
239 if (record_mode && chrome::kRecordModeEnabled) 215 base::EventRecorder::current()->StartPlayback(script_path);
240 base::EventRecorder::current()->StartRecording(script_path);
241 if (playback_mode)
242 base::EventRecorder::current()->StartPlayback(script_path);
243 }
244 } 216 }
245 217
246 return true; 218 return true;
247 } 219 }
248 220
221 bool BrowserInit::LaunchWithProfile::OpenApplicationURL(Profile* profile) {
222 if (!command_line_.HasSwitch(switches::kApp))
223 return false;
224
225 GURL url(WideToUTF8(command_line_.GetSwitchValue(switches::kApp)));
226 if (!url.is_empty() && url.is_valid()) {
227 Browser::OpenApplicationWindow(profile, url);
228 return true;
229 }
230 return false;
231 }
232
249 bool BrowserInit::LaunchWithProfile::OpenStartupURLs( 233 bool BrowserInit::LaunchWithProfile::OpenStartupURLs(
250 bool is_process_startup, 234 bool is_process_startup,
251 const std::vector<GURL>& urls_to_open) { 235 const std::vector<GURL>& urls_to_open) {
252 const CommandLine* command_line = CommandLine::ForCurrentProcess(); 236 SessionStartupPref pref = GetSessionStartupPref(command_line_, profile_);
253 SessionStartupPref pref = GetSessionStartupPref(profile_);
254 switch (pref.type) { 237 switch (pref.type) {
255 case SessionStartupPref::LAST: 238 case SessionStartupPref::LAST:
256 if (!is_process_startup) 239 if (!is_process_startup)
257 return false; 240 return false;
258 241
259 if (!profile_->DidLastSessionExitCleanly() && 242 if (!profile_->DidLastSessionExitCleanly() &&
260 !command_line->HasSwitch(switches::kRestoreLastSession)) { 243 !command_line_.HasSwitch(switches::kRestoreLastSession)) {
261 // The last session crashed. It's possible automatically loading the 244 // The last session crashed. It's possible automatically loading the
262 // page will trigger another crash, locking the user out of chrome. 245 // page will trigger another crash, locking the user out of chrome.
263 // To avoid this, don't restore on startup but instead show the crashed 246 // To avoid this, don't restore on startup but instead show the crashed
264 // infobar. 247 // infobar.
265 return false; 248 return false;
266 } 249 }
267 SessionRestore::RestoreSessionSynchronously(profile_, urls_to_open); 250 SessionRestore::RestoreSessionSynchronously(profile_, urls_to_open);
268 return true; 251 return true;
269 252
270 case SessionStartupPref::URLS: 253 case SessionStartupPref::URLS:
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 // The last session didn't exit cleanly. Show an infobar to the user 293 // The last session didn't exit cleanly. Show an infobar to the user
311 // so that they can restore if they want. The delegate deletes itself when 294 // so that they can restore if they want. The delegate deletes itself when
312 // it is closed. 295 // it is closed.
313 tab->AddInfoBar(new SessionCrashedInfoBarDelegate(tab)); 296 tab->AddInfoBar(new SessionCrashedInfoBarDelegate(tab));
314 } 297 }
315 } 298 }
316 299
317 std::vector<GURL> BrowserInit::LaunchWithProfile::GetURLsFromCommandLine( 300 std::vector<GURL> BrowserInit::LaunchWithProfile::GetURLsFromCommandLine(
318 Profile* profile) { 301 Profile* profile) {
319 std::vector<GURL> urls; 302 std::vector<GURL> urls;
320 const CommandLine* command_line = CommandLine::ForCurrentProcess(); 303 std::vector<std::wstring> params = command_line_.GetLooseValues();
321 std::vector<std::wstring> params = command_line->GetLooseValues();
322 for (size_t i = 0; i < params.size(); ++i) { 304 for (size_t i = 0; i < params.size(); ++i) {
323 std::wstring& value = params[i]; 305 std::wstring& value = params[i];
324 // Handle Vista way of searching - "? <search-term>" 306 // Handle Vista way of searching - "? <search-term>"
325 if (value.find(L"? ") == 0) { 307 if (value.find(L"? ") == 0) {
326 const TemplateURL* default_provider = 308 const TemplateURL* default_provider =
327 profile->GetTemplateURLModel()->GetDefaultSearchProvider(); 309 profile->GetTemplateURLModel()->GetDefaultSearchProvider();
328 if (!default_provider || !default_provider->url()) { 310 if (!default_provider || !default_provider->url()) {
329 // No search provider available. Just treat this as regular URL. 311 // No search provider available. Just treat this as regular URL.
330 urls.push_back( 312 urls.push_back(
331 GURL(WideToUTF8(URLFixerUpper::FixupRelativeFile(cur_dir_, 313 GURL(WideToUTF8(URLFixerUpper::FixupRelativeFile(cur_dir_,
332 value)))); 314 value))));
333 continue; 315 continue;
334 } 316 }
335 const TemplateURLRef* search_url = default_provider->url(); 317 const TemplateURLRef* search_url = default_provider->url();
336 DCHECK(search_url->SupportsReplacement()); 318 DCHECK(search_url->SupportsReplacement());
337 urls.push_back(GURL(search_url->ReplaceSearchTerms(*default_provider, 319 urls.push_back(GURL(search_url->ReplaceSearchTerms(*default_provider,
338 value.substr(2), TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, 320 value.substr(2), TemplateURLRef::NO_SUGGESTIONS_AVAILABLE,
339 std::wstring()))); 321 std::wstring())));
340 } else { 322 } else {
341 // This will create a file URL or a regular URL. 323 // This will create a file URL or a regular URL.
342 urls.push_back(GURL(WideToUTF8( 324 urls.push_back(GURL(WideToUTF8(
343 URLFixerUpper::FixupRelativeFile(cur_dir_, value)))); 325 URLFixerUpper::FixupRelativeFile(cur_dir_, value))));
344 } 326 }
345 } 327 }
346 return urls; 328 return urls;
347 } 329 }
348 330
331 void BrowserInit::LaunchWithProfile::AddStartupURLs(
332 std::vector<GURL>* startup_urls) const {
333 // Otherwise open at least the new tab page (and the welcome page, if this
334 // is the first time the browser is being started), or the set of URLs
335 // specified on the command line.
336 if (startup_urls->empty()) {
337 startup_urls->push_back(GURL()); // New tab page.
338 PrefService* prefs = g_browser_process->local_state();
339 if (prefs->IsPrefRegistered(prefs::kShouldShowWelcomePage) &&
340 prefs->GetBoolean(prefs::kShouldShowWelcomePage)) {
341 // Reset the preference so we don't show the welcome page next time.
342 prefs->ClearPref(prefs::kShouldShowWelcomePage);
343
344 #if defined(OS_WIN)
345 // Add the welcome page.
346 std::wstring welcome_url = l10n_util::GetString(IDS_WELCOME_PAGE_URL);
347 startup_urls->push_back(GURL(welcome_url));
348 #else
349 // TODO(port): implement welcome page.
350 NOTIMPLEMENTED();
351 #endif
352 }
353 }
354 }
355
349 bool BrowserInit::ProcessCommandLine( 356 bool BrowserInit::ProcessCommandLine(
350 const std::wstring& cur_dir, PrefService* prefs, bool process_startup, 357 const CommandLine& command_line, const std::wstring& cur_dir,
351 Profile* profile, int* return_code) { 358 PrefService* prefs, bool process_startup, Profile* profile,
359 int* return_code) {
352 DCHECK(profile); 360 DCHECK(profile);
353 const CommandLine* command_line = CommandLine::ForCurrentProcess();
354 if (process_startup) { 361 if (process_startup) {
355 const std::wstring popup_count_string = 362 const std::wstring popup_count_string =
356 command_line->GetSwitchValue(switches::kOmniBoxPopupCount); 363 command_line.GetSwitchValue(switches::kOmniBoxPopupCount);
357 if (!popup_count_string.empty()) { 364 if (!popup_count_string.empty()) {
358 int count = 0; 365 int count = 0;
359 if (StringToInt(popup_count_string, &count)) { 366 if (StringToInt(popup_count_string, &count)) {
360 const int popup_count = std::max(0, count); 367 const int popup_count = std::max(0, count);
361 AutocompleteResult::set_max_matches(popup_count); 368 AutocompleteResult::set_max_matches(popup_count);
362 AutocompleteProvider::set_max_matches(popup_count / 2); 369 AutocompleteProvider::set_max_matches(popup_count / 2);
363 } 370 }
364 } 371 }
365 372
366 if (command_line->HasSwitch(switches::kDisablePromptOnRepost)) 373 if (command_line.HasSwitch(switches::kDisablePromptOnRepost))
367 NavigationController::DisablePromptOnRepost(); 374 NavigationController::DisablePromptOnRepost();
368 375
369 const std::wstring tab_count_string = 376 const std::wstring tab_count_string =
370 command_line->GetSwitchValue(switches::kTabCountToLoadOnSessionRestore); 377 command_line.GetSwitchValue(switches::kTabCountToLoadOnSessionRestore);
371 if (!tab_count_string.empty()) { 378 if (!tab_count_string.empty()) {
372 int count = 0; 379 int count = 0;
373 if (StringToInt(tab_count_string, &count)) { 380 if (StringToInt(tab_count_string, &count)) {
374 const int tab_count = std::max(0, count); 381 const int tab_count = std::max(0, count);
375 SessionRestore::num_tabs_to_load_ = static_cast<size_t>(tab_count); 382 SessionRestore::num_tabs_to_load_ = static_cast<size_t>(tab_count);
376 } 383 }
377 } 384 }
378 385
379 #if defined(OS_WIN) 386 #if defined(OS_WIN)
380 // Look for the testing channel ID ONLY during process startup 387 // Look for the testing channel ID ONLY during process startup
381 if (command_line->HasSwitch(switches::kTestingChannelID)) { 388 if (command_line.HasSwitch(switches::kTestingChannelID)) {
382 std::wstring testing_channel_id = 389 std::wstring testing_channel_id =
383 command_line->GetSwitchValue(switches::kTestingChannelID); 390 command_line.GetSwitchValue(switches::kTestingChannelID);
384 // TODO(sanjeevr) Check if we need to make this a singleton for 391 // TODO(sanjeevr) Check if we need to make this a singleton for
385 // compatibility with the old testing code 392 // compatibility with the old testing code
386 // If there are any loose parameters, we expect each one to generate a 393 // If there are any loose parameters, we expect each one to generate a
387 // new tab; if there are none then we get one homepage tab. 394 // new tab; if there are none then we get one homepage tab.
388 CreateAutomationProvider<TestingAutomationProvider>( 395 CreateAutomationProvider<TestingAutomationProvider>(
389 testing_channel_id, 396 testing_channel_id,
390 profile, 397 profile,
391 std::max(static_cast<int>(command_line->GetLooseValues().size()), 398 std::max(static_cast<int>(command_line.GetLooseValues().size()),
392 1)); 399 1));
393 } 400 }
394 #endif 401 #endif
395 } 402 }
396 403
397 // Allow the command line to override the persisted setting of home page. 404 // Allow the command line to override the persisted setting of home page.
398 SetOverrideHomePage(profile->GetPrefs()); 405 SetOverrideHomePage(command_line, profile->GetPrefs());
399 406
400 if (command_line->HasSwitch(switches::kBrowserStartRenderersManually)) 407 if (command_line.HasSwitch(switches::kBrowserStartRenderersManually))
401 prefs->transient()->SetBoolean(prefs::kStartRenderersManually, true); 408 prefs->transient()->SetBoolean(prefs::kStartRenderersManually, true);
402 409
403 bool silent_launch = false; 410 bool silent_launch = false;
404 #if defined(OS_WIN) 411 #if defined(OS_WIN)
405 if (command_line->HasSwitch(switches::kAutomationClientChannelID)) { 412 if (command_line.HasSwitch(switches::kAutomationClientChannelID)) {
406 std::wstring automation_channel_id = 413 std::wstring automation_channel_id =
407 command_line->GetSwitchValue(switches::kAutomationClientChannelID); 414 command_line.GetSwitchValue(switches::kAutomationClientChannelID);
408 // If there are any loose parameters, we expect each one to generate a 415 // If there are any loose parameters, we expect each one to generate a
409 // new tab; if there are none then we have no tabs 416 // new tab; if there are none then we have no tabs
410 size_t expected_tabs = 417 size_t expected_tabs =
411 std::max(static_cast<int>(command_line->GetLooseValues().size()), 418 std::max(static_cast<int>(command_line.GetLooseValues().size()),
412 0); 419 0);
413 if (expected_tabs == 0) 420 if (expected_tabs == 0)
414 silent_launch = true; 421 silent_launch = true;
415 CreateAutomationProvider<AutomationProvider>(automation_channel_id, 422 CreateAutomationProvider<AutomationProvider>(automation_channel_id,
416 profile, expected_tabs); 423 profile, expected_tabs);
417 } 424 }
418 425
419 // Start up the extensions service http://crbug.com/7265 426 // Start up the extensions service http://crbug.com/7265
420 profile->InitExtensions(); 427 profile->InitExtensions();
421 // TODO(port): figure out why this call crashes. 428 // TODO(port): figure out why this call crashes.
422 #endif 429 #endif
423 430
424 if (command_line->HasSwitch(switches::kInstallExtension)) { 431 if (command_line.HasSwitch(switches::kInstallExtension)) {
425 std::wstring path_string = 432 std::wstring path_string =
426 command_line->GetSwitchValue(switches::kInstallExtension); 433 command_line.GetSwitchValue(switches::kInstallExtension);
427 FilePath path = FilePath::FromWStringHack(path_string); 434 FilePath path = FilePath::FromWStringHack(path_string);
428 profile->GetExtensionsService()->InstallExtension(path); 435 profile->GetExtensionsService()->InstallExtension(path);
429 silent_launch = true; 436 silent_launch = true;
430 } 437 }
431 438
432 // If we don't want to launch a new browser window or tab (in the case 439 // If we don't want to launch a new browser window or tab (in the case
433 // of an automation request), we are done here. 440 // of an automation request), we are done here.
434 if (!silent_launch) 441 if (!silent_launch) {
435 return LaunchBrowser(profile, cur_dir, process_startup, return_code); 442 return LaunchBrowser(command_line, profile, cur_dir, process_startup,
443 return_code);
444 }
436 return true; 445 return true;
437 } 446 }
438 447
439 bool BrowserInit::LaunchBrowser(Profile* profile, const std::wstring& cur_dir, 448 bool BrowserInit::LaunchBrowser(const CommandLine& command_line,
449 Profile* profile, const std::wstring& cur_dir,
440 bool process_startup, int* return_code) { 450 bool process_startup, int* return_code) {
441 in_startup = process_startup; 451 in_startup = process_startup;
442 bool result = LaunchBrowserImpl(profile, cur_dir, process_startup, 452 bool result = LaunchBrowserImpl(command_line, profile, cur_dir,
443 return_code); 453 process_startup, return_code);
444 in_startup = false; 454 in_startup = false;
445 return result; 455 return result;
446 } 456 }
447 457
448 #if defined(OS_WIN) 458 #if defined(OS_WIN)
449 template <class AutomationProviderClass> 459 template <class AutomationProviderClass>
450 void BrowserInit::CreateAutomationProvider(const std::wstring& channel_id, 460 void BrowserInit::CreateAutomationProvider(const std::wstring& channel_id,
451 Profile* profile, 461 Profile* profile,
452 size_t expected_tabs) { 462 size_t expected_tabs) {
453 scoped_refptr<AutomationProviderClass> automation = 463 scoped_refptr<AutomationProviderClass> automation =
454 new AutomationProviderClass(profile); 464 new AutomationProviderClass(profile);
455 automation->ConnectToChannel(channel_id); 465 automation->ConnectToChannel(channel_id);
456 automation->SetExpectedTabCount(expected_tabs); 466 automation->SetExpectedTabCount(expected_tabs);
457 467
458 AutomationProviderList* list = 468 AutomationProviderList* list =
459 g_browser_process->InitAutomationProviderList(); DCHECK(list); 469 g_browser_process->InitAutomationProviderList(); DCHECK(list);
460 list->AddProvider(automation); 470 list->AddProvider(automation);
461 } 471 }
462 #endif 472 #endif
463 473
464 bool BrowserInit::LaunchBrowserImpl(Profile* profile, 474 bool BrowserInit::LaunchBrowserImpl(const CommandLine& command_line,
475 Profile* profile,
465 const std::wstring& cur_dir, 476 const std::wstring& cur_dir,
466 bool process_startup, 477 bool process_startup,
467 int* return_code) { 478 int* return_code) {
468 DCHECK(profile); 479 DCHECK(profile);
469 480
470 const CommandLine* command_line = CommandLine::ForCurrentProcess();
471
472 // Continue with the off-the-record profile from here on if --incognito 481 // Continue with the off-the-record profile from here on if --incognito
473 if (command_line->HasSwitch(switches::kIncognito)) 482 if (command_line.HasSwitch(switches::kIncognito))
474 profile = profile->GetOffTheRecordProfile(); 483 profile = profile->GetOffTheRecordProfile();
475 484
476 // Are we starting an application? 485 LaunchWithProfile lwp(cur_dir, command_line);
477 std::wstring app_url = command_line->GetSwitchValue(switches::kApp);
478 if (!app_url.empty()) {
479 GURL url(WideToUTF8(app_url));
480 // If the application is started for a mailto:url, this machine has some
481 // old configuration that we should ignore. This hack saves us from some
482 // infinite loops where we keep forwarding mailto: to the system, resulting
483 // in the system asking us to open the mailto app.
484 if (url.SchemeIs("mailto"))
485 url = GURL("about:blank");
486
487 WebAppLauncher::Launch(profile, url);
488 return true;
489 }
490
491 LaunchWithProfile lwp(cur_dir);
492 bool launched = lwp.Launch(profile, process_startup); 486 bool launched = lwp.Launch(profile, process_startup);
493 if (!launched) { 487 if (!launched) {
494 LOG(ERROR) << "launch error"; 488 LOG(ERROR) << "launch error";
495 if (return_code != NULL) { 489 if (return_code != NULL)
496 *return_code = ResultCodes::INVALID_CMDLINE_URL; 490 *return_code = ResultCodes::INVALID_CMDLINE_URL;
497 }
498 return false; 491 return false;
499 } 492 }
500 493
501 return true; 494 return true;
502 } 495 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698