1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/audio/sounds.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/desktop_background/user_wallpaper_delegate.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell_window_ids.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/debug/trace_event.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/prefs/pref_service.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/string_split.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/thread_restrictions.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/browser_process.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/browser_shutdown.h" 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/accessibility/accessibility_manager.h" 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/base/locale_util.h" 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/boot_times_loader.h" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/charger_replace/charger_replacement_dialog.h" 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/first_run/drive_first_run_controller.h" 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/first_run/first_run.h" 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_util.h" 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h" 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/language_preferences.h" 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/login/demo_mode/demo_app_launcher.h" 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/existing_user_controller.h" 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/helper.h" 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/login_utils.h" 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/login_wizard.h" 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/screens/core_oobe_actor.h" 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/startup_utils.h" 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/input_events_blocker.h" 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/keyboard_driven_oobe_key_handler.h" 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/oobe_display.h" 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/webui_login_display.h" 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/webui_login_view.h" 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/wizard_controller.h" 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/mobile_config.h" 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/net/delay_network_call.h" 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/policy/auto_enrollment_client.h" 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/chromeos/system/input_device_settings.h" 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/chromeos/ui/focus_ring_controller.h" 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_constants.h" 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/pref_names.h" 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/browser_resources.h" 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/audio/chromeos_sounds.h" 64a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/chromeos_constants.h" 65b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/session_manager_client.h" 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/ime/extension_ime_util.h" 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h" 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/login/login_state.h" 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/settings/timezone_settings.h" 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/session_manager/core/session_manager.h" 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h" 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_service.h" 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_types.h" 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents.h" 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_ui.h" 780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "media/audio/sounds/sounds_manager.h" 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/window.h" 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/base/ui_base_switches_util.h" 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/compositor/layer.h" 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/compositor/layer_animation_observer.h" 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h" 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/display.h" 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/rect.h" 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/screen.h" 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/size.h" 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/transform.h" 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/keyboard/keyboard_controller.h" 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/keyboard/keyboard_util.h" 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/focus/focus_manager.h" 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/widget/widget.h" 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/widget/widget_delegate.h" 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/window_animations.h" 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_ATHENA) 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/screen/public/screen_manager.h" 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/util/container_priorities.h" 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Maximum delay for startup sound after 'loginPromptVisible' signal. 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const int kStartupSoundMaxDelayMs = 2000; 1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// URL which corresponds to the login WebUI. 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kLoginURL[] = "chrome://oobe/login"; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// URL which corresponds to the OOBE WebUI. 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kOobeURL[] = "chrome://oobe/oobe"; 114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// URL which corresponds to the user adding WebUI. 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kUserAddingURL[] = "chrome://oobe/user-adding"; 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// URL which corresponds to the app launch splash WebUI. 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kAppLaunchSplashURL[] = "chrome://oobe/app-launch-splash"; 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Duration of sign-in transition animation. 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kLoginFadeoutTransitionDurationMs = 700; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Number of times we try to reload OOBE/login WebUI if it crashes. 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kCrashCountLimit = 5; 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Whether to enable tnitializing WebUI in hidden state (see 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |initialize_webui_hidden_|) by default. 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const bool kHiddenWebUIInitializationDefault = true; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Switch values that might be used to override WebUI init type. 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kWebUIInitParallel[] = "parallel"; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kWebUIInitPostpone[] = "postpone"; 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The delay of triggering initialization of the device policy subsystem 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// after the login screen is initialized. This makes sure that device policy 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// network requests are made while the system is idle waiting for user input. 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int64 kPolicyServiceInitializationDelayMilliseconds = 100; 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// A class to observe an implicit animation and invokes the callback after the 1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// animation is completed. 1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class AnimationObserver : public ui::ImplicitAnimationObserver { 1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) explicit AnimationObserver(const base::Closure& callback) 1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : callback_(callback) {} 1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual ~AnimationObserver() {} 1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private: 1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // ui::ImplicitAnimationObserver implementation: 1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void OnImplicitAnimationsCompleted() OVERRIDE { 1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) callback_.Run(); 1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delete this; 1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Closure callback_; 1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AnimationObserver); 1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// ShowLoginWizard is split into two parts. This function is sometimes called 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// from ShowLoginWizard(), and sometimes from OnLanguageSwitchedCallback() 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// (if locale was updated). 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ShowLoginWizardFinish( 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& first_screen_name, 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const chromeos::StartupCustomizationDocument* startup_manifest, 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chromeos::LoginDisplayHost* display_host) { 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TRACE_EVENT0("chromeos", "ShowLoginWizard::ShowLoginWizardFinish"); 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> params; 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) display_host->StartWizard(first_screen_name, params.Pass()); 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Set initial timezone if specified by customization. 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string timezone_name = startup_manifest->initial_timezone(); 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) VLOG(1) << "Initial time zone: " << timezone_name; 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Apply locale customizations only once to preserve whatever locale 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // user has changed to during OOBE. 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!timezone_name.empty()) { 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chromeos::system::TimezoneSettings::GetInstance()->SetTimezoneFromID( 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(timezone_name)); 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct ShowLoginWizardSwitchLanguageCallbackData { 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) explicit ShowLoginWizardSwitchLanguageCallbackData( 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& first_screen_name, 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const chromeos::StartupCustomizationDocument* startup_manifest, 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chromeos::LoginDisplayHost* display_host) 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : first_screen_name(first_screen_name), 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) startup_manifest(startup_manifest), 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_host(display_host) {} 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string first_screen_name; 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const chromeos::StartupCustomizationDocument* const startup_manifest; 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chromeos::LoginDisplayHost* const display_host; 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // lock UI while resource bundle is being reloaded. 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chromeos::InputEventsBlocker events_blocker; 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void OnLanguageSwitchedCallback( 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<ShowLoginWizardSwitchLanguageCallbackData> self, 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& locale, 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& loaded_locale, 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const bool success) { 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!success) 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LOG(WARNING) << "Locale could not be found for '" << locale << "'"; 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ShowLoginWizardFinish( 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self->first_screen_name, self->startup_manifest, self->display_host); 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EnableSystemSoundsForAccessibility() { 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chromeos::AccessibilityManager::Get()->EnableSystemSounds(true); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// A login implementation of WidgetDelegate. 217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass LoginWidgetDelegate : public views::WidgetDelegate { 218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch explicit LoginWidgetDelegate(views::Widget* widget) : widget_(widget) { 220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~LoginWidgetDelegate() {} 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Overridden from WidgetDelegate: 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void DeleteDelegate() OVERRIDE { 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch delete this; 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual views::Widget* GetWidget() OVERRIDE { 228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return widget_; 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual const views::Widget* GetWidget() const OVERRIDE { 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return widget_; 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool CanActivate() const OVERRIDE { 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool ShouldAdvanceFocusToTopLevelWidget() const OVERRIDE { 237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return true; 238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch views::Widget* widget_; 242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DISALLOW_COPY_AND_ASSIGN(LoginWidgetDelegate); 244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Disables virtual keyboard overscroll. Login UI will scroll user pods 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// into view on JS side when virtual keyboard is shown. 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void DisableKeyboardOverscroll() { 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::SetKeyboardOverscrollOverride( 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::KEYBOARD_OVERSCROLL_OVERRIDE_DISABLED); 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ResetKeyboardOverscrollOverride() { 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::SetKeyboardOverscrollOverride( 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::KEYBOARD_OVERSCROLL_OVERRIDE_NONE); 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos { 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoginDisplayHost* LoginDisplayHostImpl::default_host_ = NULL; 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// static 266ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst int LoginDisplayHostImpl::kShowLoginWebUIid = 0x1111; 267ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// LoginDisplayHostImpl, public 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoginDisplayHostImpl::LoginDisplayHostImpl(const gfx::Rect& background_bounds) 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : background_bounds_(background_bounds), 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pointer_factory_(this), 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shutting_down_(false), 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oobe_progress_bar_visible_(false), 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_starting_(false), 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_window_(NULL), 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_view_(NULL), 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webui_login_display_(NULL), 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_showing_login_(false), 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_wallpaper_loaded_(false), 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status_area_saved_visibility_(false), 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crash_count_(0), 2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) restore_path_(RESTORE_UNKNOWN), 2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) finalize_animation_type_(ANIMATION_WORKSPACE), 2860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) startup_sound_played_(false), 287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch startup_sound_honors_spoken_feedback_(false), 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_observing_keyboard_(false), 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci animation_weak_ptr_factory_(this) { 2900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DBusThreadManager::Get()->GetSessionManagerClient()->AddObserver(this); 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CrasAudioHandler::Get()->AddAudioObserver(this); 292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (keyboard::KeyboardController::GetInstance()) { 293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch keyboard::KeyboardController::GetInstance()->AddObserver(this); 294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch is_observing_keyboard_ = true; 295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA) 298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::Shell::GetInstance()->delegate()->AddVirtualKeyboardStateObserver(this); 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ash::Shell::GetScreen()->AddObserver(this); 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 3010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // We need to listen to CLOSE_ALL_BROWSERS_REQUEST but not APP_TERMINATING 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // because/ APP_TERMINATING will never be fired as long as this keeps 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ref-count. CLOSE_ALL_BROWSERS_REQUEST is safe here because there will be no 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // browser instance that will block the shutdown. 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST, 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // NOTIFICATION_BROWSER_OPENED is issued after browser is created, but 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // not shown yet. Lock window has to be closed at this point so that 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a browser window exists and the window can acquire input focus. 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NOTIFICATION_BROWSER_OPENED, 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Login screen is moved to lock screen container when user logs in. 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NOTIFICATION_LOGIN_USER_CHANGED, 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(default_host_ == NULL); 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default_host_ = this; 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure chrome won't exit while we are at login/oobe screen. 326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::IncrementKeepAliveCount(); 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_registered = StartupUtils::IsDeviceRegistered(); 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool zero_delay_enabled = WizardController::IsZeroDelayEnabled(); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool disable_boot_animation = CommandLine::ForCurrentProcess()->HasSwitch( 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switches::kDisableBootAnimation); 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) waiting_for_wallpaper_load_ = !zero_delay_enabled && 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (!is_registered || !disable_boot_animation); 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_ATHENA) 3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(dpolukhin): remove #ifdef when Athena supports wallpaper manager. 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // crbug.com/408734 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci waiting_for_wallpaper_load_ = false; 3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For slower hardware we have boot animation disabled so 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // we'll be initializing WebUI hidden, waiting for user pods to load and then 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // show WebUI at once. 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_user_pods_ = !zero_delay_enabled && !waiting_for_wallpaper_load_; 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initialize_webui_hidden_ = 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kHiddenWebUIInitializationDefault && !zero_delay_enabled; 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check if WebUI init type is overriden. 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshWebUIInit)) { 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string override_type = 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switches::kAshWebUIInit); 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (override_type == kWebUIInitParallel) 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initialize_webui_hidden_ = true; 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (override_type == kWebUIInitPostpone) 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initialize_webui_hidden_ = false; 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Always postpone WebUI initialization on first boot, otherwise we miss 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // initial animation. 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!StartupUtils::IsOobeCompleted()) 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initialize_webui_hidden_ = false; 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // There is no wallpaper for KioskMode, don't initialize the webui hidden. 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chromeos::KioskModeSettings::Get()->IsKioskModeEnabled()) 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initialize_webui_hidden_ = false; 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (waiting_for_wallpaper_load_) { 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_.Add(this, 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_WALLPAPER_ANIMATION_FINISHED, 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // When we wait for WebUI to be initialized we wait for one of 37790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // these notifications. 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if ((waiting_for_user_pods_ || waiting_for_wallpaper_load_) && 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) initialize_webui_hidden_) { 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_.Add(this, 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registrar_.Add(this, 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN, 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> " 388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << "zero_delay: " << zero_delay_enabled 389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << " wait_for_wp_load_: " << waiting_for_wallpaper_load_ 390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << " wait_for_pods_: " << waiting_for_user_pods_ 391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << " init_webui_hidden_: " << initialize_webui_hidden_; 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::SoundsManager* manager = media::SoundsManager::Get(); 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager->Initialize(chromeos::SOUND_STARTUP, 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bundle.GetRawDataResource(IDR_SOUND_STARTUP_WAV)); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoginDisplayHostImpl::~LoginDisplayHostImpl() { 4000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DBusThreadManager::Get()->GetSessionManagerClient()->RemoveObserver(this); 401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CrasAudioHandler::Get()->RemoveAudioObserver(this); 402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (keyboard::KeyboardController::GetInstance() && is_observing_keyboard_) { 403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch keyboard::KeyboardController::GetInstance()->RemoveObserver(this); 404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch is_observing_keyboard_ = false; 405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA) 408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::Shell::GetInstance()->delegate()-> 409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RemoveVirtualKeyboardStateObserver(this); 410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ash::Shell::GetScreen()->RemoveObserver(this); 4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (login_view_ && login_window_) 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch login_window_->RemoveRemovalsObserver(this); 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (login::LoginScrollIntoViewEnabled()) 417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetKeyboardOverscrollOverride(); 4180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::FocusManager::set_arrow_key_traversal_enabled(false); 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ResetLoginWindowAndView(); 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Let chrome process exit after login/oobe screen if needed. 423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome::DecrementKeepAliveCount(); 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default_host_ = NULL; 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(tengs): This should be refactored. See crbug.com/314934. 4276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (user_manager::UserManager::Get()->IsCurrentUserNew()) { 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // DriveOptInController will delete itself when finished. 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (new DriveFirstRunController( 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProfileManager::GetActiveUserProfile()))->EnableOfflineMode(); 43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// LoginDisplayHostImpl, LoginDisplayHost implementation: 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoginDisplay* LoginDisplayHostImpl::CreateLoginDisplay( 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoginDisplay::Delegate* delegate) { 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webui_login_display_ = new WebUILoginDisplay(delegate); 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webui_login_display_->set_background_bounds(background_bounds()); 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return webui_login_display_; 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::NativeWindow LoginDisplayHostImpl::GetNativeWindow() const { 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return login_window_ ? login_window_->GetNativeWindow() : NULL; 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebUILoginView* LoginDisplayHostImpl::GetWebUILoginView() const { 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return login_view_; 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::BeforeSessionStart() { 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_starting_ = true; 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void LoginDisplayHostImpl::Finalize() { 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DVLOG(1) << "Session starting"; 458424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (ash::Shell::HasInstance()) { 459424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ash::Shell::GetInstance()-> 460424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) desktop_background_controller()->MoveDesktopToUnlockedContainer(); 461424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (wizard_controller_.get()) 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wizard_controller_->OnSessionStart(); 4641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (finalize_animation_type_) { 4661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case ANIMATION_NONE: 4671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ShutdownDisplayHost(false); 4681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 4691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case ANIMATION_WORKSPACE: 4701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (ash::Shell::HasInstance()) 4711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ScheduleWorkspaceAnimation(); 4721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ShutdownDisplayHost(false); 4741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 4751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case ANIMATION_FADE_OUT: 4761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Display host is deleted once animation is completed 4771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // since sign in screen widget has to stay alive. 4781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ScheduleFadeOutAnimation(); 4791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::OnCompleteLogin() { 484effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (auto_enrollment_controller_) 485effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch auto_enrollment_controller_->Cancel(); 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::OpenProxySettings() { 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (login_view_) 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_view_->OpenProxySettings(); 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::SetStatusAreaVisible(bool visible) { 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (initialize_webui_hidden_) 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status_area_saved_visibility_ = visible; 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (login_view_) 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_view_->SetStatusAreaVisible(visible); 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 500effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochAutoEnrollmentController* LoginDisplayHostImpl::GetAutoEnrollmentController() { 501effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!auto_enrollment_controller_) { 502effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch auto_enrollment_controller_.reset(new AutoEnrollmentController()); 503effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch auto_enrollment_progress_subscription_ = 504effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch auto_enrollment_controller_->RegisterProgressCallback( 505effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Bind(&LoginDisplayHostImpl::OnAutoEnrollmentProgress, 506effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Unretained(this))); 507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 508effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return auto_enrollment_controller_.get(); 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::StartWizard( 512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& first_screen_name, 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> screen_parameters) { 514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (login::LoginScrollIntoViewEnabled()) 515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DisableKeyboardOverscroll(); 516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) startup_sound_honors_spoken_feedback_ = false; 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TryToPlayStartupSound(); 5190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Keep parameters to restore if renderer crashes. 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) restore_path_ = RESTORE_WIZARD; 522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wizard_first_screen_name_ = first_screen_name; 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (screen_parameters.get()) 524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wizard_screen_parameters_.reset(screen_parameters->DeepCopy()); 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wizard_screen_parameters_.reset(); 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_showing_login_ = false; 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (waiting_for_wallpaper_load_ && !initialize_webui_hidden_) { 530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> wizard postponed"; 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> wizard"; 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!login_window_) 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadURL(GURL(kOobeURL)); 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DVLOG(1) << "Starting wizard, first_screen_name: " << first_screen_name; 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create and show the wizard. 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Note, dtor of the old WizardController should be called before ctor of the 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // new one, because "default_controller()" is updated there. So pure "reset()" 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is done before new controller creation. 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wizard_controller_.reset(); 544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wizard_controller_.reset(CreateWizardController()); 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oobe_progress_bar_visible_ = !StartupUtils::IsDeviceRegistered(); 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetOobeProgressBarVisible(oobe_progress_bar_visible_); 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wizard_controller_->Init(first_screen_name, screen_parameters.Pass()); 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WizardController* LoginDisplayHostImpl::GetWizardController() { 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return wizard_controller_.get(); 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)AppLaunchController* LoginDisplayHostImpl::GetAppLaunchController() { 55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return app_launch_controller_.get(); 55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void LoginDisplayHostImpl::StartUserAdding( 560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::Closure& completion_callback) { 561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (login::LoginScrollIntoViewEnabled()) 562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DisableKeyboardOverscroll(); 563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) restore_path_ = RESTORE_ADD_USER_INTO_SESSION; 565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) completion_callback_ = completion_callback; 5661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) finalize_animation_type_ = ANIMATION_NONE; 567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> user adding"; 568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!login_window_) 569868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LoadURL(GURL(kUserAddingURL)); 570868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // We should emit this signal only at login screen (after reboot or sign out). 571868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) login_view_->set_should_emit_login_prompt_visible(false); 572868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 573868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Lock container can be transparent after lock screen animation. 574868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) aura::Window* lock_container = ash::Shell::GetContainer( 575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ash::Shell::GetPrimaryRootWindow(), 576c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::kShellWindowId_LockScreenContainersContainer); 577868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) lock_container->layer()->SetOpacity(1.0); 578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 579868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ash::Shell::GetInstance()-> 580868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) desktop_background_controller()->MoveDesktopToLockedContainer(); 581868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 582868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) sign_in_controller_.reset(); // Only one controller in a time. 583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) sign_in_controller_.reset(new chromeos::ExistingUserController(this)); 584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetOobeProgressBarVisible(oobe_progress_bar_visible_ = false); 585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetStatusAreaVisible(true); 586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) sign_in_controller_->Init( 5876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetUsersAdmittedForMultiProfile()); 588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(webui_login_display_); 589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetOobeUI()->ShowSigninScreen(LoginScreenContext(), 590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webui_login_display_, 591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webui_login_display_); 592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void LoginDisplayHostImpl::StartSignInScreen( 595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const LoginScreenContext& context) { 596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (login::LoginScrollIntoViewEnabled()) 597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DisableKeyboardOverscroll(); 598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) startup_sound_honors_spoken_feedback_ = true; 600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TryToPlayStartupSound(); 6010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) restore_path_ = RESTORE_SIGN_IN; 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_showing_login_ = true; 6041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) finalize_animation_type_ = ANIMATION_WORKSPACE; 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PrewarmAuthentication(); 6077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (waiting_for_wallpaper_load_ && !initialize_webui_hidden_) { 609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> sign in postponed"; 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> sign in"; 613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 614ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!login_window_) { 615ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch TRACE_EVENT_ASYNC_BEGIN0("ui", "ShowLoginWebUI", kShowLoginWebUIid); 616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT_ASYNC_STEP_INTO0( 617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "ui", "ShowLoginWebUI", kShowLoginWebUIid, "StartSignInScreen"); 618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BootTimesLoader::Get()->RecordCurrentStats("login-start-signin-screen"); 619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadURL(GURL(kLoginURL)); 620ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DVLOG(1) << "Starting sign in screen"; 6235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const user_manager::UserList& users = 6246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetUsers(); 625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Fix for users who updated device and thus never passed register screen. 627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If we already have users, we assume that it is not a second part of 628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // OOBE. See http://crosbug.com/6289 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!StartupUtils::IsDeviceRegistered() && !users.empty()) { 630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(1) << "Mark device registered because there are remembered users: " 631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << users.size(); 632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) StartupUtils::MarkDeviceRegistered(base::Closure()); 633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sign_in_controller_.reset(); // Only one controller in a time. 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sign_in_controller_.reset(new chromeos::ExistingUserController(this)); 637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oobe_progress_bar_visible_ = !StartupUtils::IsDeviceRegistered(); 638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetOobeProgressBarVisible(oobe_progress_bar_visible_); 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetStatusAreaVisible(true); 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sign_in_controller_->Init(users); 641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We might be here after a reboot that was triggered after OOBE was complete, 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so check for auto-enrollment again. This might catch a cached decision from 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a previous oobe flow, or might start a new check with the server. 645effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (GetAutoEnrollmentController()->ShouldEnrollSilently()) 646effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch sign_in_controller_->DoAutoEnrollment(); 647effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch else 648effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GetAutoEnrollmentController()->Start(); 649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initiate mobile config load. 651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MobileConfig::GetInstance(); 652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initiate device policy fetching. 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy::BrowserPolicyConnectorChromeOS* connector = 6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->platform_part()->browser_policy_connector_chromeos(); 6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) connector->ScheduleServiceInitialization( 657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kPolicyServiceInitializationDelayMilliseconds); 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK(webui_login_display_); 660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetOobeUI()->ShowSigninScreen(context, 661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webui_login_display_, 662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webui_login_display_); 663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chromeos::KioskModeSettings::Get()->IsKioskModeEnabled()) 664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetStatusAreaVisible(false); 665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT_ASYNC_STEP_INTO0("ui", 666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "ShowLoginWebUI", 667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) kShowLoginWebUIid, 668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "WaitForScreenStateInitialize"); 669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BootTimesLoader::Get()->RecordCurrentStats( 670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "login-wait-for-signin-state-initialize"); 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::ResumeSignInScreen() { 674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We only get here after a previous call the StartSignInScreen. That sign-in 675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // was successful but was interrupted by an auto-enrollment execution; once 676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // auto-enrollment is complete we resume the normal login flow from here. 677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DVLOG(1) << "Resuming sign in screen"; 678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK(sign_in_controller_.get()); 679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetOobeProgressBarVisible(oobe_progress_bar_visible_); 680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetStatusAreaVisible(true); 681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sign_in_controller_->ResumeLogin(); 682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::OnPreferencesChanged() { 686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_showing_login_) 687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webui_login_display_->OnPreferencesChanged(); 688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void LoginDisplayHostImpl::PrewarmAuthentication() { 6917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) auth_prewarmer_.reset(new AuthPrewarmer()); 6927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) auth_prewarmer_->PrewarmAuthentication( 6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&LoginDisplayHostImpl::OnAuthPrewarmDone, 6947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pointer_factory_.GetWeakPtr())); 6957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LoginDisplayHostImpl::StartDemoAppLaunch() { 698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> starting demo app."; 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetStatusAreaVisible(false); 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) demo_app_launcher_.reset(new DemoAppLauncher()); 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) demo_app_launcher_->StartDemoAppLaunch(); 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LoginDisplayHostImpl::StartAppLaunch(const std::string& app_id, 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool diagnostic_mode) { 707116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> start app launch."; 7083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetStatusAreaVisible(false); 7091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) finalize_animation_type_ = ANIMATION_FADE_OUT; 7103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!login_window_) 7113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LoadURL(GURL(kAppLaunchSplashURL)); 7123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) login_view_->set_should_emit_login_prompt_visible(false); 7143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) app_launch_controller_.reset(new AppLaunchController( 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) app_id, diagnostic_mode, this, GetOobeUI())); 7173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) app_launch_controller_->StartAppLaunch(); 7193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 7203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// LoginDisplayHostImpl, public 723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WizardController* LoginDisplayHostImpl::CreateWizardController() { 725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(altimofeev): ensure that WebUI is ready. 726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OobeDisplay* oobe_display = GetOobeUI(); 727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new WizardController(this, oobe_display); 728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::OnBrowserCreated() { 731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Close lock window now so that the launched browser can receive focus. 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ResetLoginWindowAndView(); 733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)OobeUI* LoginDisplayHostImpl::GetOobeUI() const { 736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!login_view_) 737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return static_cast<OobeUI*>(login_view_->GetWebUI()->GetController()); 739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// LoginDisplayHostImpl, content:NotificationObserver implementation: 743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::Observe( 745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int type, 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationSource& source, 747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationDetails& details) { 748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (chrome::NOTIFICATION_WALLPAPER_ANIMATION_FINISHED == type) { 749116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> wp animation done"; 750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_wallpaper_loaded_ = true; 751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()->user_wallpaper_delegate() 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ->OnWallpaperBootAnimationFinished(); 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (waiting_for_wallpaper_load_) { 754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // StartWizard / StartSignInScreen could be called multiple times through 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the lifetime of host. 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure that subsequent calls are not postponed. 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_wallpaper_load_ = false; 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (initialize_webui_hidden_) 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShowWebUI(); 760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StartPostponedWebUI(); 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Remove(this, 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NOTIFICATION_WALLPAPER_ANIMATION_FINISHED, 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 766a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } else if (chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE == type || 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN == type) { 768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> WEBUI_VISIBLE"; 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (waiting_for_user_pods_ && initialize_webui_hidden_) { 770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_user_pods_ = false; 771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShowWebUI(); 772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (waiting_for_wallpaper_load_ && initialize_webui_hidden_) { 773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reduce time till login UI is shown - show it as soon as possible. 774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_wallpaper_load_ = false; 775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShowWebUI(); 776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Remove(this, 778a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, 779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Remove(this, 781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN, 782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (type == chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST) { 784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShutdownDisplayHost(true); 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (type == chrome::NOTIFICATION_BROWSER_OPENED && session_starting_) { 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Browsers created before session start (windows opened by extensions, for 787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // example) are ignored. 788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnBrowserCreated(); 789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Remove(this, 790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST, 791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Remove(this, 793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NOTIFICATION_BROWSER_OPENED, 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (type == chrome::NOTIFICATION_LOGIN_USER_CHANGED && 7966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->IsCurrentUserNew()) { 7971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA) 798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For new user, move desktop to locker container so that windows created 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // during the user image picker step are below it. 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()-> 801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) desktop_background_controller()->MoveDesktopToLockedContainer(); 8021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Remove(this, 804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NOTIFICATION_LOGIN_USER_CHANGED, 805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::AllSources()); 806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// LoginDisplayHostImpl, WebContentsObserver implementation: 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid LoginDisplayHostImpl::RenderProcessGone(base::TerminationStatus status) { 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Do not try to restore on shutdown 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_shutdown::GetShutdownType() != browser_shutdown::NOT_VALID) 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) crash_count_++; 818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (crash_count_ > kCrashCountLimit) 819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (status != base::TERMINATION_STATUS_NORMAL_TERMINATION) { 822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Render with login screen crashed. Let's crash browser process to let 823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // session manager restart it properly. It is hard to reload the page 824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and get to controlled state that is fully functional. 825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If you see check, search for renderer crash for the same client. 826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(FATAL) << "Renderer crash on login window"; 827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 8310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// LoginDisplayHostImpl, chromeos::SessionManagerClient::Observer 8320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// implementation: 8330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 8340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void LoginDisplayHostImpl::EmitLoginPromptVisibleCalled() { 8350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnLoginPromptVisible(); 8360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 8370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 838c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch//////////////////////////////////////////////////////////////////////////////// 839c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LoginDisplayHostImpl, chromeos::CrasAudioHandler::AudioObserver 840c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// implementation: 841c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 842a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LoginDisplayHostImpl::OnActiveOutputNodeChanged() { 843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TryToPlayStartupSound(); 844a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 845a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 8460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 847c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LoginDisplayHostImpl, ash::KeyboardStateObserver: 848c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// implementation: 849c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 850c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LoginDisplayHostImpl::OnVirtualKeyboardStateChanged(bool activated) { 851c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (keyboard::KeyboardController::GetInstance()) { 852c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (activated) { 853c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!is_observing_keyboard_) { 854c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch keyboard::KeyboardController::GetInstance()->AddObserver(this); 855c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch is_observing_keyboard_ = true; 856c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 857c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else { 858c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch keyboard::KeyboardController::GetInstance()->RemoveObserver(this); 859c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch is_observing_keyboard_ = false; 860c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 861c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 862c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 863c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 864c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch//////////////////////////////////////////////////////////////////////////////// 865c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// LoginDisplayHostImpl, keyboard::KeyboardControllerObserver: 866c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// implementation: 867c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 868c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid LoginDisplayHostImpl::OnKeyboardBoundsChanging( 869c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const gfx::Rect& new_bounds) { 870c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (new_bounds.IsEmpty() && !keyboard_bounds_.IsEmpty()) { 871c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Keyboard has been hidden. 872cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetOobeUI()) { 873cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetOobeUI()->GetCoreOobeActor()->ShowControlBar(true); 874cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (login::LoginScrollIntoViewEnabled()) 875cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetOobeUI()->GetCoreOobeActor()->SetKeyboardState(false, new_bounds); 876cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 877c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } else if (!new_bounds.IsEmpty() && keyboard_bounds_.IsEmpty()) { 878c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Keyboard has been shown. 879cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetOobeUI()) { 880cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetOobeUI()->GetCoreOobeActor()->ShowControlBar(false); 881cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (login::LoginScrollIntoViewEnabled()) 882cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetOobeUI()->GetCoreOobeActor()->SetKeyboardState(true, new_bounds); 883cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 884c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 885c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 886c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch keyboard_bounds_ = new_bounds; 887c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 888c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 889c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch//////////////////////////////////////////////////////////////////////////////// 890cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// LoginDisplayHostImpl, gfx::DisplayObserver implementation: 891cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 892cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LoginDisplayHostImpl::OnDisplayAdded(const gfx::Display& new_display) { 893cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 894cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 895cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LoginDisplayHostImpl::OnDisplayRemoved(const gfx::Display& old_display) { 896cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 898cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LoginDisplayHostImpl::OnDisplayMetricsChanged(const gfx::Display& display, 899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32_t changed_metrics) { 900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (display.id() != ash::Shell::GetScreen()->GetPrimaryDisplay().id() || 901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !(changed_metrics & DISPLAY_METRIC_BOUNDS)) { 902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetOobeUI()) { 906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const gfx::Size& size = ash::Shell::GetScreen()->GetPrimaryDisplay().size(); 907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetOobeUI()->GetCoreOobeActor()->SetClientAreaSize(size.width(), 908cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size.height()); 909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 913116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// LoginDisplayHostImpl, views::WidgetRemovalsObserver implementation: 914116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid LoginDisplayHostImpl::OnWillRemoveView(views::Widget* widget, 915116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch views::View* view) { 916116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (view != static_cast<views::View*>(login_view_)) 917116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 918116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch login_view_ = NULL; 919116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch widget->RemoveRemovalsObserver(this); 920116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 921116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 922116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//////////////////////////////////////////////////////////////////////////////// 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// LoginDisplayHostImpl, private 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::ShutdownDisplayHost(bool post_quit_task) { 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (shutting_down_) 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shutting_down_ = true; 930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.RemoveAll(); 93190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (post_quit_task) 93390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 934868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 935868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!completion_callback_.is_null()) 936868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) completion_callback_.Run(); 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void LoginDisplayHostImpl::ScheduleWorkspaceAnimation() { 940c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), 941c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::kShellWindowId_DesktopBackgroundContainer) 942c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ->children() 943c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch .empty()) { 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If there is no background window, don't perform any animation on the 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // default and background layer because there is nothing behind it. 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!CommandLine::ForCurrentProcess()->HasSwitch( 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switches::kDisableLoginAnimations)) 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()->DoInitialWorkspaceAnimation(); 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void LoginDisplayHostImpl::ScheduleFadeOutAnimation() { 9551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::Layer* layer = login_window_->GetLayer(); 9561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::ScopedLayerAnimationSettings animation(layer->GetAnimator()); 9571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) animation.AddObserver(new AnimationObserver( 9581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Bind(&LoginDisplayHostImpl::ShutdownDisplayHost, 9591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) animation_weak_ptr_factory_.GetWeakPtr(), 9601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) false))); 9611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) layer->SetOpacity(0); 9621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 9631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 964effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid LoginDisplayHostImpl::OnAutoEnrollmentProgress( 965effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch policy::AutoEnrollmentState state) { 966effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch VLOG(1) << "OnAutoEnrollmentProgress, state " << state; 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 968effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (sign_in_controller_ && 969effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch auto_enrollment_controller_->ShouldEnrollSilently()) { 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sign_in_controller_->DoAutoEnrollment(); 971effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::LoadURL(const GURL& url) { 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InitLoginWindowAndView(); 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Subscribe to crash events. 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContentsObserver::Observe(login_view_->GetWebContents()); 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_view_->LoadURL(url); 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // LoadURL could be called after the spring charger dialog shows, and 9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // take away the focus from it. Set the focus back to the charger dialog 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // if it is visible. 9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // See crbug.com/328538. 9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChargerReplacementDialog::SetFocusOnChargerDialogIfVisible(); 985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::ShowWebUI() { 988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!login_window_ || !login_view_) { 989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 992116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> Show already initialized UI"; 993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_window_->Show(); 994010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) login_view_->GetWebContents()->Focus(); 995f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (::switches::IsTextInputFocusManagerEnabled()) 996f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) login_view_->RequestFocus(); 997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_view_->SetStatusAreaVisible(status_area_saved_visibility_); 998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_view_->OnPostponedShow(); 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Login window could be shown after the spring charger dialog shows, and 10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // take away the focus from it. Set the focus back to the charger dialog 10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // if it is visible. 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // See crbug.com/328538. 10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChargerReplacementDialog::SetFocusOnChargerDialogIfVisible(); 10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We should reset this flag to allow changing of status area visibility. 1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initialize_webui_hidden_ = false; 1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::StartPostponedWebUI() { 1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!is_wallpaper_loaded_) { 1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1015116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> Init postponed WebUI"; 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Wallpaper has finished loading before StartWizard/StartSignInScreen has 1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // been called. In general this should not happen. 1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Let go through normal code path when one of those will be called. 1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (restore_path_ == RESTORE_UNKNOWN) { 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (restore_path_) { 1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case RESTORE_WIZARD: 1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StartWizard(wizard_first_screen_name_, 1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wizard_screen_parameters_.Pass()); 1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case RESTORE_SIGN_IN: 1031f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) StartSignInScreen(LoginScreenContext()); 1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1033868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case RESTORE_ADD_USER_INTO_SESSION: 1034868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) StartUserAdding(completion_callback_); 1035868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::InitLoginWindowAndView() { 1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (login_window_) 1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (system::InputDeviceSettings::Get()->ForceKeyboardDrivenUINavigation()) { 10470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) views::FocusManager::set_arrow_key_traversal_enabled(true); 10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA) 10491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // crbug.com/405859 10500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) focus_ring_controller_.reset(new FocusRingController); 10510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) focus_ring_controller_->SetVisible(true); 10521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 10530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 10540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) keyboard_driven_oobe_key_handler_.reset(new KeyboardDrivenOobeKeyHandler); 10550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 10560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::InitParams params( 1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.bounds = background_bounds(); 10606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) params.show_state = ui::SHOW_STATE_FULLSCREEN; 1061eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 10621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_ATHENA) 10631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci athena::ScreenManager::ContainerParams container_params( 10641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "LoginScreen", athena::CP_LOGIN_SCREEN); 10651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci container_params.can_activate_children = true; 10661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci login_screen_container_.reset( 10671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci athena::ScreenManager::Get()->CreateContainer(container_params)); 10681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.parent = login_screen_container_.get(); 10691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.parent = 1071c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), 1072c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::kShellWindowId_LockScreenContainer); 10731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_window_ = new views::Widget; 1075c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.delegate = new LoginWidgetDelegate(login_window_); 1076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_window_->Init(params); 1077c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_view_ = new WebUILoginView(); 10793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) login_view_->Init(); 10800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (login_view_->webui_visible()) 10810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnLoginPromptVisible(); 1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1083a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::SetWindowVisibilityAnimationDuration( 1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_window_->GetNativeView(), 1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromMilliseconds(kLoginFadeoutTransitionDurationMs)); 1086a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::SetWindowVisibilityAnimationTransition( 1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_window_->GetNativeView(), 1088a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::ANIMATE_HIDE); 1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1090116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch login_window_->AddRemovalsObserver(this); 1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_window_->SetContentsView(login_view_); 1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If WebUI is initialized in hidden state, show it only if we're no 1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // longer waiting for wallpaper animation/user images loading. Otherwise, 1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // always show it. 1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!initialize_webui_hidden_ || 1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (!waiting_for_wallpaper_load_ && !waiting_for_user_pods_)) { 1098116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> show login wnd on create"; 1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_window_->Show(); 1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 1101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch VLOG(1) << "Login WebUI >> login wnd is hidden on create"; 1102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_view_->set_is_hidden(true); 1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_window_->GetNativeView()->SetName("WebUILoginView"); 1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginDisplayHostImpl::ResetLoginWindowAndView() { 1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!login_window_) 1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_window_->Close(); 1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_window_ = NULL; 1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) login_view_ = NULL; 1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void LoginDisplayHostImpl::OnAuthPrewarmDone() { 11167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) auth_prewarmer_.reset(); 11177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 11187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void LoginDisplayHostImpl::SetOobeProgressBarVisible(bool visible) { 11204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetOobeUI()->ShowOobeUI(visible); 11214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 11224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LoginDisplayHostImpl::TryToPlayStartupSound() { 1124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (startup_sound_played_ || login_prompt_visible_time_.is_null() || 11251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !CrasAudioHandler::Get()->GetPrimaryActiveOutputNode()) { 11260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return; 1127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 11280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 11295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) startup_sound_played_ = true; 11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Don't try play startup sound if login prompt is already visible 11325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // for a long time or can't be played. 1133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (base::TimeTicks::Now() - login_prompt_visible_time_ > 1134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kStartupSoundMaxDelayMs)) { 11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EnableSystemSoundsForAccessibility(); 11360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return; 11370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!startup_sound_honors_spoken_feedback_ && 1140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) !ash::PlaySystemSoundAlways(SOUND_STARTUP)) { 1141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EnableSystemSoundsForAccessibility(); 1142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA) 11461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // crbug.com/408733 1147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (startup_sound_honors_spoken_feedback_ && 1148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) !ash::PlaySystemSoundIfSpokenFeedback(SOUND_STARTUP)) { 1149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EnableSystemSoundsForAccessibility(); 1150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 11521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 11565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&EnableSystemSoundsForAccessibility), 11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::SoundsManager::Get()->GetDuration(SOUND_STARTUP)); 11580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 11590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LoginDisplayHostImpl::OnLoginPromptVisible() { 1161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!login_prompt_visible_time_.is_null()) 11620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return; 1163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) login_prompt_visible_time_ = base::TimeTicks::Now(); 1164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TryToPlayStartupSound(); 11650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 11660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// external 1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Declared in login_wizard.h so that others don't need to depend on our .h. 1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(nkostylev): Split this into a smaller functions. 117290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ShowLoginWizard(const std::string& first_screen_name) { 1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_shutdown::IsTryingToQuit()) 1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(1) << "Showing OOBE screen: " << first_screen_name; 1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA) 11791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(dpolukhin): crbug.com/407579 1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::input_method::InputMethodManager* manager = 1181a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) chromeos::input_method::InputMethodManager::Get(); 1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set up keyboards. For example, when |locale| is "en-US", enable US qwerty 1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and US dvorak keyboard layouts. 1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (g_browser_process && g_browser_process->local_state()) { 118603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) manager->GetActiveIMEState()->SetInputMethodLoginDefault(); 11873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1188424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PrefService* prefs = g_browser_process->local_state(); 11893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Apply owner preferences for tap-to-click and mouse buttons swap for 11903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // login screen. 11915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) system::InputDeviceSettings::Get()->SetPrimaryButtonRight( 11923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) prefs->GetBoolean(prefs::kOwnerPrimaryMouseButtonRight)); 11935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) system::InputDeviceSettings::Get()->SetTapToClick( 11945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs->GetBoolean(prefs::kOwnerTapToClickEnabled)); 1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch system::InputDeviceSettings::Get()->SetNaturalScroll( 1197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CommandLine::ForCurrentProcess()->HasSwitch( 1198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch switches::kNaturalScrollDefault)); 11991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(gfx::Size())); 1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch g_browser_process->platform_part()->SessionManager()->SetSessionState( 1204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch StartupUtils::IsOobeCompleted() 1205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ? session_manager::SESSION_STATE_LOGIN_PRIMARY 1206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : session_manager::SESSION_STATE_OOBE); 12073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 12083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LoginDisplayHost* display_host = new LoginDisplayHostImpl(screen_bounds); 12093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool show_app_launch_splash_screen = 1211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (first_screen_name == WizardController::kAppLaunchSplashScreenName); 12123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (show_app_launch_splash_screen) { 12133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& auto_launch_app_id = 1214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch KioskAppManager::Get()->GetAutoLaunchApp(); 12155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) display_host->StartAppLaunch(auto_launch_app_id, 12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false /* diagnostic_mode */); 12173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 12183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 12193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Check whether we need to execute OOBE flow. 1221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool oobe_complete = StartupUtils::IsOobeCompleted(); 12225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) policy::BrowserPolicyConnectorChromeOS* connector = 12235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->platform_part()->browser_policy_connector_chromeos(); 1224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool enrollment_screen_wanted = 1225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WizardController::ShouldRecoverEnrollment() || 1226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (WizardController::ShouldAutoStartEnrollment() && oobe_complete && 1227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch !connector->IsEnterpriseManaged()); 1228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (enrollment_screen_wanted && first_screen_name.empty()) { 12295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Shows networks screen instead of enrollment screen to resume the 12305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // interrupted auto start enrollment flow because enrollment screen does 12315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // not handle flaky network. See http://crbug.com/332572 1232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch display_host->StartWizard(WizardController::kNetworkScreenName, 12335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue>()); 1234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 12370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (StartupUtils::IsEulaAccepted()) { 12380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DelayNetworkCall( 12390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ServicesCustomizationDocument::GetInstance() 12400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ->EnsureCustomizationAppliedClosure(), 12410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::TimeDelta::FromMilliseconds(kDefaultNetworkRetryDelayMS)); 12420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 12430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool show_login_screen = 1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (first_screen_name.empty() && oobe_complete) || 1246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch first_screen_name == WizardController::kLoginScreenName; 1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (show_login_screen) { 1249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_host->StartSignInScreen(LoginScreenContext()); 1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Load startup manifest. 1254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const StartupCustomizationDocument* startup_manifest = 1255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch StartupCustomizationDocument::GetInstance(); 1256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Switch to initial locale if specified by customization 1258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and has not been set yet. We cannot call 1259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // LanguageSwitchMenu::SwitchLanguage here before 1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // EmitLoginPromptReady. 1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PrefService* prefs = g_browser_process->local_state(); 1262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& current_locale = 1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs->GetString(prefs::kApplicationLocale); 1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(1) << "Current locale: " << current_locale; 1265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& locale = startup_manifest->initial_locale_default(); 12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& layout = startup_manifest->keyboard_layout(); 12685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "Initial locale: " << locale << "keyboard layout " << layout; 12695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA) 12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Determine keyboard layout from OEM customization (if provided) or 12725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // initial locale and save it in preferences. 127303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) manager->GetActiveIMEState()->SetInputMethodLoginDefaultFromVPD(locale, 127403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) layout); 12751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 12763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!current_locale.empty() || locale.empty()) { 1278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ShowLoginWizardFinish(first_screen_name, startup_manifest, display_host); 1279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Save initial locale from VPD/customization manifest as current 1283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Chrome locale. Otherwise it will be lost if Chrome restarts. 1284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Don't need to schedule pref save because setting initial local 1285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // will enforce preference saving. 1286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) prefs->SetString(prefs::kApplicationLocale, locale); 1287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch StartupUtils::SetInitialLocale(locale); 1288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<ShowLoginWizardSwitchLanguageCallbackData> data( 1290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new ShowLoginWizardSwitchLanguageCallbackData( 1291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) first_screen_name, startup_manifest, display_host)); 1292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<locale_util::SwitchLanguageCallback> callback( 1294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new locale_util::SwitchLanguageCallback( 1295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&OnLanguageSwitchedCallback, base::Passed(data.Pass())))); 1296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Load locale keyboards here. Hardware layout would be automatically enabled. 12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) locale_util::SwitchLanguage( 12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) locale, true, true /* login_layouts_only */, callback.Pass()); 1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace chromeos 1303