Index: chrome/browser/browser_init.cc |
=================================================================== |
--- chrome/browser/browser_init.cc (revision 9030) |
+++ chrome/browser/browser_init.cc (working copy) |
@@ -38,7 +38,6 @@ |
#include "chrome/browser/sessions/session_restore.h" |
#include "chrome/browser/tab_contents/infobar_delegate.h" |
#include "chrome/browser/tab_contents/navigation_controller.h" |
-#include "chrome/browser/web_app_launcher.h" |
#include "chrome/common/resource_bundle.h" |
#include "chromium_strings.h" |
@@ -103,26 +102,26 @@ |
DISALLOW_COPY_AND_ASSIGN(SessionCrashedInfoBarDelegate); |
}; |
-void SetOverrideHomePage(PrefService* prefs) { |
- const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
+void SetOverrideHomePage(const CommandLine& command_line, |
+ PrefService* prefs) { |
// If homepage is specified on the command line, canonify & store it. |
- if (command_line->HasSwitch(switches::kHomePage)) { |
+ if (command_line.HasSwitch(switches::kHomePage)) { |
std::wstring browser_directory; |
PathService::Get(base::DIR_CURRENT, &browser_directory); |
std::wstring new_homepage = URLFixerUpper::FixupRelativeFile( |
browser_directory, |
- command_line->GetSwitchValue(switches::kHomePage)); |
+ command_line.GetSwitchValue(switches::kHomePage)); |
prefs->transient()->SetString(prefs::kHomePage, new_homepage); |
prefs->transient()->SetBoolean(prefs::kHomePageIsNewTabPage, false); |
} |
} |
-SessionStartupPref GetSessionStartupPref(Profile* profile) { |
- const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
+SessionStartupPref GetSessionStartupPref(const CommandLine& command_line, |
+ Profile* profile) { |
SessionStartupPref pref = SessionStartupPref::GetStartupPref(profile); |
- if (command_line->HasSwitch(switches::kRestoreLastSession)) |
+ if (command_line.HasSwitch(switches::kRestoreLastSession)) |
pref.type = SessionStartupPref::LAST; |
- if (command_line->HasSwitch(switches::kIncognito) && |
+ if (command_line.HasSwitch(switches::kIncognito) && |
pref.type == SessionStartupPref::LAST) { |
// We don't store session information when incognito. If the user has |
// chosen to restore last session and launched incognito, fallback to |
@@ -143,8 +142,11 @@ |
// LaunchWithProfile ---------------------------------------------------------- |
-BrowserInit::LaunchWithProfile::LaunchWithProfile(const std::wstring& cur_dir) |
- : cur_dir_(cur_dir) { |
+BrowserInit::LaunchWithProfile::LaunchWithProfile( |
+ const std::wstring& cur_dir, |
+ const CommandLine& command_line) |
+ : cur_dir_(cur_dir), |
+ command_line_(command_line) { |
} |
bool BrowserInit::LaunchWithProfile::Launch(Profile* profile, |
@@ -152,19 +154,18 @@ |
DCHECK(profile); |
profile_ = profile; |
- const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
- if (command_line->HasSwitch(switches::kDnsLogDetails)) |
+ if (command_line_.HasSwitch(switches::kDnsLogDetails)) |
chrome_browser_net::EnableDnsDetailedLog(true); |
- if (command_line->HasSwitch(switches::kDnsPrefetchDisable)) |
+ if (command_line_.HasSwitch(switches::kDnsPrefetchDisable)) |
chrome_browser_net::EnableDnsPrefetch(false); |
- if (command_line->HasSwitch(switches::kDumpHistogramsOnExit)) |
+ if (command_line_.HasSwitch(switches::kDumpHistogramsOnExit)) |
StatisticsRecorder::set_dump_on_exit(true); |
- if (command_line->HasSwitch(switches::kRemoteShellPort)) { |
+ if (command_line_.HasSwitch(switches::kRemoteShellPort)) { |
if (!RenderProcessHost::run_renderer_in_process()) { |
std::wstring port_str = |
- command_line->GetSwitchValue(switches::kRemoteShellPort); |
+ command_line_.GetSwitchValue(switches::kRemoteShellPort); |
int64 port = StringToInt64(port_str); |
if (port > 0 && port < 65535) { |
g_browser_process->InitDebuggerWrapper(static_cast<int>(port)); |
@@ -174,90 +175,72 @@ |
} |
} |
- if (command_line->HasSwitch(switches::kEnableFileCookies)) |
+ if (command_line_.HasSwitch(switches::kEnableFileCookies)) |
net::CookieMonster::EnableFileScheme(); |
- if (command_line->HasSwitch(switches::kUserAgent)) { |
+ if (command_line_.HasSwitch(switches::kUserAgent)) { |
#if defined(OS_WIN) |
webkit_glue::SetUserAgent(WideToUTF8( |
- command_line->GetSwitchValue(switches::kUserAgent))); |
+ command_line_.GetSwitchValue(switches::kUserAgent))); |
// TODO(port): hook this up when we bring in webkit. |
#endif |
} |
-#ifndef NDEBUG |
- if (command_line->HasSwitch(switches::kApp)) |
- NOTREACHED(); |
-#endif // NDEBUG |
- |
- std::vector<GURL> urls_to_open = GetURLsFromCommandLine(profile_); |
- |
- Browser* browser = NULL; |
- |
- // Always attempt to restore the last session. OpenStartupURLs only opens the |
- // home pages if no additional URLs were passed on the command line. |
- bool opened_startup_urls = OpenStartupURLs(process_startup, urls_to_open); |
- |
- if (!opened_startup_urls) { |
- if (urls_to_open.empty()) { |
- urls_to_open.push_back(GURL()); // New tab page. |
- PrefService* prefs = g_browser_process->local_state(); |
- if (prefs->IsPrefRegistered(prefs::kShouldShowWelcomePage) && |
- prefs->GetBoolean(prefs::kShouldShowWelcomePage)) { |
- // Reset the preference so we don't show the welcome page next time. |
- prefs->ClearPref(prefs::kShouldShowWelcomePage); |
- |
-#if defined(OS_WIN) |
- // Add the welcome page. |
- std::wstring welcome_url = l10n_util::GetString(IDS_WELCOME_PAGE_URL); |
- urls_to_open.push_back(GURL(welcome_url)); |
-#else |
- // TODO(port): implement welcome page. |
- NOTIMPLEMENTED(); |
-#endif |
- } |
- } else { |
- browser = BrowserList::GetLastActive(); |
+ // Open the required browser windows and tabs. |
+ // First, see if we're being run as a web application (thin frame window). |
+ if (!OpenApplicationURL(profile)) { |
+ std::vector<GURL> urls_to_open = GetURLsFromCommandLine(profile_); |
+ // Always attempt to restore the last session. OpenStartupURLs only opens |
+ // the home pages if no additional URLs were passed on the command line. |
+ if (!OpenStartupURLs(process_startup, urls_to_open)) { |
+ // Add the home page and any special first run URLs. |
+ AddStartupURLs(&urls_to_open); |
+ OpenURLsInBrowser(BrowserList::GetLastActive(), process_startup, |
+ urls_to_open); |
} |
- |
- browser = OpenURLsInBrowser(browser, process_startup, urls_to_open); |
} |
- // It is possible to end here with a NULL 'browser'. For example if the user |
- // has tweaked the startup session restore preferences. |
+ // If we're recording or playing back, startup the EventRecorder now |
+ // unless otherwise specified. |
+ if (!command_line_.HasSwitch(switches::kNoEvents)) { |
+ std::wstring script_path; |
+ PathService::Get(chrome::FILE_RECORDED_SCRIPT, &script_path); |
- if (browser) { |
- // If we're recording or playing back, startup the EventRecorder now |
- // unless otherwise specified. |
- if (!command_line->HasSwitch(switches::kNoEvents)) { |
- std::wstring script_path; |
- PathService::Get(chrome::FILE_RECORDED_SCRIPT, &script_path); |
+ bool record_mode = command_line_.HasSwitch(switches::kRecordMode); |
+ bool playback_mode = command_line_.HasSwitch(switches::kPlaybackMode); |
- bool record_mode = command_line->HasSwitch(switches::kRecordMode); |
- bool playback_mode = command_line->HasSwitch(switches::kPlaybackMode); |
- |
- if (record_mode && chrome::kRecordModeEnabled) |
- base::EventRecorder::current()->StartRecording(script_path); |
- if (playback_mode) |
- base::EventRecorder::current()->StartPlayback(script_path); |
- } |
+ if (record_mode && chrome::kRecordModeEnabled) |
+ base::EventRecorder::current()->StartRecording(script_path); |
+ if (playback_mode) |
+ base::EventRecorder::current()->StartPlayback(script_path); |
} |
return true; |
} |
+bool BrowserInit::LaunchWithProfile::OpenApplicationURL(Profile* profile) { |
+ if (!command_line_.HasSwitch(switches::kApp)) |
+ return false; |
+ |
+ GURL url(WideToUTF8(command_line_.GetSwitchValue(switches::kApp))); |
+ if (!url.is_empty() && url.is_valid()) { |
+ Browser::OpenApplicationWindow(profile, url); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
bool BrowserInit::LaunchWithProfile::OpenStartupURLs( |
bool is_process_startup, |
const std::vector<GURL>& urls_to_open) { |
- const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
- SessionStartupPref pref = GetSessionStartupPref(profile_); |
+ SessionStartupPref pref = GetSessionStartupPref(command_line_, profile_); |
switch (pref.type) { |
case SessionStartupPref::LAST: |
if (!is_process_startup) |
return false; |
if (!profile_->DidLastSessionExitCleanly() && |
- !command_line->HasSwitch(switches::kRestoreLastSession)) { |
+ !command_line_.HasSwitch(switches::kRestoreLastSession)) { |
// The last session crashed. It's possible automatically loading the |
// page will trigger another crash, locking the user out of chrome. |
// To avoid this, don't restore on startup but instead show the crashed |
@@ -317,8 +300,7 @@ |
std::vector<GURL> BrowserInit::LaunchWithProfile::GetURLsFromCommandLine( |
Profile* profile) { |
std::vector<GURL> urls; |
- const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
- std::vector<std::wstring> params = command_line->GetLooseValues(); |
+ std::vector<std::wstring> params = command_line_.GetLooseValues(); |
for (size_t i = 0; i < params.size(); ++i) { |
std::wstring& value = params[i]; |
// Handle Vista way of searching - "? <search-term>" |
@@ -346,14 +328,39 @@ |
return urls; |
} |
+void BrowserInit::LaunchWithProfile::AddStartupURLs( |
+ std::vector<GURL>* startup_urls) const { |
+ // Otherwise open at least the new tab page (and the welcome page, if this |
+ // is the first time the browser is being started), or the set of URLs |
+ // specified on the command line. |
+ if (startup_urls->empty()) { |
+ startup_urls->push_back(GURL()); // New tab page. |
+ PrefService* prefs = g_browser_process->local_state(); |
+ if (prefs->IsPrefRegistered(prefs::kShouldShowWelcomePage) && |
+ prefs->GetBoolean(prefs::kShouldShowWelcomePage)) { |
+ // Reset the preference so we don't show the welcome page next time. |
+ prefs->ClearPref(prefs::kShouldShowWelcomePage); |
+ |
+#if defined(OS_WIN) |
+ // Add the welcome page. |
+ std::wstring welcome_url = l10n_util::GetString(IDS_WELCOME_PAGE_URL); |
+ startup_urls->push_back(GURL(welcome_url)); |
+#else |
+ // TODO(port): implement welcome page. |
+ NOTIMPLEMENTED(); |
+#endif |
+ } |
+ } |
+} |
+ |
bool BrowserInit::ProcessCommandLine( |
- const std::wstring& cur_dir, PrefService* prefs, bool process_startup, |
- Profile* profile, int* return_code) { |
+ const CommandLine& command_line, const std::wstring& cur_dir, |
+ PrefService* prefs, bool process_startup, Profile* profile, |
+ int* return_code) { |
DCHECK(profile); |
- const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
if (process_startup) { |
const std::wstring popup_count_string = |
- command_line->GetSwitchValue(switches::kOmniBoxPopupCount); |
+ command_line.GetSwitchValue(switches::kOmniBoxPopupCount); |
if (!popup_count_string.empty()) { |
int count = 0; |
if (StringToInt(popup_count_string, &count)) { |
@@ -363,11 +370,11 @@ |
} |
} |
- if (command_line->HasSwitch(switches::kDisablePromptOnRepost)) |
+ if (command_line.HasSwitch(switches::kDisablePromptOnRepost)) |
NavigationController::DisablePromptOnRepost(); |
const std::wstring tab_count_string = |
- command_line->GetSwitchValue(switches::kTabCountToLoadOnSessionRestore); |
+ command_line.GetSwitchValue(switches::kTabCountToLoadOnSessionRestore); |
if (!tab_count_string.empty()) { |
int count = 0; |
if (StringToInt(tab_count_string, &count)) { |
@@ -378,9 +385,9 @@ |
#if defined(OS_WIN) |
// Look for the testing channel ID ONLY during process startup |
- if (command_line->HasSwitch(switches::kTestingChannelID)) { |
+ if (command_line.HasSwitch(switches::kTestingChannelID)) { |
std::wstring testing_channel_id = |
- command_line->GetSwitchValue(switches::kTestingChannelID); |
+ command_line.GetSwitchValue(switches::kTestingChannelID); |
// TODO(sanjeevr) Check if we need to make this a singleton for |
// compatibility with the old testing code |
// If there are any loose parameters, we expect each one to generate a |
@@ -388,27 +395,27 @@ |
CreateAutomationProvider<TestingAutomationProvider>( |
testing_channel_id, |
profile, |
- std::max(static_cast<int>(command_line->GetLooseValues().size()), |
+ std::max(static_cast<int>(command_line.GetLooseValues().size()), |
1)); |
} |
#endif |
} |
// Allow the command line to override the persisted setting of home page. |
- SetOverrideHomePage(profile->GetPrefs()); |
+ SetOverrideHomePage(command_line, profile->GetPrefs()); |
- if (command_line->HasSwitch(switches::kBrowserStartRenderersManually)) |
+ if (command_line.HasSwitch(switches::kBrowserStartRenderersManually)) |
prefs->transient()->SetBoolean(prefs::kStartRenderersManually, true); |
bool silent_launch = false; |
#if defined(OS_WIN) |
- if (command_line->HasSwitch(switches::kAutomationClientChannelID)) { |
+ if (command_line.HasSwitch(switches::kAutomationClientChannelID)) { |
std::wstring automation_channel_id = |
- command_line->GetSwitchValue(switches::kAutomationClientChannelID); |
+ command_line.GetSwitchValue(switches::kAutomationClientChannelID); |
// If there are any loose parameters, we expect each one to generate a |
// new tab; if there are none then we have no tabs |
size_t expected_tabs = |
- std::max(static_cast<int>(command_line->GetLooseValues().size()), |
+ std::max(static_cast<int>(command_line.GetLooseValues().size()), |
0); |
if (expected_tabs == 0) |
silent_launch = true; |
@@ -421,9 +428,9 @@ |
// TODO(port): figure out why this call crashes. |
#endif |
- if (command_line->HasSwitch(switches::kInstallExtension)) { |
+ if (command_line.HasSwitch(switches::kInstallExtension)) { |
std::wstring path_string = |
- command_line->GetSwitchValue(switches::kInstallExtension); |
+ command_line.GetSwitchValue(switches::kInstallExtension); |
FilePath path = FilePath::FromWStringHack(path_string); |
profile->GetExtensionsService()->InstallExtension(path); |
silent_launch = true; |
@@ -431,16 +438,19 @@ |
// If we don't want to launch a new browser window or tab (in the case |
// of an automation request), we are done here. |
- if (!silent_launch) |
- return LaunchBrowser(profile, cur_dir, process_startup, return_code); |
+ if (!silent_launch) { |
+ return LaunchBrowser(command_line, profile, cur_dir, process_startup, |
+ return_code); |
+ } |
return true; |
} |
-bool BrowserInit::LaunchBrowser(Profile* profile, const std::wstring& cur_dir, |
+bool BrowserInit::LaunchBrowser(const CommandLine& command_line, |
+ Profile* profile, const std::wstring& cur_dir, |
bool process_startup, int* return_code) { |
in_startup = process_startup; |
- bool result = LaunchBrowserImpl(profile, cur_dir, process_startup, |
- return_code); |
+ bool result = LaunchBrowserImpl(command_line, profile, cur_dir, |
+ process_startup, return_code); |
in_startup = false; |
return result; |
} |
@@ -461,40 +471,23 @@ |
} |
#endif |
-bool BrowserInit::LaunchBrowserImpl(Profile* profile, |
+bool BrowserInit::LaunchBrowserImpl(const CommandLine& command_line, |
+ Profile* profile, |
const std::wstring& cur_dir, |
bool process_startup, |
int* return_code) { |
DCHECK(profile); |
- const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
- |
// Continue with the off-the-record profile from here on if --incognito |
- if (command_line->HasSwitch(switches::kIncognito)) |
+ if (command_line.HasSwitch(switches::kIncognito)) |
profile = profile->GetOffTheRecordProfile(); |
- // Are we starting an application? |
- std::wstring app_url = command_line->GetSwitchValue(switches::kApp); |
- if (!app_url.empty()) { |
- GURL url(WideToUTF8(app_url)); |
- // If the application is started for a mailto:url, this machine has some |
- // old configuration that we should ignore. This hack saves us from some |
- // infinite loops where we keep forwarding mailto: to the system, resulting |
- // in the system asking us to open the mailto app. |
- if (url.SchemeIs("mailto")) |
- url = GURL("about:blank"); |
- |
- WebAppLauncher::Launch(profile, url); |
- return true; |
- } |
- |
- LaunchWithProfile lwp(cur_dir); |
+ LaunchWithProfile lwp(cur_dir, command_line); |
bool launched = lwp.Launch(profile, process_startup); |
if (!launched) { |
LOG(ERROR) << "launch error"; |
- if (return_code != NULL) { |
+ if (return_code != NULL) |
*return_code = ResultCodes::INVALID_CMDLINE_URL; |
- } |
return false; |
} |