Index: chrome/browser/chromeos/login/base_login_display_host.cc |
diff --git a/chrome/browser/chromeos/login/base_login_display_host.cc b/chrome/browser/chromeos/login/base_login_display_host.cc |
deleted file mode 100644 |
index 9697c6d072323e5ca2476548895f32db8edf6b90..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/login/base_login_display_host.cc |
+++ /dev/null |
@@ -1,512 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/chromeos/login/base_login_display_host.h" |
- |
-#include "ash/desktop_background/desktop_background_controller.h" |
-#include "ash/shell.h" |
-#include "ash/shell_window_ids.h" |
-#include "base/bind.h" |
-#include "base/command_line.h" |
-#include "base/debug/trace_event.h" |
-#include "base/file_util.h" |
-#include "base/logging.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/threading/thread_restrictions.h" |
-#include "base/utf_string_conversions.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/browser_shutdown.h" |
-#include "chrome/browser/chromeos/cros/cros_library.h" |
-#include "chrome/browser/chromeos/customization_document.h" |
-#include "chrome/browser/chromeos/input_method/input_method_configuration.h" |
-#include "chrome/browser/chromeos/input_method/input_method_manager.h" |
-#include "chrome/browser/chromeos/input_method/input_method_util.h" |
-#include "chrome/browser/chromeos/language_preferences.h" |
-#include "chrome/browser/chromeos/login/existing_user_controller.h" |
-#include "chrome/browser/chromeos/login/helper.h" |
-#include "chrome/browser/chromeos/login/language_switch_menu.h" |
-#include "chrome/browser/chromeos/login/login_utils.h" |
-#include "chrome/browser/chromeos/login/login_wizard.h" |
-#include "chrome/browser/chromeos/login/user_manager.h" |
-#include "chrome/browser/chromeos/login/webui_login_display_host.h" |
-#include "chrome/browser/chromeos/login/wizard_controller.h" |
-#include "chrome/browser/chromeos/mobile_config.h" |
-#include "chrome/browser/chromeos/policy/auto_enrollment_client.h" |
-#include "chrome/browser/chromeos/system/input_device_settings.h" |
-#include "chrome/browser/chromeos/system/timezone_settings.h" |
-#include "chrome/browser/lifetime/application_lifetime.h" |
-#include "chrome/browser/managed_mode/managed_mode.h" |
-#include "chrome/browser/policy/browser_policy_connector.h" |
-#include "chrome/common/chrome_notification_types.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/pref_names.h" |
-#include "chromeos/dbus/dbus_thread_manager.h" |
-#include "chromeos/dbus/session_manager_client.h" |
-#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/notification_types.h" |
-#include "googleurl/src/gurl.h" |
-#include "ui/aura/window.h" |
-#include "ui/base/events/event_utils.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/compositor/layer.h" |
-#include "ui/compositor/layer_animation_element.h" |
-#include "ui/compositor/layer_animation_sequence.h" |
-#include "ui/compositor/layer_animator.h" |
-#include "ui/compositor/scoped_layer_animation_settings.h" |
-#include "ui/gfx/rect.h" |
-#include "ui/gfx/transform.h" |
-#include "ui/views/widget/widget.h" |
- |
-namespace { |
- |
-// The delay of triggering initialization of the device policy subsystem |
-// after the login screen is initialized. This makes sure that device policy |
-// network requests are made while the system is idle waiting for user input. |
-const int64 kPolicyServiceInitializationDelayMilliseconds = 100; |
- |
-// Determines the hardware keyboard from the given locale code |
-// and the OEM layout information, and saves it to "Locale State". |
-// The information will be used in InputMethodUtil::GetHardwareInputMethodId(). |
-void DetermineAndSaveHardwareKeyboard(const std::string& locale, |
- const std::string& oem_layout) { |
- std::string layout; |
- if (!oem_layout.empty()) { |
- // If the OEM layout information is provided, use it. |
- layout = oem_layout; |
- } else { |
- chromeos::input_method::InputMethodManager* manager = |
- chromeos::input_method::GetInputMethodManager(); |
- // Otherwise, determine the hardware keyboard from the locale. |
- std::vector<std::string> input_method_ids; |
- if (manager->GetInputMethodUtil()->GetInputMethodIdsFromLanguageCode( |
- locale, |
- chromeos::input_method::kKeyboardLayoutsOnly, |
- &input_method_ids)) { |
- // The output list |input_method_ids| is sorted by popularity, hence |
- // input_method_ids[0] now contains the most popular keyboard layout |
- // for the given locale. |
- layout = input_method_ids[0]; |
- } |
- } |
- |
- if (!layout.empty()) { |
- PrefService* prefs = g_browser_process->local_state(); |
- prefs->SetString(prefs::kHardwareKeyboardLayout, layout); |
- // This asks the file thread to save the prefs (i.e. doesn't block). |
- // The latest values of Local State reside in memory so we can safely |
- // get the value of kHardwareKeyboardLayout even if the data is not |
- // yet saved to disk. |
- prefs->CommitPendingWrite(); |
- } |
-} |
- |
-ui::Layer* GetLayer(views::Widget* widget) { |
- return widget->GetNativeView()->layer(); |
-} |
- |
-} // namespace |
- |
-namespace chromeos { |
- |
-// static |
-LoginDisplayHost* BaseLoginDisplayHost::default_host_ = NULL; |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BaseLoginDisplayHost, public |
- |
-BaseLoginDisplayHost::BaseLoginDisplayHost(const gfx::Rect& background_bounds) |
- : background_bounds_(background_bounds), |
- ALLOW_THIS_IN_INITIALIZER_LIST(pointer_factory_(this)), |
- shutting_down_(false), |
- oobe_progress_bar_visible_(false), |
- session_starting_(false) { |
- // We need to listen to CLOSE_ALL_BROWSERS_REQUEST but not APP_TERMINATIN |
- // because/ APP_TERMINATING will never be fired as long as this keeps |
- // ref-count. CLOSE_ALL_BROWSERS_REQUEST is safe here because there will be no |
- // browser instance that will block the shutdown. |
- registrar_.Add(this, |
- chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST, |
- content::NotificationService::AllSources()); |
- |
- // NOTIFICATION_BROWSER_OPENED is issued after browser is created, but |
- // not shown yet. Lock window has to be closed at this point so that |
- // a browser window exists and the window can acquire input focus. |
- registrar_.Add(this, |
- chrome::NOTIFICATION_BROWSER_OPENED, |
- content::NotificationService::AllSources()); |
- |
- // Login screen is moved to lock screen container when user logs in. |
- registrar_.Add(this, |
- chrome::NOTIFICATION_LOGIN_USER_CHANGED, |
- content::NotificationService::AllSources()); |
- |
- DCHECK(default_host_ == NULL); |
- default_host_ = this; |
- |
- // Make sure chrome won't exit while we are at login/oobe screen. |
- chrome::StartKeepAlive(); |
-} |
- |
-BaseLoginDisplayHost::~BaseLoginDisplayHost() { |
- // Let chrome process exit after login/oobe screen if needed. |
- chrome::EndKeepAlive(); |
- |
- default_host_ = NULL; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BaseLoginDisplayHost, LoginDisplayHost implementation: |
- |
-void BaseLoginDisplayHost::BeforeSessionStart() { |
- session_starting_ = true; |
-} |
- |
-void BaseLoginDisplayHost::OnSessionStart() { |
- DVLOG(1) << "Session starting"; |
- ash::Shell::GetInstance()-> |
- desktop_background_controller()->MoveDesktopToUnlockedContainer(); |
- if (wizard_controller_.get()) |
- wizard_controller_->OnSessionStart(); |
- // Display host is deleted once animation is completed |
- // since sign in screen widget has to stay alive. |
- StartAnimation(); |
- ShutdownDisplayHost(false); |
-} |
- |
-void BaseLoginDisplayHost::OnCompleteLogin() { |
- // Cancelling the |auto_enrollment_client_| now allows it to determine whether |
- // its protocol finished before login was complete. |
- if (auto_enrollment_client_.get()) |
- auto_enrollment_client_.release()->CancelAndDeleteSoon(); |
-} |
- |
-void BaseLoginDisplayHost::StartWizard( |
- const std::string& first_screen_name, |
- DictionaryValue* screen_parameters) { |
- DVLOG(1) << "Starting wizard, first_screen_name: " << first_screen_name; |
- // Create and show the wizard. |
- // Note, dtor of the old WizardController should be called before ctor of the |
- // new one, because "default_controller()" is updated there. So pure "reset()" |
- // is done before new controller creation. |
- wizard_controller_.reset(); |
- wizard_controller_.reset(CreateWizardController()); |
- |
- oobe_progress_bar_visible_ = !WizardController::IsDeviceRegistered(); |
- SetOobeProgressBarVisible(oobe_progress_bar_visible_); |
- wizard_controller_->Init(first_screen_name, screen_parameters); |
-} |
- |
-void BaseLoginDisplayHost::StartSignInScreen() { |
- DVLOG(1) << "Starting sign in screen"; |
- const chromeos::UserList& users = chromeos::UserManager::Get()->GetUsers(); |
- |
- // Fix for users who updated device and thus never passed register screen. |
- // If we already have users, we assume that it is not a second part of |
- // OOBE. See http://crosbug.com/6289 |
- if (!WizardController::IsDeviceRegistered() && !users.empty()) { |
- VLOG(1) << "Mark device registered because there are remembered users: " |
- << users.size(); |
- WizardController::MarkDeviceRegistered(); |
- } |
- |
- sign_in_controller_.reset(); // Only one controller in a time. |
- sign_in_controller_.reset(new chromeos::ExistingUserController(this)); |
- oobe_progress_bar_visible_ = !WizardController::IsDeviceRegistered(); |
- SetOobeProgressBarVisible(oobe_progress_bar_visible_); |
- SetStatusAreaVisible(true); |
- SetShutdownButtonEnabled(true); |
- sign_in_controller_->Init(users); |
- |
- // We might be here after a reboot that was triggered after OOBE was complete, |
- // so check for auto-enrollment again. This might catch a cached decision from |
- // a previous oobe flow, or might start a new check with the server. |
- CheckForAutoEnrollment(); |
- |
- // Initiate services customization manifest fetching. |
- ServicesCustomizationDocument::GetInstance()->StartFetching(); |
- |
- // Initiate mobile config load. |
- MobileConfig::GetInstance(); |
- |
- // Initiate device policy fetching. |
- g_browser_process->browser_policy_connector()->ScheduleServiceInitialization( |
- kPolicyServiceInitializationDelayMilliseconds); |
-} |
- |
-WizardController* BaseLoginDisplayHost::GetWizardController() { |
- return wizard_controller_.get(); |
-} |
- |
-void BaseLoginDisplayHost::ResumeSignInScreen() { |
- // We only get here after a previous call the StartSignInScreen. That sign-in |
- // was successful but was interrupted by an auto-enrollment execution; once |
- // auto-enrollment is complete we resume the normal login flow from here. |
- DVLOG(1) << "Resuming sign in screen"; |
- CHECK(sign_in_controller_.get()); |
- SetOobeProgressBarVisible(oobe_progress_bar_visible_); |
- SetStatusAreaVisible(true); |
- SetShutdownButtonEnabled(true); |
- sign_in_controller_->ResumeLogin(); |
-} |
- |
-void BaseLoginDisplayHost::CheckForAutoEnrollment() { |
- // This method is called when the controller determines that the |
- // auto-enrollment check can start. This happens either after the EULA is |
- // accepted, or right after a reboot if the EULA has already been accepted. |
- |
- if (policy::AutoEnrollmentClient::IsDisabled()) { |
- VLOG(1) << "CheckForAutoEnrollment: auto-enrollment disabled"; |
- return; |
- } |
- |
- // Start by checking if the device has already been owned. |
- pointer_factory_.InvalidateWeakPtrs(); |
- DeviceSettingsService::Get()->GetOwnershipStatusAsync( |
- base::Bind(&BaseLoginDisplayHost::OnOwnershipStatusCheckDone, |
- pointer_factory_.GetWeakPtr())); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BaseLoginDisplayHost, content:NotificationObserver implementation: |
- |
-void BaseLoginDisplayHost::Observe( |
- int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- if (type == chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST) { |
- ShutdownDisplayHost(true); |
- } else if (type == chrome::NOTIFICATION_BROWSER_OPENED && session_starting_) { |
- // Browsers created before session start (windows opened by extensions, for |
- // example) are ignored. |
- OnBrowserCreated(); |
- registrar_.Remove(this, |
- chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST, |
- content::NotificationService::AllSources()); |
- registrar_.Remove(this, |
- chrome::NOTIFICATION_BROWSER_OPENED, |
- content::NotificationService::AllSources()); |
- } else if (type == chrome::NOTIFICATION_LOGIN_USER_CHANGED && |
- chromeos::UserManager::Get()->IsCurrentUserNew()) { |
- // For new user, move desktop to locker container so that windows created |
- // during the user image picker step are below it. |
- ash::Shell::GetInstance()-> |
- desktop_background_controller()->MoveDesktopToLockedContainer(); |
- registrar_.Remove(this, |
- chrome::NOTIFICATION_LOGIN_USER_CHANGED, |
- content::NotificationService::AllSources()); |
- } |
-} |
- |
-void BaseLoginDisplayHost::ShutdownDisplayHost(bool post_quit_task) { |
- if (shutting_down_) |
- return; |
- |
- shutting_down_ = true; |
- registrar_.RemoveAll(); |
- MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
- if (post_quit_task) |
- MessageLoop::current()->Quit(); |
-} |
- |
-void BaseLoginDisplayHost::StartAnimation() { |
- if (ash::Shell::GetContainer( |
- ash::Shell::GetPrimaryRootWindow(), |
- ash::internal::kShellWindowId_DesktopBackgroundContainer)-> |
- children().empty()) { |
- // If there is no background window, don't perform any animation on the |
- // default and background layer because there is nothing behind it. |
- return; |
- } |
- |
- if (!CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kDisableLoginAnimations)) |
- ash::Shell::GetInstance()->DoInitialWorkspaceAnimation(); |
-} |
- |
-void BaseLoginDisplayHost::OnOwnershipStatusCheckDone( |
- DeviceSettingsService::OwnershipStatus status, |
- bool current_user_is_owner) { |
- if (status != DeviceSettingsService::OWNERSHIP_NONE) { |
- // The device is already owned. No need for auto-enrollment checks. |
- VLOG(1) << "CheckForAutoEnrollment: device already owned"; |
- return; |
- } |
- |
- // Kick off the auto-enrollment client. |
- if (auto_enrollment_client_.get()) { |
- // They client might have been started after the EULA screen, but we made |
- // it to the login screen before it finished. In that case let the current |
- // client proceed. |
- // |
- // CheckForAutoEnrollment() is also called when we reach the sign-in screen, |
- // because that's what happens after an auto-update. |
- VLOG(1) << "CheckForAutoEnrollment: client already started"; |
- |
- // If the client already started and already finished too, pass the decision |
- // to the |sign_in_controller_| now. |
- if (auto_enrollment_client_->should_auto_enroll()) |
- ForceAutoEnrollment(); |
- } else { |
- VLOG(1) << "CheckForAutoEnrollment: starting auto-enrollment client"; |
- auto_enrollment_client_.reset(policy::AutoEnrollmentClient::Create( |
- base::Bind(&BaseLoginDisplayHost::OnAutoEnrollmentClientDone, |
- base::Unretained(this)))); |
- auto_enrollment_client_->Start(); |
- } |
-} |
- |
-void BaseLoginDisplayHost::OnAutoEnrollmentClientDone() { |
- bool auto_enroll = auto_enrollment_client_->should_auto_enroll(); |
- VLOG(1) << "OnAutoEnrollmentClientDone, decision is " << auto_enroll; |
- |
- if (auto_enroll) |
- ForceAutoEnrollment(); |
-} |
- |
-void BaseLoginDisplayHost::ForceAutoEnrollment() { |
- if (sign_in_controller_.get()) |
- sign_in_controller_->DoAutoEnrollment(); |
-} |
- |
-// Declared in login_wizard.h so that others don't need to depend on our .h. |
-// TODO(nkostylev): Split this into a smaller functions. |
-void ShowLoginWizard(const std::string& first_screen_name, |
- const gfx::Size& size) { |
- if (browser_shutdown::IsTryingToQuit()) |
- return; |
- |
- // Managed mode is defined as a machine-level setting so we have to reset it |
- // each time login screen is shown. See also http://crbug.com/167642 |
- // TODO(nkostylev): Remove this call when managed mode scope is |
- // limited to user session. |
- if (ManagedMode::IsInManagedMode()) |
- ManagedMode::LeaveManagedMode(); |
- |
- VLOG(1) << "Showing OOBE screen: " << first_screen_name; |
- |
- chromeos::input_method::InputMethodManager* manager = |
- chromeos::input_method::GetInputMethodManager(); |
- |
- // Set up keyboards. For example, when |locale| is "en-US", enable US qwerty |
- // and US dvorak keyboard layouts. |
- if (g_browser_process && g_browser_process->local_state()) { |
- const std::string locale = g_browser_process->GetApplicationLocale(); |
- // If the preferred keyboard for the login screen has been saved, use it. |
- PrefService* prefs = g_browser_process->local_state(); |
- std::string initial_input_method_id = |
- prefs->GetString(chromeos::language_prefs::kPreferredKeyboardLayout); |
- if (initial_input_method_id.empty()) { |
- // If kPreferredKeyboardLayout is not specified, use the hardware layout. |
- initial_input_method_id = |
- manager->GetInputMethodUtil()->GetHardwareInputMethodId(); |
- } |
- manager->EnableLayouts(locale, initial_input_method_id); |
- |
- // Apply owner preferences for tap-to-click and mouse buttons swap for |
- // login screen. |
- system::mouse_settings::SetPrimaryButtonRight( |
- prefs->GetBoolean(prefs::kOwnerPrimaryMouseButtonRight)); |
- system::touchpad_settings::SetTapToClick( |
- prefs->GetBoolean(prefs::kOwnerTapToClickEnabled)); |
- } |
- |
- ui::SetNaturalScroll(CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kNaturalScrollDefault)); |
- |
- gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(size)); |
- |
- // Check whether we need to execute OOBE process. |
- bool oobe_complete = chromeos::WizardController::IsOobeCompleted(); |
- bool show_login_screen = |
- (first_screen_name.empty() && oobe_complete) || |
- first_screen_name == chromeos::WizardController::kLoginScreenName; |
- |
- chromeos::LoginDisplayHost* display_host; |
- display_host = new chromeos::WebUILoginDisplayHost(screen_bounds); |
- |
- if (show_login_screen) { |
- // R11 > R12 migration fix. See http://crosbug.com/p/4898. |
- // If user has manually changed locale during R11 OOBE, locale will be set. |
- // On R12 > R12|R13 etc. this fix won't get activated since |
- // OOBE process has set kApplicationLocale to non-default value. |
- PrefService* prefs = g_browser_process->local_state(); |
- if (!prefs->HasPrefPath(prefs::kApplicationLocale)) { |
- std::string locale = chromeos::WizardController::GetInitialLocale(); |
- prefs->SetString(prefs::kApplicationLocale, locale); |
- manager->EnableLayouts( |
- locale, |
- manager->GetInputMethodUtil()->GetHardwareInputMethodId()); |
- base::ThreadRestrictions::ScopedAllowIO allow_io; |
- const std::string loaded_locale = |
- ResourceBundle::GetSharedInstance().ReloadLocaleResources(locale); |
- g_browser_process->SetApplicationLocale(loaded_locale); |
- } |
- display_host->StartSignInScreen(); |
- return; |
- } |
- |
- // Load startup manifest. |
- const chromeos::StartupCustomizationDocument* startup_manifest = |
- chromeos::StartupCustomizationDocument::GetInstance(); |
- |
- // Switch to initial locale if specified by customization |
- // and has not been set yet. We cannot call |
- // chromeos::LanguageSwitchMenu::SwitchLanguage here before |
- // EmitLoginPromptReady. |
- PrefService* prefs = g_browser_process->local_state(); |
- const std::string current_locale = |
- prefs->GetString(prefs::kApplicationLocale); |
- VLOG(1) << "Current locale: " << current_locale; |
- std::string locale; |
- if (current_locale.empty()) { |
- locale = startup_manifest->initial_locale(); |
- std::string layout = startup_manifest->keyboard_layout(); |
- VLOG(1) << "Initial locale: " << locale |
- << "keyboard layout " << layout; |
- if (!locale.empty()) { |
- // Save initial locale from VPD/customization manifest as current |
- // Chrome locale. Otherwise it will be lost if Chrome restarts. |
- // Don't need to schedule pref save because setting initial local |
- // will enforce preference saving. |
- prefs->SetString(prefs::kApplicationLocale, locale); |
- chromeos::WizardController::SetInitialLocale(locale); |
- // Determine keyboard layout from OEM customization (if provided) or |
- // initial locale and save it in preferences. |
- DetermineAndSaveHardwareKeyboard(locale, layout); |
- // Then, enable the hardware keyboard. |
- manager->EnableLayouts( |
- locale, |
- manager->GetInputMethodUtil()->GetHardwareInputMethodId()); |
- // Reloading resource bundle causes us to do blocking IO on UI thread. |
- // Temporarily allow it until we fix http://crosbug.com/11102 |
- base::ThreadRestrictions::ScopedAllowIO allow_io; |
- const std::string loaded_locale = |
- ResourceBundle::GetSharedInstance().ReloadLocaleResources(locale); |
- CHECK(!loaded_locale.empty()) << "Locale could not be found for " |
- << locale; |
- // Set the application locale here so that the language switch |
- // menu works properly with the newly loaded locale. |
- g_browser_process->SetApplicationLocale(loaded_locale); |
- } |
- } |
- |
- display_host->StartWizard(first_screen_name, NULL); |
- |
- chromeos::LoginUtils::Get()->PrewarmAuthentication(); |
- chromeos::DBusThreadManager::Get()->GetSessionManagerClient() |
- ->EmitLoginPromptReady(); |
- TRACE_EVENT0("chromeos", "ShowLoginWizard::EmitLoginPromptReady"); |
- |
- // Set initial timezone if specified by customization. |
- const std::string timezone_name = startup_manifest->initial_timezone(); |
- VLOG(1) << "Initial time zone: " << timezone_name; |
- // Apply locale customizations only once to preserve whatever locale |
- // user has changed to during OOBE. |
- if (!timezone_name.empty()) { |
- chromeos::system::TimezoneSettings::GetInstance()->SetTimezoneFromID( |
- UTF8ToUTF16(timezone_name)); |
- } |
-} |
- |
-} // namespace chromeos |