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