Index: chrome/browser/chrome_browser_main.cc |
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc |
index 3d810c08b16586bd187899c3c1e86b8787bb361c..9bea6e50957c0aa546db178079eb6998722b5dae 100644 |
--- a/chrome/browser/chrome_browser_main.cc |
+++ b/chrome/browser/chrome_browser_main.cc |
@@ -76,6 +76,7 @@ |
#include "chrome/browser/shell_integration.h" |
#include "chrome/browser/translate/translate_manager.h" |
#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/browser_init.h" |
#include "chrome/browser/ui/webui/chrome_url_data_manager_backend.h" |
#include "chrome/browser/web_resource/gpu_blacklist_updater.h" |
#include "chrome/common/child_process_logging.h" |
@@ -126,25 +127,9 @@ |
#endif |
#if defined(OS_CHROMEOS) |
-#include "chrome/browser/chromeos/audio_handler.h" |
-#include "chrome/browser/chromeos/boot_times_loader.h" |
#include "chrome/browser/chromeos/cros/cros_library.h" |
#include "chrome/browser/chromeos/cros_settings.h" |
#include "chrome/browser/chromeos/cros_settings_names.h" |
-#include "chrome/browser/chromeos/customization_document.h" |
-#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" |
-#include "chrome/browser/chromeos/external_metrics.h" |
-#include "chrome/browser/chromeos/login/authenticator.h" |
-#include "chrome/browser/chromeos/login/login_utils.h" |
-#include "chrome/browser/chromeos/login/ownership_service.h" |
-#include "chrome/browser/chromeos/login/screen_locker.h" |
-#include "chrome/browser/chromeos/login/user_manager.h" |
-#include "chrome/browser/chromeos/status/status_area_view_chromeos.h" |
-#include "chrome/browser/chromeos/system/runtime_environment.h" |
-#include "chrome/browser/chromeos/system_key_event_listener.h" |
-#include "chrome/browser/chromeos/xinput_hierarchy_changed_event_listener.h" |
-#include "chrome/browser/oom_priority_manager.h" |
-#include "chrome/browser/ui/views/browser_dialogs.h" |
#endif |
// TODO(port): several win-only methods have been pulled out of this, but |
@@ -445,107 +430,6 @@ Profile* CreateProfile(const content::MainFunctionParams& parameters, |
return NULL; |
} |
-#if defined(OS_CHROMEOS) |
- |
-// Class is used to login using passed username and password. |
-// The instance will be deleted upon success or failure. |
-class StubLogin : public chromeos::LoginStatusConsumer, |
- public chromeos::LoginUtils::Delegate { |
- public: |
- StubLogin(std::string username, std::string password) |
- : pending_requests_(false), |
- profile_prepared_(false) { |
- authenticator_ = chromeos::LoginUtils::Get()->CreateAuthenticator(this); |
- authenticator_.get()->AuthenticateToLogin( |
- g_browser_process->profile_manager()->GetDefaultProfile(), |
- username, |
- password, |
- std::string(), |
- std::string()); |
- } |
- |
- ~StubLogin() { |
- chromeos::LoginUtils::Get()->DelegateDeleted(this); |
- } |
- |
- void OnLoginFailure(const chromeos::LoginFailure& error) { |
- LOG(ERROR) << "Login Failure: " << error.GetErrorString(); |
- delete this; |
- } |
- |
- void OnLoginSuccess(const std::string& username, |
- const std::string& password, |
- const GaiaAuthConsumer::ClientLoginResult& credentials, |
- bool pending_requests, |
- bool using_oauth) { |
- pending_requests_ = pending_requests; |
- if (!profile_prepared_) { |
- // Will call OnProfilePrepared in the end. |
- chromeos::LoginUtils::Get()->PrepareProfile(username, |
- password, |
- credentials, |
- pending_requests, |
- using_oauth, |
- false, |
- this); |
- } else if (!pending_requests) { |
- delete this; |
- } |
- } |
- |
- // LoginUtils::Delegate implementation: |
- virtual void OnProfilePrepared(Profile* profile) { |
- profile_prepared_ = true; |
- chromeos::LoginUtils::DoBrowserLaunch(profile, NULL); |
- if (!pending_requests_) |
- delete this; |
- } |
- |
- scoped_refptr<chromeos::Authenticator> authenticator_; |
- bool pending_requests_; |
- bool profile_prepared_; |
-}; |
- |
-void OptionallyRunChromeOSLoginManager(const CommandLine& parsed_command_line, |
- Profile* profile) { |
- if (parsed_command_line.HasSwitch(switches::kLoginManager)) { |
- std::string first_screen = |
- parsed_command_line.GetSwitchValueASCII(switches::kLoginScreen); |
- std::string size_arg = |
- parsed_command_line.GetSwitchValueASCII( |
- switches::kLoginScreenSize); |
- gfx::Size size(0, 0); |
- // Allow the size of the login window to be set explicitly. If not set, |
- // default to the entire screen. This is mostly useful for testing. |
- if (size_arg.size()) { |
- std::vector<std::string> dimensions; |
- base::SplitString(size_arg, ',', &dimensions); |
- if (dimensions.size() == 2) { |
- int width, height; |
- if (base::StringToInt(dimensions[0], &width) && |
- base::StringToInt(dimensions[1], &height)) |
- size.SetSize(width, height); |
- } |
- } |
- browser::ShowLoginWizard(first_screen, size); |
- } else if (parsed_command_line.HasSwitch(switches::kLoginUser) && |
- parsed_command_line.HasSwitch(switches::kLoginPassword)) { |
- chromeos::BootTimesLoader::Get()->RecordLoginAttempted(); |
- new StubLogin( |
- parsed_command_line.GetSwitchValueASCII(switches::kLoginUser), |
- parsed_command_line.GetSwitchValueASCII(switches::kLoginPassword)); |
- } else { |
- if (!parsed_command_line.HasSwitch(switches::kTestName)) { |
- // We did not log in (we crashed or are debugging), so we need to |
- // set the user name for sync. |
- chromeos::LoginUtils::Get()->RestoreAuthenticationSession( |
- chromeos::UserManager::Get()->logged_in_user().email(), profile); |
- } |
- } |
-} |
- |
-#endif // defined(OS_CHROMEOS) |
- |
#if defined(OS_MACOSX) |
OSStatus KeychainCallback(SecKeychainEvent keychain_event, |
SecKeychainCallbackInfo *info, void *context) { |
@@ -1136,12 +1020,6 @@ void ChromeBrowserMainParts::SetupFieldTrials(bool metrics_recording_enabled, |
// ----------------------------------------------------------------------------- |
// TODO(viettrungluu): move more/rest of BrowserMain() into BrowserMainParts. |
-#if defined(OS_CHROMEOS) |
-// Allows authenticator to be invoked without adding refcounting. The instances |
-// will delete themselves upon completion. |
-DISABLE_RUNNABLE_METHOD_REFCOUNT(StubLogin); |
-#endif |
- |
#if defined(OS_WIN) |
#define DLLEXPORT __declspec(dllexport) |
@@ -1423,6 +1301,37 @@ void ChromeBrowserMainParts::PreMainMessageLoopRun() { |
chrome_extra_parts_[i]->PreMainMessageLoopRun(); |
} |
+// PreMainMessageLoopRun calls these extra stages in the following order: |
+// PreMainMessageLoopRunImpl() |
+// ... initial setup, including browser_process_ setup. |
+// PreProfileInit() |
+// ... additional setup, including CreateProfile() |
+// PostProfileInit() |
+// ... additional setup |
+// PreBrowserStart() |
+// ... browser_init_->Start (OR parameters().ui_task->Run()) |
+// PostBrowserStart() |
+ |
+void ChromeBrowserMainParts::PreProfileInit() { |
+ for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) |
+ chrome_extra_parts_[i]->PreProfileInit(); |
+} |
+ |
+void ChromeBrowserMainParts::PostProfileInit() { |
+ for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) |
+ chrome_extra_parts_[i]->PostProfileInit(); |
+} |
+ |
+void ChromeBrowserMainParts::PreBrowserStart() { |
+ for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) |
+ chrome_extra_parts_[i]->PreBrowserStart(); |
+} |
+ |
+void ChromeBrowserMainParts::PostBrowserStart() { |
+ for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) |
+ chrome_extra_parts_[i]->PostBrowserStart(); |
+} |
+ |
int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
// Create watchdog thread after creating all other threads because it will |
// watch the other threads and they must be running. |
@@ -1434,24 +1343,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
browser_process_->resource_dispatcher_host(); |
#endif |
-#if defined(OS_CHROMEOS) |
- // Now that the file thread exists we can record our stats. |
- chromeos::BootTimesLoader::Get()->RecordChromeMainStats(); |
- |
-#if defined(TOOLKIT_USES_GTK) |
- // Read locale-specific GTK resource information. |
- std::string gtkrc = l10n_util::GetStringUTF8(IDS_LOCALE_GTKRC); |
- if (!gtkrc.empty()) |
- gtk_rc_parse_string(gtkrc.c_str()); |
-#else |
- // TODO(saintlou): Need to provide an Aura equivalent. |
- NOTIMPLEMENTED(); |
-#endif |
- |
- // Trigger prefetching of ownership status. |
- chromeos::OwnershipService::GetSharedInstance()->Prewarm(); |
-#endif |
- |
// Record last shutdown time into a histogram. |
browser_shutdown::ReadLastShutdownInfo(); |
@@ -1537,47 +1428,10 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
#endif |
// Desktop construction occurs here, (required before profile creation). |
- for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) |
- chrome_extra_parts_[i]->PostBrowserProcessInit(); |
+ PreProfileInit(); |
// Profile creation ---------------------------------------------------------- |
-#if defined(OS_CHROMEOS) |
- // This forces the ProfileManager to be created and register for the |
- // notification it needs to track the logged in user. |
- g_browser_process->profile_manager(); |
- |
- // TODO(abarth): Should this move to InitializeNetworkOptions()? |
- // Allow access to file:// on ChromeOS for tests. |
- if (parsed_command_line().HasSwitch(switches::kAllowFileAccess)) |
- net::URLRequest::AllowFileAccess(); |
- |
- // There are two use cases for kLoginUser: |
- // 1) if passed in tandem with kLoginPassword, to drive a "StubLogin" |
- // 2) if passed alone, to signal that the indicated user has already |
- // logged in and we should behave accordingly. |
- // This handles case 2. |
- if (parsed_command_line().HasSwitch(switches::kLoginUser) && |
- !parsed_command_line().HasSwitch(switches::kLoginPassword)) { |
- std::string username = |
- parsed_command_line().GetSwitchValueASCII(switches::kLoginUser); |
- VLOG(1) << "Relaunching browser for user: " << username; |
- chromeos::UserManager::Get()->UserLoggedIn(username); |
- |
- // Redirects Chrome logging to the user data dir. |
- logging::RedirectChromeLogging(parsed_command_line()); |
- |
- // Initialize user policy before creating the profile so the profile |
- // initialization code sees policy settings. |
- g_browser_process->browser_policy_connector()->InitializeUserPolicy( |
- username, false /* wait_for_policy_fetch */); |
- } else if (parsed_command_line().HasSwitch(switches::kLoginManager)) { |
- // Initialize status area mode early on. |
- chromeos::StatusAreaViewChromeos:: |
- SetScreenMode(chromeos::StatusAreaViewChromeos::LOGIN_MODE_WEBUI); |
- } |
-#endif |
- |
if (is_first_run_) { |
// Warn the ProfileManager that an import process will run, possibly |
// locking the WebDataService directory of the next Profile created. |
@@ -1596,22 +1450,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
} |
// Post-profile init --------------------------------------------------------- |
-#if defined(OS_CHROMEOS) |
- // Pass the TokenService pointer to the policy connector so user policy can |
- // grab a token and register with the policy server. |
- // TODO(mnissler): Remove once OAuth is the only authentication mechanism. |
- if (parsed_command_line().HasSwitch(switches::kLoginUser) && |
- !parsed_command_line().HasSwitch(switches::kLoginPassword)) { |
- g_browser_process->browser_policy_connector()->SetUserPolicyTokenService( |
- profile_->GetTokenService()); |
- } |
- |
- // Tests should be able to tune login manager before showing it. |
- // Thus only show login manager in normal (non-testing) mode. |
- if (!parameters().ui_task) |
- OptionallyRunChromeOSLoginManager(parsed_command_line(), profile_); |
-#endif |
- |
#if !defined(OS_MACOSX) |
// Importing other browser settings is done in a browser-like process |
// that exits when this task has finished. |
@@ -1658,10 +1496,9 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
} |
#endif |
- // TODO(stevenjb): Move ChromeOS login code into PostProfileInitialized(). |
- // (Requires making ChromeBrowserMainPartsChromeos a non "main" Parts). |
- for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) |
- chrome_extra_parts_[i]->PostProfileInitialized(); |
+ // TODO(stevenjb): Move WIN and MACOSX specific code to apprpriate Parts. |
+ // (requires supporting early exit). |
+ PostProfileInit(); |
// Show the First Run UI if this is the first time Chrome has been run on |
// this computer, or we're being compelled to do so by a command line flag. |
@@ -1813,24 +1650,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
fragmentation_checker::RecordFragmentationMetricForCurrentModule(); |
#endif |
-#if defined(OS_CHROMEOS) |
- metrics_->StartExternalMetrics(); |
- |
- // Initialize the audio handler on ChromeOS. |
- chromeos::AudioHandler::Initialize(); |
- |
- // Listen for system key events so that the user will be able to adjust the |
- // volume on the login screen, if Chrome is running on Chrome OS |
- // (i.e. not Linux desktop), and in non-test mode. |
- if (chromeos::system::runtime_environment::IsRunningOnChromeOS() && |
- !parameters().ui_task) { // ui_task is non-NULL when running tests. |
- chromeos::SystemKeyEventListener::Initialize(); |
- } |
- |
- // Listen for XI_HierarchyChanged events. |
- chromeos::XInputHierarchyChangedEventListener::GetInstance(); |
-#endif |
- |
// The extension service may be available at this point. If the command line |
// specifies --uninstall-extension, attempt the uninstall extension startup |
// action. |
@@ -1855,13 +1674,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
record_search_engine_ = is_first_run_ && !profile_->IsOffTheRecord(); |
#endif |
-#if defined(OS_CHROMEOS) |
- // Wait until here to start the out-of-memory priority manager so that |
- // we give the most amount of time for the other services to start up |
- // before we start adjusting the oom priority. |
- g_browser_process->oom_priority_manager()->Start(); |
-#endif |
- |
// Create the instance of the cloud print proxy service so that it can launch |
// the service process if needed. This is needed because the service process |
// might have shutdown because an update was available. |
@@ -1879,6 +1691,8 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
NaClProcessHost::EarlyStartup(); |
#endif |
+ PreBrowserStart(); |
+ |
// Instantiate the notification UI manager, as this triggers a perf timer |
// used to measure startup time. TODO(stevenjb): Figure out what is actually |
// triggering the timer and call that explicitly in the approprate place. |
@@ -1955,6 +1769,9 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
} |
} |
browser_init_.reset(); |
+ |
+ PostBrowserStart(); |
+ |
return result_code_; |
} |
@@ -1980,10 +1797,6 @@ bool ChromeBrowserMainParts::MainMessageLoopRun(int* result_code) { |
#elif defined(OS_POSIX) |
MessageLoopForUI::current()->Run(); |
#endif |
-#if defined(OS_CHROMEOS) |
- chromeos::BootTimesLoader::Get()->AddLogoutTimeMarker("UIMessageLoopEnded", |
- true); |
-#endif |
return true; |
} |
@@ -2041,10 +1854,6 @@ void ChromeBrowserMainParts::PostMainMessageLoopRun() { |
} |
#endif |
-#if defined(OS_CHROMEOS) |
- g_browser_process->oom_priority_manager()->Stop(); |
-#endif |
- |
// Some tests don't set parameters.ui_task, so they started translate |
// language fetch that was never completed so we need to cleanup here |
// otherwise it will be done by the destructor in a wrong thread. |
@@ -2059,17 +1868,6 @@ void ChromeBrowserMainParts::PostMainMessageLoopRun() { |
g_browser_process->metrics_service()->Stop(); |
-#if defined(OS_CHROMEOS) |
- // The XInput2 event listener needs to be shut down earlier than when |
- // Singletons are finally destroyed in AtExitManager. |
- chromeos::XInputHierarchyChangedEventListener::GetInstance()->Stop(); |
- |
- // chromeos::SystemKeyEventListener::Shutdown() is always safe to call, |
- // even if Initialize() wasn't called. |
- chromeos::SystemKeyEventListener::Shutdown(); |
- chromeos::AudioHandler::Shutdown(); |
-#endif |
- |
restart_last_session_ = browser_shutdown::ShutdownPreThreadsStop(); |
browser_process_->StartTearDown(); |
} |