Index: chrome/browser/chromeos/login/login_display_host_impl.cc |
diff --git a/chrome/browser/chromeos/login/login_display_host_impl.cc b/chrome/browser/chromeos/login/login_display_host_impl.cc |
deleted file mode 100644 |
index 772188d55a09f328c79eb0c9fb6491260bd77ea1..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/login/login_display_host_impl.cc |
+++ /dev/null |
@@ -1,1267 +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/login_display_host_impl.h" |
- |
-#include <vector> |
- |
-#include "ash/audio/sounds.h" |
-#include "ash/desktop_background/desktop_background_controller.h" |
-#include "ash/desktop_background/user_wallpaper_delegate.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/logging.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/strings/string_split.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/threading/thread_restrictions.h" |
-#include "base/time/time.h" |
-#include "base/values.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/browser_shutdown.h" |
-#include "chrome/browser/chrome_notification_types.h" |
-#include "chrome/browser/chromeos/accessibility/accessibility_manager.h" |
-#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" |
-#include "chrome/browser/chromeos/base/locale_util.h" |
-#include "chrome/browser/chromeos/boot_times_loader.h" |
-#include "chrome/browser/chromeos/charger_replace/charger_replacement_dialog.h" |
-#include "chrome/browser/chromeos/first_run/drive_first_run_controller.h" |
-#include "chrome/browser/chromeos/first_run/first_run.h" |
-#include "chrome/browser/chromeos/input_method/input_method_util.h" |
-#include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h" |
-#include "chrome/browser/chromeos/language_preferences.h" |
-#include "chrome/browser/chromeos/login/demo_mode/demo_app_launcher.h" |
-#include "chrome/browser/chromeos/login/existing_user_controller.h" |
-#include "chrome/browser/chromeos/login/helper.h" |
-#include "chrome/browser/chromeos/login/input_events_blocker.h" |
-#include "chrome/browser/chromeos/login/keyboard_driven_oobe_key_handler.h" |
-#include "chrome/browser/chromeos/login/login_utils.h" |
-#include "chrome/browser/chromeos/login/login_wizard.h" |
-#include "chrome/browser/chromeos/login/oobe_display.h" |
-#include "chrome/browser/chromeos/login/startup_utils.h" |
-#include "chrome/browser/chromeos/login/user_manager.h" |
-#include "chrome/browser/chromeos/login/webui_login_display.h" |
-#include "chrome/browser/chromeos/login/webui_login_view.h" |
-#include "chrome/browser/chromeos/login/wizard_controller.h" |
-#include "chrome/browser/chromeos/mobile_config.h" |
-#include "chrome/browser/chromeos/net/delay_network_call.h" |
-#include "chrome/browser/chromeos/policy/auto_enrollment_client.h" |
-#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" |
-#include "chrome/browser/chromeos/system/input_device_settings.h" |
-#include "chrome/browser/chromeos/ui/focus_ring_controller.h" |
-#include "chrome/browser/lifetime/application_lifetime.h" |
-#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" |
-#include "chrome/common/chrome_constants.h" |
-#include "chrome/common/chrome_switches.h" |
-#include "chrome/common/pref_names.h" |
-#include "chromeos/audio/chromeos_sounds.h" |
-#include "chromeos/chromeos_constants.h" |
-#include "chromeos/chromeos_switches.h" |
-#include "chromeos/dbus/dbus_thread_manager.h" |
-#include "chromeos/dbus/session_manager_client.h" |
-#include "chromeos/ime/extension_ime_util.h" |
-#include "chromeos/ime/input_method_manager.h" |
-#include "chromeos/login/login_state.h" |
-#include "chromeos/settings/timezone_settings.h" |
-#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/notification_types.h" |
-#include "content/public/browser/render_frame_host.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/browser/web_ui.h" |
-#include "grit/browser_resources.h" |
-#include "media/audio/sounds/sounds_manager.h" |
-#include "ui/aura/window.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/compositor/layer.h" |
-#include "ui/compositor/layer_animation_observer.h" |
-#include "ui/compositor/scoped_layer_animation_settings.h" |
-#include "ui/events/event_utils.h" |
-#include "ui/gfx/rect.h" |
-#include "ui/gfx/transform.h" |
-#include "ui/keyboard/keyboard_controller.h" |
-#include "ui/views/focus/focus_manager.h" |
-#include "ui/views/widget/widget.h" |
-#include "ui/views/widget/widget_delegate.h" |
-#include "ui/wm/core/window_animations.h" |
-#include "url/gurl.h" |
- |
-namespace { |
- |
-// Maximum delay for startup sound after 'loginPromptVisible' signal. |
-const int kStartupSoundMaxDelayMs = 2000; |
- |
-// URL which corresponds to the login WebUI. |
-const char kLoginURL[] = "chrome://oobe/login"; |
- |
-// URL which corresponds to the OOBE WebUI. |
-const char kOobeURL[] = "chrome://oobe/oobe"; |
- |
-// URL which corresponds to the user adding WebUI. |
-const char kUserAddingURL[] = "chrome://oobe/user-adding"; |
- |
-// URL which corresponds to the app launch splash WebUI. |
-const char kAppLaunchSplashURL[] = "chrome://oobe/app-launch-splash"; |
- |
-// Duration of sign-in transition animation. |
-const int kLoginFadeoutTransitionDurationMs = 700; |
- |
-// Number of times we try to reload OOBE/login WebUI if it crashes. |
-const int kCrashCountLimit = 5; |
- |
-// Whether to enable tnitializing WebUI in hidden state (see |
-// |initialize_webui_hidden_|) by default. |
-const bool kHiddenWebUIInitializationDefault = true; |
- |
-// Switch values that might be used to override WebUI init type. |
-const char kWebUIInitParallel[] = "parallel"; |
-const char kWebUIInitPostpone[] = "postpone"; |
- |
-// 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) { |
- chromeos::input_method::InputMethodManager* manager = |
- chromeos::input_method::InputMethodManager::Get(); |
- std::string layout; |
- if (!oem_layout.empty()) { |
- // If the OEM layout information is provided, use it. |
- layout = oem_layout; |
- } else { |
- // 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()) { |
- std::vector<std::string> layouts; |
- base::SplitString(layout, ',', &layouts); |
- manager->MigrateXkbInputMethods(&layouts); |
- |
- PrefService* prefs = g_browser_process->local_state(); |
- prefs->SetString(prefs::kHardwareKeyboardLayout, JoinString(layouts, ",")); |
- |
- // 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(); |
- |
- manager->GetInputMethodUtil()->UpdateHardwareLayoutCache(); |
- manager->SetInputMethodLoginDefault(); |
- } |
-} |
- |
-// A class to observe an implicit animation and invokes the callback after the |
-// animation is completed. |
-class AnimationObserver : public ui::ImplicitAnimationObserver { |
- public: |
- explicit AnimationObserver(const base::Closure& callback) |
- : callback_(callback) {} |
- virtual ~AnimationObserver() {} |
- |
- private: |
- // ui::ImplicitAnimationObserver implementation: |
- virtual void OnImplicitAnimationsCompleted() OVERRIDE { |
- callback_.Run(); |
- delete this; |
- } |
- |
- base::Closure callback_; |
- |
- DISALLOW_COPY_AND_ASSIGN(AnimationObserver); |
-}; |
- |
-// ShowLoginWizard is split into two parts. This function is sometimes called |
-// from ShowLoginWizard(), and sometimes from OnLanguageSwitchedCallback() |
-// (if locale was updated). |
-void ShowLoginWizardFinish( |
- const std::string& first_screen_name, |
- const chromeos::StartupCustomizationDocument* startup_manifest, |
- chromeos::LoginDisplayHost* display_host) { |
- TRACE_EVENT0("chromeos", "ShowLoginWizard::ShowLoginWizardFinish"); |
- |
- scoped_ptr<base::DictionaryValue> params; |
- display_host->StartWizard(first_screen_name, params.Pass()); |
- |
- // 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( |
- base::UTF8ToUTF16(timezone_name)); |
- } |
-} |
- |
-struct ShowLoginWizardSwitchLanguageCallbackData { |
- explicit ShowLoginWizardSwitchLanguageCallbackData( |
- const std::string& first_screen_name, |
- const chromeos::StartupCustomizationDocument* startup_manifest, |
- chromeos::LoginDisplayHost* display_host) |
- : first_screen_name(first_screen_name), |
- startup_manifest(startup_manifest), |
- display_host(display_host) {} |
- |
- const std::string first_screen_name; |
- const chromeos::StartupCustomizationDocument* const startup_manifest; |
- chromeos::LoginDisplayHost* const display_host; |
- |
- // lock UI while resource bundle is being reloaded. |
- chromeos::InputEventsBlocker events_blocker; |
-}; |
- |
-void OnLanguageSwitchedCallback( |
- scoped_ptr<ShowLoginWizardSwitchLanguageCallbackData> self, |
- const std::string& locale, |
- const std::string& loaded_locale, |
- const bool success) { |
- if (!success) |
- LOG(WARNING) << "Locale could not be found for '" << locale << "'"; |
- |
- ShowLoginWizardFinish( |
- self->first_screen_name, self->startup_manifest, self->display_host); |
-} |
- |
-void EnableSystemSoundsForAccessibility() { |
- chromeos::AccessibilityManager::Get()->EnableSystemSounds(true); |
-} |
- |
-void AddToSetIfIsGaiaAuthIframe(std::set<content::RenderFrameHost*>* frame_set, |
- content::RenderFrameHost* frame) { |
- content::RenderFrameHost* parent = frame->GetParent(); |
- if (parent && parent->GetFrameName() == "signin-frame") |
- frame_set->insert(frame); |
-} |
- |
-// A login implementation of WidgetDelegate. |
-class LoginWidgetDelegate : public views::WidgetDelegate { |
- public: |
- explicit LoginWidgetDelegate(views::Widget* widget) : widget_(widget) { |
- } |
- virtual ~LoginWidgetDelegate() {} |
- |
- // Overridden from WidgetDelegate: |
- virtual void DeleteDelegate() OVERRIDE { |
- delete this; |
- } |
- virtual views::Widget* GetWidget() OVERRIDE { |
- return widget_; |
- } |
- virtual const views::Widget* GetWidget() const OVERRIDE { |
- return widget_; |
- } |
- virtual bool CanActivate() const OVERRIDE { |
- return true; |
- } |
- virtual bool ShouldAdvanceFocusToTopLevelWidget() const OVERRIDE { |
- return true; |
- } |
- |
- private: |
- views::Widget* widget_; |
- |
- DISALLOW_COPY_AND_ASSIGN(LoginWidgetDelegate); |
-}; |
- |
-} // namespace |
- |
-namespace chromeos { |
- |
-// static |
-LoginDisplayHost* LoginDisplayHostImpl::default_host_ = NULL; |
- |
-// static |
-const int LoginDisplayHostImpl::kShowLoginWebUIid = 0x1111; |
- |
-// static |
-content::RenderFrameHost* LoginDisplayHostImpl::GetGaiaAuthIframe( |
- content::WebContents* web_contents) { |
- std::set<content::RenderFrameHost*> frame_set; |
- web_contents->ForEachFrame( |
- base::Bind(&AddToSetIfIsGaiaAuthIframe, &frame_set)); |
- DCHECK_EQ(1U, frame_set.size()); |
- return *frame_set.begin(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// LoginDisplayHostImpl, public |
- |
-LoginDisplayHostImpl::LoginDisplayHostImpl(const gfx::Rect& background_bounds) |
- : background_bounds_(background_bounds), |
- pointer_factory_(this), |
- shutting_down_(false), |
- oobe_progress_bar_visible_(false), |
- session_starting_(false), |
- login_window_(NULL), |
- login_view_(NULL), |
- webui_login_display_(NULL), |
- is_showing_login_(false), |
- is_wallpaper_loaded_(false), |
- status_area_saved_visibility_(false), |
- crash_count_(0), |
- restore_path_(RESTORE_UNKNOWN), |
- finalize_animation_type_(ANIMATION_WORKSPACE), |
- animation_weak_ptr_factory_(this), |
- startup_sound_played_(false), |
- startup_sound_honors_spoken_feedback_(false), |
- is_observing_keyboard_(false) { |
- DBusThreadManager::Get()->GetSessionManagerClient()->AddObserver(this); |
- CrasAudioHandler::Get()->AddAudioObserver(this); |
- if (keyboard::KeyboardController::GetInstance()) { |
- keyboard::KeyboardController::GetInstance()->AddObserver(this); |
- is_observing_keyboard_ = true; |
- } |
- |
- ash::Shell::GetInstance()->delegate()->AddVirtualKeyboardStateObserver(this); |
- |
- // We need to listen to CLOSE_ALL_BROWSERS_REQUEST but not APP_TERMINATING |
- // 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::IncrementKeepAliveCount(); |
- |
- bool is_registered = StartupUtils::IsDeviceRegistered(); |
- bool zero_delay_enabled = WizardController::IsZeroDelayEnabled(); |
- bool disable_boot_animation = CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kDisableBootAnimation); |
- |
- waiting_for_wallpaper_load_ = !zero_delay_enabled && |
- (!is_registered || !disable_boot_animation); |
- |
- // For slower hardware we have boot animation disabled so |
- // we'll be initializing WebUI hidden, waiting for user pods to load and then |
- // show WebUI at once. |
- waiting_for_user_pods_ = !zero_delay_enabled && !waiting_for_wallpaper_load_; |
- |
- initialize_webui_hidden_ = |
- kHiddenWebUIInitializationDefault && !zero_delay_enabled; |
- |
- // Check if WebUI init type is overriden. |
- if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshWebUIInit)) { |
- const std::string override_type = |
- CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
- switches::kAshWebUIInit); |
- if (override_type == kWebUIInitParallel) |
- initialize_webui_hidden_ = true; |
- else if (override_type == kWebUIInitPostpone) |
- initialize_webui_hidden_ = false; |
- } |
- |
- // Always postpone WebUI initialization on first boot, otherwise we miss |
- // initial animation. |
- if (!StartupUtils::IsOobeCompleted()) |
- initialize_webui_hidden_ = false; |
- |
- // There is no wallpaper for KioskMode, don't initialize the webui hidden. |
- if (chromeos::KioskModeSettings::Get()->IsKioskModeEnabled()) |
- initialize_webui_hidden_ = false; |
- |
- if (waiting_for_wallpaper_load_) { |
- registrar_.Add(this, |
- chrome::NOTIFICATION_WALLPAPER_ANIMATION_FINISHED, |
- content::NotificationService::AllSources()); |
- } |
- |
- // When we wait for WebUI to be initialized we wait for one of |
- // these notifications. |
- if ((waiting_for_user_pods_ || waiting_for_wallpaper_load_) && |
- initialize_webui_hidden_) { |
- registrar_.Add(this, |
- chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, |
- content::NotificationService::AllSources()); |
- registrar_.Add(this, |
- chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN, |
- content::NotificationService::AllSources()); |
- } |
- LOG(WARNING) << "Login WebUI >> " |
- << "zero_delay: " << zero_delay_enabled |
- << " wait_for_wp_load_: " << waiting_for_wallpaper_load_ |
- << " wait_for_pods_: " << waiting_for_user_pods_ |
- << " init_webui_hidden_: " << initialize_webui_hidden_; |
- |
- media::SoundsManager* manager = media::SoundsManager::Get(); |
- ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); |
- manager->Initialize(chromeos::SOUND_STARTUP, |
- bundle.GetRawDataResource(IDR_SOUND_STARTUP_WAV)); |
-} |
- |
-LoginDisplayHostImpl::~LoginDisplayHostImpl() { |
- DBusThreadManager::Get()->GetSessionManagerClient()->RemoveObserver(this); |
- CrasAudioHandler::Get()->RemoveAudioObserver(this); |
- if (keyboard::KeyboardController::GetInstance() && is_observing_keyboard_) { |
- keyboard::KeyboardController::GetInstance()->RemoveObserver(this); |
- is_observing_keyboard_ = false; |
- } |
- |
- ash::Shell::GetInstance()->delegate()-> |
- RemoveVirtualKeyboardStateObserver(this); |
- |
- views::FocusManager::set_arrow_key_traversal_enabled(false); |
- ResetLoginWindowAndView(); |
- |
- // Let chrome process exit after login/oobe screen if needed. |
- chrome::DecrementKeepAliveCount(); |
- |
- default_host_ = NULL; |
- // TODO(tengs): This should be refactored. See crbug.com/314934. |
- if (UserManager::Get()->IsCurrentUserNew()) { |
- // DriveOptInController will delete itself when finished. |
- (new DriveFirstRunController( |
- ProfileManager::GetActiveUserProfile()))->EnableOfflineMode(); |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// LoginDisplayHostImpl, LoginDisplayHost implementation: |
- |
-LoginDisplay* LoginDisplayHostImpl::CreateLoginDisplay( |
- LoginDisplay::Delegate* delegate) { |
- webui_login_display_ = new WebUILoginDisplay(delegate); |
- webui_login_display_->set_background_bounds(background_bounds()); |
- return webui_login_display_; |
-} |
- |
-gfx::NativeWindow LoginDisplayHostImpl::GetNativeWindow() const { |
- return login_window_ ? login_window_->GetNativeWindow() : NULL; |
-} |
- |
-WebUILoginView* LoginDisplayHostImpl::GetWebUILoginView() const { |
- return login_view_; |
-} |
- |
-void LoginDisplayHostImpl::BeforeSessionStart() { |
- session_starting_ = true; |
-} |
- |
-void LoginDisplayHostImpl::Finalize() { |
- DVLOG(1) << "Session starting"; |
- if (ash::Shell::HasInstance()) { |
- ash::Shell::GetInstance()-> |
- desktop_background_controller()->MoveDesktopToUnlockedContainer(); |
- } |
- if (wizard_controller_.get()) |
- wizard_controller_->OnSessionStart(); |
- |
- switch (finalize_animation_type_) { |
- case ANIMATION_NONE: |
- ShutdownDisplayHost(false); |
- break; |
- case ANIMATION_WORKSPACE: |
- if (ash::Shell::HasInstance()) |
- ScheduleWorkspaceAnimation(); |
- |
- ShutdownDisplayHost(false); |
- break; |
- case ANIMATION_FADE_OUT: |
- // Display host is deleted once animation is completed |
- // since sign in screen widget has to stay alive. |
- ScheduleFadeOutAnimation(); |
- break; |
- } |
-} |
- |
-void LoginDisplayHostImpl::OnCompleteLogin() { |
- if (auto_enrollment_controller_) |
- auto_enrollment_controller_->Cancel(); |
-} |
- |
-void LoginDisplayHostImpl::OpenProxySettings() { |
- if (login_view_) |
- login_view_->OpenProxySettings(); |
-} |
- |
-void LoginDisplayHostImpl::SetStatusAreaVisible(bool visible) { |
- if (initialize_webui_hidden_) |
- status_area_saved_visibility_ = visible; |
- else if (login_view_) |
- login_view_->SetStatusAreaVisible(visible); |
-} |
- |
-AutoEnrollmentController* LoginDisplayHostImpl::GetAutoEnrollmentController() { |
- if (!auto_enrollment_controller_) { |
- auto_enrollment_controller_.reset(new AutoEnrollmentController()); |
- auto_enrollment_progress_subscription_ = |
- auto_enrollment_controller_->RegisterProgressCallback( |
- base::Bind(&LoginDisplayHostImpl::OnAutoEnrollmentProgress, |
- base::Unretained(this))); |
- } |
- return auto_enrollment_controller_.get(); |
-} |
- |
-void LoginDisplayHostImpl::StartWizard( |
- const std::string& first_screen_name, |
- scoped_ptr<base::DictionaryValue> screen_parameters) { |
- startup_sound_honors_spoken_feedback_ = true; |
- TryToPlayStartupSound(); |
- |
- // Keep parameters to restore if renderer crashes. |
- restore_path_ = RESTORE_WIZARD; |
- wizard_first_screen_name_ = first_screen_name; |
- if (screen_parameters.get()) |
- wizard_screen_parameters_.reset(screen_parameters->DeepCopy()); |
- else |
- wizard_screen_parameters_.reset(); |
- is_showing_login_ = false; |
- |
- if (waiting_for_wallpaper_load_ && !initialize_webui_hidden_) { |
- LOG(WARNING) << "Login WebUI >> wizard postponed"; |
- return; |
- } |
- LOG(WARNING) << "Login WebUI >> wizard"; |
- |
- if (!login_window_) |
- LoadURL(GURL(kOobeURL)); |
- |
- 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_ = !StartupUtils::IsDeviceRegistered(); |
- SetOobeProgressBarVisible(oobe_progress_bar_visible_); |
- wizard_controller_->Init(first_screen_name, screen_parameters.Pass()); |
-} |
- |
-WizardController* LoginDisplayHostImpl::GetWizardController() { |
- return wizard_controller_.get(); |
-} |
- |
-AppLaunchController* LoginDisplayHostImpl::GetAppLaunchController() { |
- return app_launch_controller_.get(); |
-} |
- |
-void LoginDisplayHostImpl::StartUserAdding( |
- const base::Closure& completion_callback) { |
- restore_path_ = RESTORE_ADD_USER_INTO_SESSION; |
- completion_callback_ = completion_callback; |
- finalize_animation_type_ = ANIMATION_NONE; |
- LOG(WARNING) << "Login WebUI >> user adding"; |
- if (!login_window_) |
- LoadURL(GURL(kUserAddingURL)); |
- // We should emit this signal only at login screen (after reboot or sign out). |
- login_view_->set_should_emit_login_prompt_visible(false); |
- |
- // Lock container can be transparent after lock screen animation. |
- aura::Window* lock_container = ash::Shell::GetContainer( |
- ash::Shell::GetPrimaryRootWindow(), |
- ash::kShellWindowId_LockScreenContainersContainer); |
- lock_container->layer()->SetOpacity(1.0); |
- |
- ash::Shell::GetInstance()-> |
- desktop_background_controller()->MoveDesktopToLockedContainer(); |
- |
- sign_in_controller_.reset(); // Only one controller in a time. |
- sign_in_controller_.reset(new chromeos::ExistingUserController(this)); |
- SetOobeProgressBarVisible(oobe_progress_bar_visible_ = false); |
- SetStatusAreaVisible(true); |
- sign_in_controller_->Init( |
- chromeos::UserManager::Get()->GetUsersAdmittedForMultiProfile()); |
- CHECK(webui_login_display_); |
- GetOobeUI()->ShowSigninScreen(LoginScreenContext(), |
- webui_login_display_, |
- webui_login_display_); |
-} |
- |
-void LoginDisplayHostImpl::StartSignInScreen( |
- const LoginScreenContext& context) { |
- startup_sound_honors_spoken_feedback_ = true; |
- TryToPlayStartupSound(); |
- |
- restore_path_ = RESTORE_SIGN_IN; |
- is_showing_login_ = true; |
- finalize_animation_type_ = ANIMATION_WORKSPACE; |
- |
- PrewarmAuthentication(); |
- |
- if (waiting_for_wallpaper_load_ && !initialize_webui_hidden_) { |
- LOG(WARNING) << "Login WebUI >> sign in postponed"; |
- return; |
- } |
- LOG(WARNING) << "Login WebUI >> sign in"; |
- |
- if (!login_window_) { |
- TRACE_EVENT_ASYNC_BEGIN0("ui", "ShowLoginWebUI", kShowLoginWebUIid); |
- TRACE_EVENT_ASYNC_STEP_INTO0( |
- "ui", "ShowLoginWebUI", kShowLoginWebUIid, "StartSignInScreen"); |
- BootTimesLoader::Get()->RecordCurrentStats("login-start-signin-screen"); |
- LoadURL(GURL(kLoginURL)); |
- } |
- |
- 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 (!StartupUtils::IsDeviceRegistered() && !users.empty()) { |
- VLOG(1) << "Mark device registered because there are remembered users: " |
- << users.size(); |
- StartupUtils::MarkDeviceRegistered(); |
- } |
- |
- sign_in_controller_.reset(); // Only one controller in a time. |
- sign_in_controller_.reset(new chromeos::ExistingUserController(this)); |
- oobe_progress_bar_visible_ = !StartupUtils::IsDeviceRegistered(); |
- SetOobeProgressBarVisible(oobe_progress_bar_visible_); |
- SetStatusAreaVisible(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. |
- if (GetAutoEnrollmentController()->ShouldEnrollSilently()) |
- sign_in_controller_->DoAutoEnrollment(); |
- else |
- GetAutoEnrollmentController()->Start(); |
- |
- // Initiate mobile config load. |
- MobileConfig::GetInstance(); |
- |
- // Initiate device policy fetching. |
- policy::BrowserPolicyConnectorChromeOS* connector = |
- g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
- connector->ScheduleServiceInitialization( |
- kPolicyServiceInitializationDelayMilliseconds); |
- |
- CHECK(webui_login_display_); |
- GetOobeUI()->ShowSigninScreen(context, |
- webui_login_display_, |
- webui_login_display_); |
- if (chromeos::KioskModeSettings::Get()->IsKioskModeEnabled()) |
- SetStatusAreaVisible(false); |
- TRACE_EVENT_ASYNC_STEP_INTO0("ui", |
- "ShowLoginWebUI", |
- kShowLoginWebUIid, |
- "WaitForScreenStateInitialize"); |
- BootTimesLoader::Get()->RecordCurrentStats( |
- "login-wait-for-signin-state-initialize"); |
-} |
- |
-void LoginDisplayHostImpl::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); |
- sign_in_controller_->ResumeLogin(); |
-} |
- |
- |
-void LoginDisplayHostImpl::OnPreferencesChanged() { |
- if (is_showing_login_) |
- webui_login_display_->OnPreferencesChanged(); |
-} |
- |
-void LoginDisplayHostImpl::PrewarmAuthentication() { |
- auth_prewarmer_.reset(new AuthPrewarmer()); |
- auth_prewarmer_->PrewarmAuthentication( |
- base::Bind(&LoginDisplayHostImpl::OnAuthPrewarmDone, |
- pointer_factory_.GetWeakPtr())); |
-} |
- |
-void LoginDisplayHostImpl::StartDemoAppLaunch() { |
- LOG(WARNING) << "Login WebUI >> starting demo app."; |
- SetStatusAreaVisible(false); |
- |
- demo_app_launcher_.reset(new DemoAppLauncher()); |
- demo_app_launcher_->StartDemoAppLaunch(); |
-} |
- |
-void LoginDisplayHostImpl::StartAppLaunch(const std::string& app_id, |
- bool diagnostic_mode) { |
- LOG(WARNING) << "Login WebUI >> start app launch."; |
- SetStatusAreaVisible(false); |
- finalize_animation_type_ = ANIMATION_FADE_OUT; |
- if (!login_window_) |
- LoadURL(GURL(kAppLaunchSplashURL)); |
- |
- login_view_->set_should_emit_login_prompt_visible(false); |
- |
- app_launch_controller_.reset(new AppLaunchController( |
- app_id, diagnostic_mode, this, GetOobeUI())); |
- |
- app_launch_controller_->StartAppLaunch(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// LoginDisplayHostImpl, public |
- |
-WizardController* LoginDisplayHostImpl::CreateWizardController() { |
- // TODO(altimofeev): ensure that WebUI is ready. |
- OobeDisplay* oobe_display = GetOobeUI(); |
- return new WizardController(this, oobe_display); |
-} |
- |
-void LoginDisplayHostImpl::OnBrowserCreated() { |
- // Close lock window now so that the launched browser can receive focus. |
- ResetLoginWindowAndView(); |
-} |
- |
-OobeUI* LoginDisplayHostImpl::GetOobeUI() const { |
- if (!login_view_) |
- return NULL; |
- return static_cast<OobeUI*>(login_view_->GetWebUI()->GetController()); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// LoginDisplayHostImpl, content:NotificationObserver implementation: |
- |
-void LoginDisplayHostImpl::Observe( |
- int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- if (chrome::NOTIFICATION_WALLPAPER_ANIMATION_FINISHED == type) { |
- LOG(WARNING) << "Login WebUI >> wp animation done"; |
- is_wallpaper_loaded_ = true; |
- ash::Shell::GetInstance()->user_wallpaper_delegate() |
- ->OnWallpaperBootAnimationFinished(); |
- if (waiting_for_wallpaper_load_) { |
- // StartWizard / StartSignInScreen could be called multiple times through |
- // the lifetime of host. |
- // Make sure that subsequent calls are not postponed. |
- waiting_for_wallpaper_load_ = false; |
- if (initialize_webui_hidden_) |
- ShowWebUI(); |
- else |
- StartPostponedWebUI(); |
- } |
- registrar_.Remove(this, |
- chrome::NOTIFICATION_WALLPAPER_ANIMATION_FINISHED, |
- content::NotificationService::AllSources()); |
- } else if (chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE == type || |
- chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN == type) { |
- LOG(WARNING) << "Login WebUI >> WEBUI_VISIBLE"; |
- if (waiting_for_user_pods_ && initialize_webui_hidden_) { |
- waiting_for_user_pods_ = false; |
- ShowWebUI(); |
- } else if (waiting_for_wallpaper_load_ && initialize_webui_hidden_) { |
- // Reduce time till login UI is shown - show it as soon as possible. |
- waiting_for_wallpaper_load_ = false; |
- ShowWebUI(); |
- } |
- registrar_.Remove(this, |
- chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, |
- content::NotificationService::AllSources()); |
- registrar_.Remove(this, |
- chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN, |
- content::NotificationService::AllSources()); |
- } else 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()); |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// LoginDisplayHostImpl, WebContentsObserver implementation: |
- |
-void LoginDisplayHostImpl::RenderProcessGone(base::TerminationStatus status) { |
- // Do not try to restore on shutdown |
- if (browser_shutdown::GetShutdownType() != browser_shutdown::NOT_VALID) |
- return; |
- |
- crash_count_++; |
- if (crash_count_ > kCrashCountLimit) |
- return; |
- |
- if (status != base::TERMINATION_STATUS_NORMAL_TERMINATION) { |
- // Render with login screen crashed. Let's crash browser process to let |
- // session manager restart it properly. It is hard to reload the page |
- // and get to controlled state that is fully functional. |
- // If you see check, search for renderer crash for the same client. |
- LOG(FATAL) << "Renderer crash on login window"; |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// LoginDisplayHostImpl, chromeos::SessionManagerClient::Observer |
-// implementation: |
- |
-void LoginDisplayHostImpl::EmitLoginPromptVisibleCalled() { |
- OnLoginPromptVisible(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// LoginDisplayHostImpl, chromeos::CrasAudioHandler::AudioObserver |
-// implementation: |
- |
-void LoginDisplayHostImpl::OnActiveOutputNodeChanged() { |
- TryToPlayStartupSound(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// LoginDisplayHostImpl, ash::KeyboardStateObserver: |
-// implementation: |
- |
-void LoginDisplayHostImpl::OnVirtualKeyboardStateChanged(bool activated) { |
- if (keyboard::KeyboardController::GetInstance()) { |
- if (activated) { |
- if (!is_observing_keyboard_) { |
- keyboard::KeyboardController::GetInstance()->AddObserver(this); |
- is_observing_keyboard_ = true; |
- } |
- } else { |
- keyboard::KeyboardController::GetInstance()->RemoveObserver(this); |
- is_observing_keyboard_ = false; |
- } |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// LoginDisplayHostImpl, keyboard::KeyboardControllerObserver: |
-// implementation: |
- |
-void LoginDisplayHostImpl::OnKeyboardBoundsChanging( |
- const gfx::Rect& new_bounds) { |
- if (new_bounds.IsEmpty() && !keyboard_bounds_.IsEmpty()) { |
- // Keyboard has been hidden. |
- if (webui_login_display_) |
- webui_login_display_->ShowControlBar(true); |
- } else if (!new_bounds.IsEmpty() && keyboard_bounds_.IsEmpty()) { |
- // Keyboard has been shown. |
- if (webui_login_display_) |
- webui_login_display_->ShowControlBar(false); |
- } |
- |
- keyboard_bounds_ = new_bounds; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// LoginDisplayHostImpl, private |
- |
-void LoginDisplayHostImpl::ShutdownDisplayHost(bool post_quit_task) { |
- if (shutting_down_) |
- return; |
- |
- shutting_down_ = true; |
- registrar_.RemoveAll(); |
- base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
- if (post_quit_task) |
- base::MessageLoop::current()->Quit(); |
- |
- if (!completion_callback_.is_null()) |
- completion_callback_.Run(); |
-} |
- |
-void LoginDisplayHostImpl::ScheduleWorkspaceAnimation() { |
- if (ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), |
- ash::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 LoginDisplayHostImpl::ScheduleFadeOutAnimation() { |
- ui::Layer* layer = login_window_->GetLayer(); |
- ui::ScopedLayerAnimationSettings animation(layer->GetAnimator()); |
- animation.AddObserver(new AnimationObserver( |
- base::Bind(&LoginDisplayHostImpl::ShutdownDisplayHost, |
- animation_weak_ptr_factory_.GetWeakPtr(), |
- false))); |
- layer->SetOpacity(0); |
-} |
- |
-void LoginDisplayHostImpl::OnAutoEnrollmentProgress( |
- policy::AutoEnrollmentState state) { |
- VLOG(1) << "OnAutoEnrollmentProgress, state " << state; |
- |
- if (sign_in_controller_ && |
- auto_enrollment_controller_->ShouldEnrollSilently()) { |
- sign_in_controller_->DoAutoEnrollment(); |
- } |
-} |
- |
-void LoginDisplayHostImpl::LoadURL(const GURL& url) { |
- InitLoginWindowAndView(); |
- // Subscribe to crash events. |
- content::WebContentsObserver::Observe(login_view_->GetWebContents()); |
- login_view_->LoadURL(url); |
- |
- // LoadURL could be called after the spring charger dialog shows, and |
- // take away the focus from it. Set the focus back to the charger dialog |
- // if it is visible. |
- // See crbug.com/328538. |
- ChargerReplacementDialog::SetFocusOnChargerDialogIfVisible(); |
-} |
- |
-void LoginDisplayHostImpl::ShowWebUI() { |
- if (!login_window_ || !login_view_) { |
- NOTREACHED(); |
- return; |
- } |
- LOG(WARNING) << "Login WebUI >> Show already initialized UI"; |
- login_window_->Show(); |
- login_view_->GetWebContents()->Focus(); |
- login_view_->SetStatusAreaVisible(status_area_saved_visibility_); |
- login_view_->OnPostponedShow(); |
- |
- // Login window could be shown after the spring charger dialog shows, and |
- // take away the focus from it. Set the focus back to the charger dialog |
- // if it is visible. |
- // See crbug.com/328538. |
- ChargerReplacementDialog::SetFocusOnChargerDialogIfVisible(); |
- |
- // We should reset this flag to allow changing of status area visibility. |
- initialize_webui_hidden_ = false; |
-} |
- |
-void LoginDisplayHostImpl::StartPostponedWebUI() { |
- if (!is_wallpaper_loaded_) { |
- NOTREACHED(); |
- return; |
- } |
- LOG(WARNING) << "Login WebUI >> Init postponed WebUI"; |
- |
- // Wallpaper has finished loading before StartWizard/StartSignInScreen has |
- // been called. In general this should not happen. |
- // Let go through normal code path when one of those will be called. |
- if (restore_path_ == RESTORE_UNKNOWN) { |
- NOTREACHED(); |
- return; |
- } |
- |
- switch (restore_path_) { |
- case RESTORE_WIZARD: |
- StartWizard(wizard_first_screen_name_, |
- wizard_screen_parameters_.Pass()); |
- break; |
- case RESTORE_SIGN_IN: |
- StartSignInScreen(LoginScreenContext()); |
- break; |
- case RESTORE_ADD_USER_INTO_SESSION: |
- StartUserAdding(completion_callback_); |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
-} |
- |
-void LoginDisplayHostImpl::InitLoginWindowAndView() { |
- if (login_window_) |
- return; |
- |
- if (system::InputDeviceSettings::Get()->ForceKeyboardDrivenUINavigation()) { |
- views::FocusManager::set_arrow_key_traversal_enabled(true); |
- |
- focus_ring_controller_.reset(new FocusRingController); |
- focus_ring_controller_->SetVisible(true); |
- |
- keyboard_driven_oobe_key_handler_.reset(new KeyboardDrivenOobeKeyHandler); |
- } |
- |
- views::Widget::InitParams params( |
- views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
- params.bounds = background_bounds(); |
- params.show_state = ui::SHOW_STATE_MAXIMIZED; |
- params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
- params.parent = |
- ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), |
- ash::kShellWindowId_LockScreenContainer); |
- |
- login_window_ = new views::Widget; |
- params.delegate = new LoginWidgetDelegate(login_window_); |
- login_window_->Init(params); |
- |
- login_view_ = new WebUILoginView(); |
- login_view_->Init(); |
- if (login_view_->webui_visible()) |
- OnLoginPromptVisible(); |
- |
- wm::SetWindowVisibilityAnimationDuration( |
- login_window_->GetNativeView(), |
- base::TimeDelta::FromMilliseconds(kLoginFadeoutTransitionDurationMs)); |
- wm::SetWindowVisibilityAnimationTransition( |
- login_window_->GetNativeView(), |
- wm::ANIMATE_HIDE); |
- |
- login_window_->SetContentsView(login_view_); |
- |
- // If WebUI is initialized in hidden state, show it only if we're no |
- // longer waiting for wallpaper animation/user images loading. Otherwise, |
- // always show it. |
- if (!initialize_webui_hidden_ || |
- (!waiting_for_wallpaper_load_ && !waiting_for_user_pods_)) { |
- LOG(WARNING) << "Login WebUI >> show login wnd on create"; |
- login_window_->Show(); |
- } else { |
- LOG(WARNING) << "Login WebUI >> login wnd is hidden on create"; |
- login_view_->set_is_hidden(true); |
- } |
- login_window_->GetNativeView()->SetName("WebUILoginView"); |
-} |
- |
-void LoginDisplayHostImpl::ResetLoginWindowAndView() { |
- if (!login_window_) |
- return; |
- login_window_->Close(); |
- login_window_ = NULL; |
- login_view_ = NULL; |
-} |
- |
-void LoginDisplayHostImpl::OnAuthPrewarmDone() { |
- auth_prewarmer_.reset(); |
-} |
- |
-void LoginDisplayHostImpl::SetOobeProgressBarVisible(bool visible) { |
- GetOobeUI()->ShowOobeUI(visible); |
-} |
- |
-void LoginDisplayHostImpl::TryToPlayStartupSound() { |
- if (startup_sound_played_ || login_prompt_visible_time_.is_null() || |
- !CrasAudioHandler::Get()->GetActiveOutputNode()) { |
- return; |
- } |
- |
- startup_sound_played_ = true; |
- |
- // Don't try play startup sound if login prompt is already visible |
- // for a long time or can't be played. |
- if (base::TimeTicks::Now() - login_prompt_visible_time_ > |
- base::TimeDelta::FromMilliseconds(kStartupSoundMaxDelayMs)) { |
- EnableSystemSoundsForAccessibility(); |
- return; |
- } |
- |
- if (!startup_sound_honors_spoken_feedback_ && |
- !ash::PlaySystemSoundAlways(SOUND_STARTUP)) { |
- EnableSystemSoundsForAccessibility(); |
- return; |
- } |
- |
- if (startup_sound_honors_spoken_feedback_ && |
- !ash::PlaySystemSoundIfSpokenFeedback(SOUND_STARTUP)) { |
- EnableSystemSoundsForAccessibility(); |
- return; |
- } |
- |
- base::MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&EnableSystemSoundsForAccessibility), |
- media::SoundsManager::Get()->GetDuration(SOUND_STARTUP)); |
-} |
- |
-void LoginDisplayHostImpl::OnLoginPromptVisible() { |
- if (!login_prompt_visible_time_.is_null()) |
- return; |
- login_prompt_visible_time_ = base::TimeTicks::Now(); |
- TryToPlayStartupSound(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// external |
- |
-// 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) { |
- if (browser_shutdown::IsTryingToQuit()) |
- return; |
- |
- VLOG(1) << "Showing OOBE screen: " << first_screen_name; |
- |
- chromeos::input_method::InputMethodManager* manager = |
- chromeos::input_method::InputMethodManager::Get(); |
- |
- // 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()) { |
- manager->SetInputMethodLoginDefault(); |
- |
- PrefService* prefs = g_browser_process->local_state(); |
- // Apply owner preferences for tap-to-click and mouse buttons swap for |
- // login screen. |
- system::InputDeviceSettings::Get()->SetPrimaryButtonRight( |
- prefs->GetBoolean(prefs::kOwnerPrimaryMouseButtonRight)); |
- system::InputDeviceSettings::Get()->SetTapToClick( |
- prefs->GetBoolean(prefs::kOwnerTapToClickEnabled)); |
- } |
- system::InputDeviceSettings::Get()->SetNaturalScroll( |
- CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kNaturalScrollDefault)); |
- |
- gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(gfx::Size())); |
- |
- // Check whether we need to execute OOBE process. |
- bool oobe_complete = chromeos::StartupUtils::IsOobeCompleted(); |
- if (!oobe_complete) { |
- LoginState::Get()->SetLoggedInState( |
- LoginState::LOGGED_IN_OOBE, LoginState::LOGGED_IN_USER_NONE); |
- } else { |
- LoginState::Get()->SetLoggedInState( |
- LoginState::LOGGED_IN_NONE, LoginState::LOGGED_IN_USER_NONE); |
- } |
- |
- LoginDisplayHost* display_host = new LoginDisplayHostImpl(screen_bounds); |
- |
- bool show_app_launch_splash_screen = (first_screen_name == |
- chromeos::WizardController::kAppLaunchSplashScreenName); |
- if (show_app_launch_splash_screen) { |
- const std::string& auto_launch_app_id = |
- chromeos::KioskAppManager::Get()->GetAutoLaunchApp(); |
- display_host->StartAppLaunch(auto_launch_app_id, |
- false /* diagnostic_mode */); |
- return; |
- } |
- |
- policy::BrowserPolicyConnectorChromeOS* connector = |
- g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
- bool should_show_enrollment_screen = |
- first_screen_name.empty() && oobe_complete && |
- chromeos::WizardController::ShouldAutoStartEnrollment() && |
- !connector->IsEnterpriseManaged(); |
- if (should_show_enrollment_screen) { |
- // Shows networks screen instead of enrollment screen to resume the |
- // interrupted auto start enrollment flow because enrollment screen does |
- // not handle flaky network. See http://crbug.com/332572 |
- display_host->StartWizard(chromeos::WizardController::kNetworkScreenName, |
- scoped_ptr<base::DictionaryValue>()); |
- return; |
- } |
- |
- if (StartupUtils::IsEulaAccepted()) { |
- DelayNetworkCall( |
- ServicesCustomizationDocument::GetInstance() |
- ->EnsureCustomizationAppliedClosure(), |
- base::TimeDelta::FromMilliseconds(kDefaultNetworkRetryDelayMS)); |
- } |
- |
- bool show_login_screen = |
- (first_screen_name.empty() && oobe_complete) || |
- first_screen_name == chromeos::WizardController::kLoginScreenName; |
- |
- 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::StartupUtils::GetInitialLocale(); |
- prefs->SetString(prefs::kApplicationLocale, locale); |
- manager->EnableLoginLayouts( |
- locale, |
- manager->GetInputMethodUtil()->GetHardwareInputMethodIds()); |
- base::ThreadRestrictions::ScopedAllowIO allow_io; |
- const std::string loaded_locale = |
- ResourceBundle::GetSharedInstance().ReloadLocaleResources(locale); |
- g_browser_process->SetApplicationLocale(loaded_locale); |
- } |
- display_host->StartSignInScreen(LoginScreenContext()); |
- 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 = startup_manifest->initial_locale_default(); |
- |
- std::string layout = startup_manifest->keyboard_layout(); |
- VLOG(1) << "Initial locale: " << locale << "keyboard layout " << layout; |
- |
- // Determine keyboard layout from OEM customization (if provided) or |
- // initial locale and save it in preferences. |
- DetermineAndSaveHardwareKeyboard(locale, layout); |
- |
- if (!current_locale.empty() || locale.empty()) { |
- ShowLoginWizardFinish(first_screen_name, startup_manifest, display_host); |
- return; |
- } |
- |
- // 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::StartupUtils::SetInitialLocale(locale); |
- |
- scoped_ptr<ShowLoginWizardSwitchLanguageCallbackData> data( |
- new ShowLoginWizardSwitchLanguageCallbackData( |
- first_screen_name, startup_manifest, display_host)); |
- |
- scoped_ptr<locale_util::SwitchLanguageCallback> callback( |
- new locale_util::SwitchLanguageCallback( |
- base::Bind(&OnLanguageSwitchedCallback, base::Passed(data.Pass())))); |
- |
- // Load locale keyboards here. Hardware layout would be automatically enabled. |
- locale_util::SwitchLanguage( |
- locale, true, true /* login_layouts_only */, callback.Pass()); |
-} |
- |
-} // namespace chromeos |