Commit 922cff9c authored by stevenjb@chromium.org's avatar stevenjb@chromium.org

Move chromeos specific code to ChromeBrowserMainPartsChromeos

Change-Id: I77a05a62fa652a1f79a536761c037cffc2d318bb

BUG=chromium-os:103821
TEST=Make sure all chromeos tests and autotests run

Review URL: http://codereview.chromium.org/8670001

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@112405 0039d316-1c4b-4281-b951-d872f2087c98
parent 83db0cb4
...@@ -76,6 +76,7 @@ ...@@ -76,6 +76,7 @@
#include "chrome/browser/shell_integration.h" #include "chrome/browser/shell_integration.h"
#include "chrome/browser/translate/translate_manager.h" #include "chrome/browser/translate/translate_manager.h"
#include "chrome/browser/ui/browser.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/ui/webui/chrome_url_data_manager_backend.h"
#include "chrome/browser/ui/webui/sync_promo_trial.h" #include "chrome/browser/ui/webui/sync_promo_trial.h"
#include "chrome/browser/web_resource/gpu_blacklist_updater.h" #include "chrome/browser/web_resource/gpu_blacklist_updater.h"
...@@ -127,25 +128,9 @@ ...@@ -127,25 +128,9 @@
#endif #endif
#if defined(OS_CHROMEOS) #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/cros_library.h"
#include "chrome/browser/chromeos/cros_settings.h" #include "chrome/browser/chromeos/cros_settings.h"
#include "chrome/browser/chromeos/cros_settings_names.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 #endif
// TODO(port): several win-only methods have been pulled out of this, but // TODO(port): several win-only methods have been pulled out of this, but
...@@ -446,107 +431,6 @@ Profile* CreateProfile(const content::MainFunctionParams& parameters, ...@@ -446,107 +431,6 @@ Profile* CreateProfile(const content::MainFunctionParams& parameters,
return NULL; 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) #if defined(OS_MACOSX)
OSStatus KeychainCallback(SecKeychainEvent keychain_event, OSStatus KeychainCallback(SecKeychainEvent keychain_event,
SecKeychainCallbackInfo *info, void *context) { SecKeychainCallbackInfo *info, void *context) {
...@@ -1138,12 +1022,6 @@ void ChromeBrowserMainParts::SetupFieldTrials(bool metrics_recording_enabled, ...@@ -1138,12 +1022,6 @@ void ChromeBrowserMainParts::SetupFieldTrials(bool metrics_recording_enabled,
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// TODO(viettrungluu): move more/rest of BrowserMain() into BrowserMainParts. // 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) #if defined(OS_WIN)
#define DLLEXPORT __declspec(dllexport) #define DLLEXPORT __declspec(dllexport)
...@@ -1425,6 +1303,37 @@ void ChromeBrowserMainParts::PreMainMessageLoopRun() { ...@@ -1425,6 +1303,37 @@ void ChromeBrowserMainParts::PreMainMessageLoopRun() {
chrome_extra_parts_[i]->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() { int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
// Create watchdog thread after creating all other threads because it will // Create watchdog thread after creating all other threads because it will
// watch the other threads and they must be running. // watch the other threads and they must be running.
...@@ -1436,24 +1345,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { ...@@ -1436,24 +1345,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
browser_process_->resource_dispatcher_host(); browser_process_->resource_dispatcher_host();
#endif #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. // Record last shutdown time into a histogram.
browser_shutdown::ReadLastShutdownInfo(); browser_shutdown::ReadLastShutdownInfo();
...@@ -1539,47 +1430,10 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { ...@@ -1539,47 +1430,10 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
#endif #endif
// Desktop construction occurs here, (required before profile creation). // Desktop construction occurs here, (required before profile creation).
for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) PreProfileInit();
chrome_extra_parts_[i]->PostBrowserProcessInit();
// Profile creation ---------------------------------------------------------- // 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_) { if (is_first_run_) {
// Warn the ProfileManager that an import process will run, possibly // Warn the ProfileManager that an import process will run, possibly
// locking the WebDataService directory of the next Profile created. // locking the WebDataService directory of the next Profile created.
...@@ -1598,22 +1452,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { ...@@ -1598,22 +1452,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
} }
// Post-profile init --------------------------------------------------------- // 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) #if !defined(OS_MACOSX)
// Importing other browser settings is done in a browser-like process // Importing other browser settings is done in a browser-like process
// that exits when this task has finished. // that exits when this task has finished.
...@@ -1660,10 +1498,9 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { ...@@ -1660,10 +1498,9 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
} }
#endif #endif
// TODO(stevenjb): Move ChromeOS login code into PostProfileInitialized(). // TODO(stevenjb): Move WIN and MACOSX specific code to apprpriate Parts.
// (Requires making ChromeBrowserMainPartsChromeos a non "main" Parts). // (requires supporting early exit).
for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) PostProfileInit();
chrome_extra_parts_[i]->PostProfileInitialized();
// Show the First Run UI if this is the first time Chrome has been run on // 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. // this computer, or we're being compelled to do so by a command line flag.
...@@ -1815,24 +1652,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { ...@@ -1815,24 +1652,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
fragmentation_checker::RecordFragmentationMetricForCurrentModule(); fragmentation_checker::RecordFragmentationMetricForCurrentModule();
#endif #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 // The extension service may be available at this point. If the command line
// specifies --uninstall-extension, attempt the uninstall extension startup // specifies --uninstall-extension, attempt the uninstall extension startup
// action. // action.
...@@ -1857,13 +1676,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { ...@@ -1857,13 +1676,6 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
record_search_engine_ = is_first_run_ && !profile_->IsOffTheRecord(); record_search_engine_ = is_first_run_ && !profile_->IsOffTheRecord();
#endif #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 // 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 // the service process if needed. This is needed because the service process
// might have shutdown because an update was available. // might have shutdown because an update was available.
...@@ -1881,6 +1693,8 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { ...@@ -1881,6 +1693,8 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
NaClProcessHost::EarlyStartup(); NaClProcessHost::EarlyStartup();
#endif #endif
PreBrowserStart();
// Instantiate the notification UI manager, as this triggers a perf timer // Instantiate the notification UI manager, as this triggers a perf timer
// used to measure startup time. TODO(stevenjb): Figure out what is actually // used to measure startup time. TODO(stevenjb): Figure out what is actually
// triggering the timer and call that explicitly in the approprate place. // triggering the timer and call that explicitly in the approprate place.
...@@ -1957,6 +1771,9 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { ...@@ -1957,6 +1771,9 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
} }
} }
browser_init_.reset(); browser_init_.reset();
PostBrowserStart();
return result_code_; return result_code_;
} }
...@@ -1982,10 +1799,6 @@ bool ChromeBrowserMainParts::MainMessageLoopRun(int* result_code) { ...@@ -1982,10 +1799,6 @@ bool ChromeBrowserMainParts::MainMessageLoopRun(int* result_code) {
#elif defined(OS_POSIX) #elif defined(OS_POSIX)
MessageLoopForUI::current()->Run(); MessageLoopForUI::current()->Run();
#endif #endif
#if defined(OS_CHROMEOS)
chromeos::BootTimesLoader::Get()->AddLogoutTimeMarker("UIMessageLoopEnded",
true);
#endif
return true; return true;
} }
...@@ -2043,10 +1856,6 @@ void ChromeBrowserMainParts::PostMainMessageLoopRun() { ...@@ -2043,10 +1856,6 @@ void ChromeBrowserMainParts::PostMainMessageLoopRun() {
} }
#endif #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 // Some tests don't set parameters.ui_task, so they started translate
// language fetch that was never completed so we need to cleanup here // language fetch that was never completed so we need to cleanup here
// otherwise it will be done by the destructor in a wrong thread. // otherwise it will be done by the destructor in a wrong thread.
...@@ -2061,17 +1870,6 @@ void ChromeBrowserMainParts::PostMainMessageLoopRun() { ...@@ -2061,17 +1870,6 @@ void ChromeBrowserMainParts::PostMainMessageLoopRun() {
g_browser_process->metrics_service()->Stop(); 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(); restart_last_session_ = browser_shutdown::ShutdownPreThreadsStop();
browser_process_->StartTearDown(); browser_process_->StartTearDown();
} }
......
...@@ -56,6 +56,9 @@ class ChromeBrowserMainParts : public content::BrowserMainParts { ...@@ -56,6 +56,9 @@ class ChromeBrowserMainParts : public content::BrowserMainParts {
const content::MainFunctionParams& parameters); const content::MainFunctionParams& parameters);
// content::BrowserMainParts overrides. // content::BrowserMainParts overrides.
// These are called in-order by content::BrowserMainLoop.
// Each stage calls the same stages in any ChromeBrowserMainExtraParts added
// with AddParts() from ChromeContentBrowserClient::CreateBrowserMainParts.
virtual void PreEarlyInitialization() OVERRIDE; virtual void PreEarlyInitialization() OVERRIDE;
virtual void PostEarlyInitialization() OVERRIDE; virtual void PostEarlyInitialization() OVERRIDE;
virtual void ToolkitInitialized() OVERRIDE; virtual void ToolkitInitialized() OVERRIDE;
...@@ -71,6 +74,13 @@ class ChromeBrowserMainParts : public content::BrowserMainParts { ...@@ -71,6 +74,13 @@ class ChromeBrowserMainParts : public content::BrowserMainParts {
virtual void PostStopThread(content::BrowserThread::ID identifier) OVERRIDE; virtual void PostStopThread(content::BrowserThread::ID identifier) OVERRIDE;
virtual void PostDestroyThreads() OVERRIDE; virtual void PostDestroyThreads() OVERRIDE;
// Additional stages for ChromeBrowserMainExtraParts. These stages are called
// in order from PreMainMessageLoopStart(). See implementation for details.
virtual void PreProfileInit();
virtual void PostProfileInit();
virtual void PreBrowserStart();
virtual void PostBrowserStart();
// Displays a warning message that we can't find any locale data files. // Displays a warning message that we can't find any locale data files.
virtual void ShowMissingLocaleMessageBox() = 0; virtual void ShowMissingLocaleMessageBox() = 0;
...@@ -82,6 +92,7 @@ class ChromeBrowserMainParts : public content::BrowserMainParts { ...@@ -82,6 +92,7 @@ class ChromeBrowserMainParts : public content::BrowserMainParts {
} }
Profile* profile() { return profile_; } Profile* profile() { return profile_; }
MetricsService* metrics() { return metrics_; }
private: private:
// Methods for |EarlyInitialization()| --------------------------------------- // Methods for |EarlyInitialization()| ---------------------------------------
......
...@@ -25,10 +25,16 @@ void ChromeBrowserMainExtraParts::PostMainMessageLoopStart() { ...@@ -25,10 +25,16 @@ void ChromeBrowserMainExtraParts::PostMainMessageLoopStart() {
void ChromeBrowserMainExtraParts::ToolkitInitialized() { void ChromeBrowserMainExtraParts::ToolkitInitialized() {
} }
void ChromeBrowserMainExtraParts::PostBrowserProcessInit() { void ChromeBrowserMainExtraParts::PreProfileInit() {
} }
void ChromeBrowserMainExtraParts::PostProfileInitialized() { void ChromeBrowserMainExtraParts::PostProfileInit() {
}
void ChromeBrowserMainExtraParts::PreBrowserStart() {
}
void ChromeBrowserMainExtraParts::PostBrowserStart() {
} }
void ChromeBrowserMainExtraParts::PreMainMessageLoopRun() { void ChromeBrowserMainExtraParts::PreMainMessageLoopRun() {
......
...@@ -32,8 +32,10 @@ class ChromeBrowserMainExtraParts { ...@@ -32,8 +32,10 @@ class ChromeBrowserMainExtraParts {
virtual void PostMainMessageLoopStart(); virtual void PostMainMessageLoopStart();
// MainMessageLoopRun methods. // MainMessageLoopRun methods.
virtual void PostBrowserProcessInit(); virtual void PreProfileInit();
virtual void PostProfileInitialized(); virtual void PostProfileInit();
virtual void PreBrowserStart();
virtual void PostBrowserStart();
virtual void PreMainMessageLoopRun(); virtual void PreMainMessageLoopRun();
virtual void PostMainMessageLoopRun(); virtual void PostMainMessageLoopRun();
......
...@@ -16,7 +16,7 @@ ChromeBrowserMainExtraPartsAura::ChromeBrowserMainExtraPartsAura() ...@@ -16,7 +16,7 @@ ChromeBrowserMainExtraPartsAura::ChromeBrowserMainExtraPartsAura()
: ChromeBrowserMainExtraParts() { : ChromeBrowserMainExtraParts() {
} }
void ChromeBrowserMainExtraPartsAura::PostBrowserProcessInit() { void ChromeBrowserMainExtraPartsAura::PreProfileInit() {
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
if (chromeos::system::runtime_environment::IsRunningOnChromeOS()) if (chromeos::system::runtime_environment::IsRunningOnChromeOS())
aura::Desktop::set_use_fullscreen_host_window(true); aura::Desktop::set_use_fullscreen_host_window(true);
......
...@@ -13,7 +13,7 @@ class ChromeBrowserMainExtraPartsAura : public ChromeBrowserMainExtraParts { ...@@ -13,7 +13,7 @@ class ChromeBrowserMainExtraPartsAura : public ChromeBrowserMainExtraParts {
public: public:
ChromeBrowserMainExtraPartsAura(); ChromeBrowserMainExtraPartsAura();
virtual void PostBrowserProcessInit() OVERRIDE; virtual void PreProfileInit() OVERRIDE;
private: private:
DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainExtraPartsAura); DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainExtraPartsAura);
......
...@@ -9,27 +9,53 @@ ...@@ -9,27 +9,53 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/lazy_instance.h" #include "base/lazy_instance.h"
#include "base/message_loop.h" #include "base/message_loop.h"
#include "base/string_number_conversions.h"
#include "chrome/browser/browser_process_impl.h"
#include "chrome/browser/chromeos/accessibility/system_event_observer.h" #include "chrome/browser/chromeos/accessibility/system_event_observer.h"
#include "chrome/browser/chromeos/audio_handler.h"
#include "chrome/browser/chromeos/audio_handler.h"
#include "chrome/browser/chromeos/bluetooth/bluetooth_manager.h" #include "chrome/browser/chromeos/bluetooth/bluetooth_manager.h"
#include "chrome/browser/chromeos/boot_times_loader.h" #include "chrome/browser/chromeos/boot_times_loader.h"
#include "chrome/browser/chromeos/boot_times_loader.h"
#include "chrome/browser/chromeos/brightness_observer.h" #include "chrome/browser/chromeos/brightness_observer.h"
#include "chrome/browser/chromeos/cros/cros_library.h" #include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/cros/screen_lock_library.h"
#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" #include "chrome/browser/chromeos/dbus/dbus_thread_manager.h"
#include "chrome/browser/chromeos/dbus/power_manager_client.h" #include "chrome/browser/chromeos/dbus/power_manager_client.h"
#include "chrome/browser/chromeos/dbus/session_manager_client.h" #include "chrome/browser/chromeos/dbus/session_manager_client.h"
#include "chrome/browser/chromeos/disks/disk_mount_manager.h" #include "chrome/browser/chromeos/disks/disk_mount_manager.h"
#include "chrome/browser/chromeos/external_metrics.h"
#include "chrome/browser/chromeos/input_method/input_method_manager.h" #include "chrome/browser/chromeos/input_method/input_method_manager.h"
#include "chrome/browser/chromeos/input_method/xkeyboard.h" #include "chrome/browser/chromeos/input_method/xkeyboard.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/session_manager_observer.h" #include "chrome/browser/chromeos/login/session_manager_observer.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/net/cros_network_change_notifier_factory.h" #include "chrome/browser/chromeos/net/cros_network_change_notifier_factory.h"
#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h" #include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h"
#include "chrome/browser/chromeos/status/status_area_view_chromeos.h"
#include "chrome/browser/chromeos/system/runtime_environment.h" #include "chrome/browser/chromeos/system/runtime_environment.h"
#include "chrome/browser/chromeos/system/statistics_provider.h" #include "chrome/browser/chromeos/system/statistics_provider.h"
#include "chrome/browser/chromeos/system_key_event_listener.h"
#include "chrome/browser/chromeos/upgrade_detector_chromeos.h" #include "chrome/browser/chromeos/upgrade_detector_chromeos.h"
#include "chrome/browser/chromeos/xinput_hierarchy_changed_event_listener.h"
#include "chrome/browser/defaults.h" #include "chrome/browser/defaults.h"
#include "chrome/browser/metrics/metrics_service.h"
#include "chrome/browser/oom_priority_manager.h"
#include "chrome/browser/policy/browser_policy_connector.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/views/browser_dialogs.h"
#include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_switches.h"
#include "chrome/common/logging_chrome.h"
#include "content/public/common/main_function_params.h" #include "content/public/common/main_function_params.h"
#include "grit/platform_locale_settings.h"
#include "net/base/network_change_notifier.h" #include "net/base/network_change_notifier.h"
#include "net/url_request/url_request.h"
#include "ui/base/l10n/l10n_util.h"
#if defined(TOOLKIT_USES_GTK) #if defined(TOOLKIT_USES_GTK)
#include <gtk/gtk.h> #include <gtk/gtk.h>
...@@ -82,6 +108,111 @@ class MessageLoopObserver : public MessageLoopForUI::Observer { ...@@ -82,6 +108,111 @@ class MessageLoopObserver : public MessageLoopForUI::Observer {
static base::LazyInstance<MessageLoopObserver> g_message_loop_observer = static base::LazyInstance<MessageLoopObserver> g_message_loop_observer =
LAZY_INSTANCE_INITIALIZER; LAZY_INSTANCE_INITIALIZER;
// Login -----------------------------------------------------------------------
// 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_;
};
// Allows authenticator to be invoked without adding refcounting. The instances
// will delete themselves upon completion.
DISABLE_RUNNABLE_METHOD_REFCOUNT(StubLogin);
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);
}
}
}
// ChromeBrowserMainPartsChromeos ----------------------------------------------
ChromeBrowserMainPartsChromeos::ChromeBrowserMainPartsChromeos( ChromeBrowserMainPartsChromeos::ChromeBrowserMainPartsChromeos(
const content::MainFunctionParams& parameters) const content::MainFunctionParams& parameters)
: ChromeBrowserMainPartsLinux(parameters) { : ChromeBrowserMainPartsLinux(parameters) {
...@@ -102,8 +233,9 @@ ChromeBrowserMainPartsChromeos::~ChromeBrowserMainPartsChromeos() { ...@@ -102,8 +233,9 @@ ChromeBrowserMainPartsChromeos::~ChromeBrowserMainPartsChromeos() {
chromeos::BootTimesLoader::Get()->WriteLogoutTimes(); chromeos::BootTimesLoader::Get()->WriteLogoutTimes();
} }
// content::BrowserMainParts and ChromeBrowserMainExtraParts overrides ---------
void ChromeBrowserMainPartsChromeos::PreEarlyInitialization() { void ChromeBrowserMainPartsChromeos::PreEarlyInitialization() {
ChromeBrowserMainPartsLinux::PreEarlyInitialization();
if (parsed_command_line().HasSwitch(switches::kGuestSession)) { if (parsed_command_line().HasSwitch(switches::kGuestSession)) {
// Disable sync and extensions if we're in "browse without sign-in" mode. // Disable sync and extensions if we're in "browse without sign-in" mode.
CommandLine* singleton_command_line = CommandLine::ForCurrentProcess(); CommandLine* singleton_command_line = CommandLine::ForCurrentProcess();
...@@ -111,10 +243,11 @@ void ChromeBrowserMainPartsChromeos::PreEarlyInitialization() { ...@@ -111,10 +243,11 @@ void ChromeBrowserMainPartsChromeos::PreEarlyInitialization() {
singleton_command_line->AppendSwitch(switches::kDisableExtensions); singleton_command_line->AppendSwitch(switches::kDisableExtensions);
browser_defaults::bookmarks_enabled = false; browser_defaults::bookmarks_enabled = false;
} }
ChromeBrowserMainPartsLinux::PreEarlyInitialization();
} }
void ChromeBrowserMainPartsChromeos::PreMainMessageLoopStart() { void ChromeBrowserMainPartsChromeos::PreMainMessageLoopStart() {
ChromeBrowserMainPartsLinux::PreMainMessageLoopStart();
// Initialize CrosLibrary only for the browser, unless running tests // Initialize CrosLibrary only for the browser, unless running tests
// (which do their own CrosLibrary setup). // (which do their own CrosLibrary setup).
if (!parameters().ui_task) { if (!parameters().ui_task) {
...@@ -125,11 +258,126 @@ void ChromeBrowserMainPartsChromeos::PreMainMessageLoopStart() { ...@@ -125,11 +258,126 @@ void ChromeBrowserMainPartsChromeos::PreMainMessageLoopStart() {
// implementation. // implementation.
net::NetworkChangeNotifier::SetFactory( net::NetworkChangeNotifier::SetFactory(
new chromeos::CrosNetworkChangeNotifierFactory()); new chromeos::CrosNetworkChangeNotifierFactory());
ChromeBrowserMainPartsLinux::PreMainMessageLoopStart();
} }
void ChromeBrowserMainPartsChromeos::PreMainMessageLoopRun() { void ChromeBrowserMainPartsChromeos::PreProfileInit() {
// -- This used to be in ChromeBrowserMainParts::PreMainMessageLoopRun()
// -- immediately before Profile creation().
// 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();
// -- This used to be in ChromeBrowserMainParts::PreMainMessageLoopRun()
// -- just before CreateProfile().
// 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);
}
// In Aura builds this will initialize aura_shell::Shell.
ChromeBrowserMainPartsLinux::PreProfileInit();
}
void ChromeBrowserMainPartsChromeos::PostProfileInit() {
// -- This used to be in ChromeBrowserMainParts::PreMainMessageLoopRun()
// -- just after CreateProfile().
// 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());
ChromeBrowserMainPartsLinux::PostProfileInit();
}
void ChromeBrowserMainPartsChromeos::PreBrowserStart() {
// -- This used to be in ChromeBrowserMainParts::PreMainMessageLoopRun()
// -- just before MetricsService::LogNeedForCleanShutdown().
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();
// -- This used to be in ChromeBrowserMainParts::PreMainMessageLoopRun()
// -- immediately after ChildProcess::WaitForDebugger().
// Start the out-of-memory priority manager here 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();
ChromeBrowserMainPartsLinux::PreBrowserStart();
}
void ChromeBrowserMainPartsChromeos::PostBrowserStart() {
// FILE thread is created in ChromeBrowserMainParts::PreMainMessageLoopRun(). // FILE thread is created in ChromeBrowserMainParts::PreMainMessageLoopRun().
ChromeBrowserMainPartsLinux::PreMainMessageLoopRun();
// Get the statistics provider instance here to start loading statistcs // Get the statistics provider instance here to start loading statistcs
// on the background FILE thread. // on the background FILE thread.
chromeos::system::StatisticsProvider::GetInstance(); chromeos::system::StatisticsProvider::GetInstance();
...@@ -143,10 +391,11 @@ void ChromeBrowserMainPartsChromeos::PreMainMessageLoopRun() { ...@@ -143,10 +391,11 @@ void ChromeBrowserMainPartsChromeos::PreMainMessageLoopRun() {
if (parsed_command_line().HasSwitch(switches::kEnableBluetooth)) { if (parsed_command_line().HasSwitch(switches::kEnableBluetooth)) {
chromeos::BluetoothManager::Initialize(); chromeos::BluetoothManager::Initialize();
} }
ChromeBrowserMainPartsLinux::PostBrowserStart();
} }
void ChromeBrowserMainPartsChromeos::PostMainMessageLoopStart() { void ChromeBrowserMainPartsChromeos::PostMainMessageLoopStart() {
ChromeBrowserMainPartsLinux::PostMainMessageLoopStart();
MessageLoopForUI* message_loop = MessageLoopForUI::current(); MessageLoopForUI* message_loop = MessageLoopForUI::current();
message_loop->AddObserver(g_message_loop_observer.Pointer()); message_loop->AddObserver(g_message_loop_observer.Pointer());
...@@ -196,11 +445,25 @@ void ChromeBrowserMainPartsChromeos::PostMainMessageLoopStart() { ...@@ -196,11 +445,25 @@ void ChromeBrowserMainPartsChromeos::PostMainMessageLoopStart() {
new chromeos::InitialBrowserWindowObserver); new chromeos::InitialBrowserWindowObserver);
#endif #endif
} }
ChromeBrowserMainPartsLinux::PostMainMessageLoopStart();
} }
// Shut down services before the browser process, etc are destroyed. // Shut down services before the browser process, etc are destroyed.
void ChromeBrowserMainPartsChromeos::PostMainMessageLoopRun() { void ChromeBrowserMainPartsChromeos::PostMainMessageLoopRun() {
ChromeBrowserMainPartsLinux::PostMainMessageLoopRun(); chromeos::BootTimesLoader::Get()->AddLogoutTimeMarker("UIMessageLoopEnded",
true);
g_browser_process->oom_priority_manager()->Stop();
// 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();
// Shutdown the upgrade detector for Chrome OS. The upgrade detector // Shutdown the upgrade detector for Chrome OS. The upgrade detector
// stops monitoring changes from the update engine. // stops monitoring changes from the update engine.
...@@ -229,4 +492,6 @@ void ChromeBrowserMainPartsChromeos::PostMainMessageLoopRun() { ...@@ -229,4 +492,6 @@ void ChromeBrowserMainPartsChromeos::PostMainMessageLoopRun() {
// these. // these.
chromeos::accessibility::SystemEventObserver::Shutdown(); chromeos::accessibility::SystemEventObserver::Shutdown();
chromeos::BluetoothManager::Shutdown(); chromeos::BluetoothManager::Shutdown();
ChromeBrowserMainPartsLinux::PostMainMessageLoopRun();
} }
...@@ -27,9 +27,14 @@ class ChromeBrowserMainPartsChromeos : public ChromeBrowserMainPartsLinux { ...@@ -27,9 +27,14 @@ class ChromeBrowserMainPartsChromeos : public ChromeBrowserMainPartsLinux {
virtual void PreEarlyInitialization() OVERRIDE; virtual void PreEarlyInitialization() OVERRIDE;
virtual void PreMainMessageLoopStart() OVERRIDE; virtual void PreMainMessageLoopStart() OVERRIDE;
virtual void PostMainMessageLoopStart() OVERRIDE; virtual void PostMainMessageLoopStart() OVERRIDE;
virtual void PreMainMessageLoopRun() OVERRIDE;
virtual void PostMainMessageLoopRun() OVERRIDE; virtual void PostMainMessageLoopRun() OVERRIDE;
// ChromeBrowserMainExtraParts overrodes.
virtual void PreProfileInit() OVERRIDE;
virtual void PostProfileInit() OVERRIDE;
virtual void PreBrowserStart() OVERRIDE;
virtual void PostBrowserStart() OVERRIDE;
private: private:
scoped_ptr<chromeos::BrightnessObserver> brightness_observer_; scoped_ptr<chromeos::BrightnessObserver> brightness_observer_;
scoped_ptr<chromeos::SessionManagerObserver> session_manager_observer_; scoped_ptr<chromeos::SessionManagerObserver> session_manager_observer_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment