• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
6 
7 #include "base/command_line.h"
8 #include "base/logging.h"
9 #include "base/strings/stringprintf.h"
10 #include "base/values.h"
11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/browser_process_platform_part.h"
13 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h"
14 #include "chrome/browser/chromeos/login/enrollment/auto_enrollment_check_screen_actor.h"
15 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen_actor.h"
16 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
17 #include "chrome/browser/chromeos/policy/consumer_management_service.h"
18 #include "chrome/browser/chromeos/system/input_device_settings.h"
19 #include "chrome/browser/extensions/signin/gaia_auth_extension_loader.h"
20 #include "chrome/browser/profiles/profile.h"
21 #include "chrome/browser/ui/webui/about_ui.h"
22 #include "chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h"
23 #include "chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.h"
24 #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
25 #include "chrome/browser/ui/webui/chromeos/login/controller_pairing_screen_handler.h"
26 #include "chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h"
27 #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h"
28 #include "chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h"
29 #include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h"
30 #include "chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h"
31 #include "chrome/browser/ui/webui/chromeos/login/host_pairing_screen_handler.h"
32 #include "chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.h"
33 #include "chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.h"
34 #include "chrome/browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.h"
35 #include "chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.h"
36 #include "chrome/browser/ui/webui/chromeos/login/network_screen_handler.h"
37 #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
38 #include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h"
39 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
40 #include "chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h"
41 #include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h"
42 #include "chrome/browser/ui/webui/chromeos/login/update_screen_handler.h"
43 #include "chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h"
44 #include "chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.h"
45 #include "chrome/browser/ui/webui/options/chromeos/user_image_source.h"
46 #include "chrome/browser/ui/webui/theme_source.h"
47 #include "chrome/common/chrome_constants.h"
48 #include "chrome/common/url_constants.h"
49 #include "chromeos/chromeos_switches.h"
50 #include "content/public/browser/web_ui.h"
51 #include "content/public/browser/web_ui_data_source.h"
52 #include "grit/browser_resources.h"
53 #include "ui/base/resource/resource_bundle.h"
54 #include "ui/base/webui/web_ui_util.h"
55 
56 namespace chromeos {
57 
58 namespace {
59 
60 const char* kKnownDisplayTypes[] = {
61   OobeUI::kOobeDisplay,
62   OobeUI::kLoginDisplay,
63   OobeUI::kLockDisplay,
64   OobeUI::kUserAddingDisplay,
65   OobeUI::kAppLaunchSplashDisplay
66 };
67 
68 const char kStringsJSPath[] = "strings.js";
69 const char kLoginJSPath[] = "login.js";
70 const char kOobeJSPath[] = "oobe.js";
71 const char kKeyboardUtilsJSPath[] = "keyboard_utils.js";
72 const char kDemoUserLoginJSPath[] = "demo_user_login.js";
73 
74 // Paths for deferred resource loading.
75 const char kEnrollmentHTMLPath[] = "enrollment.html";
76 const char kEnrollmentCSSPath[] = "enrollment.css";
77 const char kEnrollmentJSPath[] = "enrollment.js";
78 
79 // Creates a WebUIDataSource for chrome://oobe
CreateOobeUIDataSource(const base::DictionaryValue & localized_strings,const std::string & display_type)80 content::WebUIDataSource* CreateOobeUIDataSource(
81     const base::DictionaryValue& localized_strings,
82     const std::string& display_type) {
83   content::WebUIDataSource* source =
84       content::WebUIDataSource::Create(chrome::kChromeUIOobeHost);
85   source->SetUseJsonJSFormatV2();
86   source->AddLocalizedStrings(localized_strings);
87   source->SetJsonPath(kStringsJSPath);
88 
89   if (chromeos::KioskModeSettings::Get()->IsKioskModeEnabled()) {
90     source->SetDefaultResource(IDR_DEMO_USER_LOGIN_HTML);
91     source->AddResourcePath(kDemoUserLoginJSPath, IDR_DEMO_USER_LOGIN_JS);
92     return source;
93   }
94   if (display_type == OobeUI::kOobeDisplay) {
95     source->SetDefaultResource(IDR_OOBE_HTML);
96     source->AddResourcePath(kOobeJSPath, IDR_OOBE_JS);
97   } else {
98     source->SetDefaultResource(IDR_LOGIN_HTML);
99     source->AddResourcePath(kLoginJSPath, IDR_LOGIN_JS);
100   }
101   source->AddResourcePath(kKeyboardUtilsJSPath, IDR_KEYBOARD_UTILS_JS);
102   source->OverrideContentSecurityPolicyFrameSrc(
103       base::StringPrintf(
104           "frame-src chrome://terms/ %s/;",
105           extensions::kGaiaAuthExtensionOrigin));
106 
107   // Serve deferred resources.
108   source->AddResourcePath(kEnrollmentHTMLPath, IDR_OOBE_ENROLLMENT_HTML);
109   source->AddResourcePath(kEnrollmentCSSPath, IDR_OOBE_ENROLLMENT_CSS);
110   source->AddResourcePath(kEnrollmentJSPath, IDR_OOBE_ENROLLMENT_JS);
111 
112   return source;
113 }
114 
GetDisplayType(const GURL & url)115 std::string GetDisplayType(const GURL& url) {
116   std::string path = url.path().size() ? url.path().substr(1) : "";
117   if (std::find(kKnownDisplayTypes,
118                 kKnownDisplayTypes + arraysize(kKnownDisplayTypes),
119                 path) == kKnownDisplayTypes + arraysize(kKnownDisplayTypes)) {
120     LOG(ERROR) << "Unknown display type '" << path << "'. Setting default.";
121     return OobeUI::kLoginDisplay;
122   }
123   return path;
124 }
125 
126 }  // namespace
127 
128 // static
129 const char OobeUI::kOobeDisplay[] = "oobe";
130 const char OobeUI::kLoginDisplay[] = "login";
131 const char OobeUI::kLockDisplay[] = "lock";
132 const char OobeUI::kUserAddingDisplay[] = "user-adding";
133 const char OobeUI::kAppLaunchSplashDisplay[] = "app-launch-splash";
134 
135 // static
136 const char OobeUI::kScreenOobeHIDDetection[] = "hid-detection";
137 const char OobeUI::kScreenOobeNetwork[] = "connect";
138 const char OobeUI::kScreenOobeEula[] = "eula";
139 const char OobeUI::kScreenOobeUpdate[] = "update";
140 const char OobeUI::kScreenOobeEnrollment[] = "oauth-enrollment";
141 const char OobeUI::kScreenOobeReset[] = "reset";
142 const char OobeUI::kScreenGaiaSignin[] = "gaia-signin";
143 const char OobeUI::kScreenAccountPicker[] = "account-picker";
144 const char OobeUI::kScreenKioskAutolaunch[] = "autolaunch";
145 const char OobeUI::kScreenKioskEnable[] = "kiosk-enable";
146 const char OobeUI::kScreenErrorMessage[] = "error-message";
147 const char OobeUI::kScreenUserImagePicker[] = "user-image";
148 const char OobeUI::kScreenTpmError[] = "tpm-error-message";
149 const char OobeUI::kScreenPasswordChanged[] = "password-changed";
150 const char OobeUI::kScreenSupervisedUserCreationFlow[] =
151     "supervised-user-creation";
152 const char OobeUI::kScreenTermsOfService[] = "terms-of-service";
153 const char OobeUI::kScreenWrongHWID[] = "wrong-hwid";
154 const char OobeUI::kScreenAutoEnrollmentCheck[] = "auto-enrollment-check";
155 const char OobeUI::kScreenHIDDetection[] = "hid-detection";
156 const char OobeUI::kScreenAppLaunchSplash[] = "app-launch-splash";
157 const char OobeUI::kScreenConfirmPassword[] = "confirm-password";
158 const char OobeUI::kScreenFatalError[] = "fatal-error";
159 const char OobeUI::kScreenControllerPairing[] = "controller-pairing";
160 const char OobeUI::kScreenHostPairing[] = "host-pairing";
161 
OobeUI(content::WebUI * web_ui,const GURL & url)162 OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url)
163     : WebUIController(web_ui),
164       core_handler_(NULL),
165       network_dropdown_handler_(NULL),
166       update_screen_handler_(NULL),
167       network_screen_actor_(NULL),
168       eula_screen_actor_(NULL),
169       hid_detection_screen_actor_(NULL),
170       reset_screen_actor_(NULL),
171       autolaunch_screen_actor_(NULL),
172       kiosk_enable_screen_actor_(NULL),
173       wrong_hwid_screen_actor_(NULL),
174       auto_enrollment_check_screen_actor_(NULL),
175       supervised_user_creation_screen_actor_(NULL),
176       error_screen_handler_(NULL),
177       signin_screen_handler_(NULL),
178       terms_of_service_screen_actor_(NULL),
179       user_image_screen_actor_(NULL),
180       kiosk_app_menu_handler_(NULL),
181       current_screen_(SCREEN_UNKNOWN),
182       previous_screen_(SCREEN_UNKNOWN),
183       ready_(false) {
184   display_type_ = GetDisplayType(url);
185   InitializeScreenMaps();
186 
187   network_state_informer_ = new NetworkStateInformer();
188   network_state_informer_->Init();
189 
190   core_handler_ = new CoreOobeHandler(this);
191   AddScreenHandler(core_handler_);
192   core_handler_->SetDelegate(this);
193 
194   network_dropdown_handler_ = new NetworkDropdownHandler();
195   AddScreenHandler(network_dropdown_handler_);
196 
197   update_screen_handler_ = new UpdateScreenHandler();
198   AddScreenHandler(update_screen_handler_);
199   network_dropdown_handler_->AddObserver(update_screen_handler_);
200 
201   if (display_type_ == kOobeDisplay) {
202     NetworkScreenHandler* network_screen_handler =
203         new NetworkScreenHandler(core_handler_);
204     network_screen_actor_ = network_screen_handler;
205     AddScreenHandler(network_screen_handler);
206   }
207 
208   EulaScreenHandler* eula_screen_handler = new EulaScreenHandler(core_handler_);
209   eula_screen_actor_ = eula_screen_handler;
210   AddScreenHandler(eula_screen_handler);
211 
212   ResetScreenHandler* reset_screen_handler = new ResetScreenHandler();
213   reset_screen_actor_ = reset_screen_handler;
214   AddScreenHandler(reset_screen_handler);
215 
216   KioskAutolaunchScreenHandler* autolaunch_screen_handler =
217       new KioskAutolaunchScreenHandler();
218   autolaunch_screen_actor_ = autolaunch_screen_handler;
219   AddScreenHandler(autolaunch_screen_handler);
220 
221   KioskEnableScreenHandler* kiosk_enable_screen_handler =
222       new KioskEnableScreenHandler();
223   kiosk_enable_screen_actor_ = kiosk_enable_screen_handler;
224   AddScreenHandler(kiosk_enable_screen_handler);
225 
226   SupervisedUserCreationScreenHandler* supervised_user_creation_screen_handler =
227       new SupervisedUserCreationScreenHandler();
228   supervised_user_creation_screen_actor_ =
229       supervised_user_creation_screen_handler;
230   AddScreenHandler(supervised_user_creation_screen_handler);
231 
232   WrongHWIDScreenHandler* wrong_hwid_screen_handler =
233       new WrongHWIDScreenHandler();
234   wrong_hwid_screen_actor_ = wrong_hwid_screen_handler;
235   AddScreenHandler(wrong_hwid_screen_handler);
236 
237   AutoEnrollmentCheckScreenHandler* auto_enrollment_check_screen_handler =
238       new AutoEnrollmentCheckScreenHandler();
239   auto_enrollment_check_screen_actor_ = auto_enrollment_check_screen_handler;
240   AddScreenHandler(auto_enrollment_check_screen_handler);
241 
242   HIDDetectionScreenHandler* hid_detection_screen_handler =
243       new HIDDetectionScreenHandler(core_handler_);
244   hid_detection_screen_actor_ = hid_detection_screen_handler;
245   AddScreenHandler(hid_detection_screen_handler);
246 
247   error_screen_handler_ = new ErrorScreenHandler(network_state_informer_);
248   AddScreenHandler(error_screen_handler_);
249 
250   EnrollmentScreenHandler* enrollment_screen_handler =
251       new EnrollmentScreenHandler(network_state_informer_,
252                                   error_screen_handler_);
253   enrollment_screen_actor_ = enrollment_screen_handler;
254   AddScreenHandler(enrollment_screen_handler);
255 
256   TermsOfServiceScreenHandler* terms_of_service_screen_handler =
257       new TermsOfServiceScreenHandler(core_handler_);
258   terms_of_service_screen_actor_ = terms_of_service_screen_handler;
259   AddScreenHandler(terms_of_service_screen_handler);
260 
261   UserImageScreenHandler* user_image_screen_handler =
262       new UserImageScreenHandler();
263   user_image_screen_actor_ = user_image_screen_handler;
264   AddScreenHandler(user_image_screen_handler);
265 
266   policy::ConsumerManagementService* consumer_management =
267       g_browser_process->platform_part()->browser_policy_connector_chromeos()->
268           GetConsumerManagementService();
269   gaia_screen_handler_ =
270       new GaiaScreenHandler(
271           core_handler_, network_state_informer_, consumer_management);
272   AddScreenHandler(gaia_screen_handler_);
273 
274   signin_screen_handler_ = new SigninScreenHandler(network_state_informer_,
275                                                    error_screen_handler_,
276                                                    core_handler_,
277                                                    gaia_screen_handler_);
278   AddScreenHandler(signin_screen_handler_);
279 
280   AppLaunchSplashScreenHandler* app_launch_splash_screen_handler =
281       new AppLaunchSplashScreenHandler(network_state_informer_,
282                                        error_screen_handler_);
283   AddScreenHandler(app_launch_splash_screen_handler);
284   app_launch_splash_screen_actor_ = app_launch_splash_screen_handler;
285 
286   if (display_type_ == kOobeDisplay) {
287     ControllerPairingScreenHandler* handler =
288         new ControllerPairingScreenHandler();
289     controller_pairing_screen_actor_ = handler;
290     AddScreenHandler(handler);
291   }
292 
293   if (display_type_ == kOobeDisplay) {
294     HostPairingScreenHandler* handler = new HostPairingScreenHandler();
295     host_pairing_screen_actor_ = handler;
296     AddScreenHandler(handler);
297   }
298 
299   // Initialize KioskAppMenuHandler. Note that it is NOT a screen handler.
300   kiosk_app_menu_handler_ = new KioskAppMenuHandler(network_state_informer_);
301   web_ui->AddMessageHandler(kiosk_app_menu_handler_);
302 
303   base::DictionaryValue localized_strings;
304   GetLocalizedStrings(&localized_strings);
305 
306   Profile* profile = Profile::FromWebUI(web_ui);
307   // Set up the chrome://theme/ source, for Chrome logo.
308   ThemeSource* theme = new ThemeSource(profile);
309   content::URLDataSource::Add(profile, theme);
310 
311   // Set up the chrome://terms/ data source, for EULA content.
312   AboutUIHTMLSource* about_source =
313       new AboutUIHTMLSource(chrome::kChromeUITermsHost, profile);
314   content::URLDataSource::Add(profile, about_source);
315 
316   // Set up the chrome://oobe/ source.
317   content::WebUIDataSource::Add(profile,
318                                 CreateOobeUIDataSource(localized_strings,
319                                                        display_type_));
320 
321   // Set up the chrome://userimage/ source.
322   options::UserImageSource* user_image_source =
323       new options::UserImageSource();
324   content::URLDataSource::Add(profile, user_image_source);
325 }
326 
~OobeUI()327 OobeUI::~OobeUI() {
328   core_handler_->SetDelegate(NULL);
329   network_dropdown_handler_->RemoveObserver(update_screen_handler_);
330 }
331 
GetCoreOobeActor()332 CoreOobeActor* OobeUI::GetCoreOobeActor() {
333   return core_handler_;
334 }
335 
GetUpdateScreenActor()336 UpdateScreenActor* OobeUI::GetUpdateScreenActor() {
337   return update_screen_handler_;
338 }
339 
GetNetworkScreenActor()340 NetworkScreenActor* OobeUI::GetNetworkScreenActor() {
341   return network_screen_actor_;
342 }
343 
GetEulaScreenActor()344 EulaScreenActor* OobeUI::GetEulaScreenActor() {
345   return eula_screen_actor_;
346 }
347 
GetEnrollmentScreenActor()348 EnrollmentScreenActor* OobeUI::GetEnrollmentScreenActor() {
349   return enrollment_screen_actor_;
350 }
351 
GetResetScreenActor()352 ResetScreenActor* OobeUI::GetResetScreenActor() {
353   return reset_screen_actor_;
354 }
355 
GetKioskAutolaunchScreenActor()356 KioskAutolaunchScreenActor* OobeUI::GetKioskAutolaunchScreenActor() {
357   return autolaunch_screen_actor_;
358 }
359 
GetKioskEnableScreenActor()360 KioskEnableScreenActor* OobeUI::GetKioskEnableScreenActor() {
361   return kiosk_enable_screen_actor_;
362 }
363 
GetTermsOfServiceScreenActor()364 TermsOfServiceScreenActor* OobeUI::GetTermsOfServiceScreenActor() {
365   return terms_of_service_screen_actor_;
366 }
367 
GetWrongHWIDScreenActor()368 WrongHWIDScreenActor* OobeUI::GetWrongHWIDScreenActor() {
369   return wrong_hwid_screen_actor_;
370 }
371 
GetAutoEnrollmentCheckScreenActor()372 AutoEnrollmentCheckScreenActor* OobeUI::GetAutoEnrollmentCheckScreenActor() {
373   return auto_enrollment_check_screen_actor_;
374 }
375 
GetHIDDetectionScreenActor()376 HIDDetectionScreenActor* OobeUI::GetHIDDetectionScreenActor() {
377   return hid_detection_screen_actor_;
378 }
379 
GetControllerPairingScreenActor()380 ControllerPairingScreenActor* OobeUI::GetControllerPairingScreenActor() {
381   return controller_pairing_screen_actor_;
382 }
383 
GetHostPairingScreenActor()384 HostPairingScreenActor* OobeUI::GetHostPairingScreenActor() {
385   return host_pairing_screen_actor_;
386 }
387 
GetUserImageScreenActor()388 UserImageScreenActor* OobeUI::GetUserImageScreenActor() {
389   return user_image_screen_actor_;
390 }
391 
GetErrorScreenActor()392 ErrorScreenActor* OobeUI::GetErrorScreenActor() {
393   return error_screen_handler_;
394 }
395 
396 SupervisedUserCreationScreenHandler*
GetSupervisedUserCreationScreenActor()397     OobeUI::GetSupervisedUserCreationScreenActor() {
398   return supervised_user_creation_screen_actor_;
399 }
400 
401 AppLaunchSplashScreenActor*
GetAppLaunchSplashScreenActor()402       OobeUI::GetAppLaunchSplashScreenActor() {
403   return app_launch_splash_screen_actor_;
404 }
405 
GetLocalizedStrings(base::DictionaryValue * localized_strings)406 void OobeUI::GetLocalizedStrings(base::DictionaryValue* localized_strings) {
407   // Note, handlers_[0] is a GenericHandler used by the WebUI.
408   for (size_t i = 0; i < handlers_.size(); ++i)
409     handlers_[i]->GetLocalizedStrings(localized_strings);
410   webui::SetFontAndTextDirection(localized_strings);
411   kiosk_app_menu_handler_->GetLocalizedStrings(localized_strings);
412 
413 #if defined(GOOGLE_CHROME_BUILD)
414   localized_strings->SetString("buildType", "chrome");
415 #else
416   localized_strings->SetString("buildType", "chromium");
417 #endif
418 
419   // If we're not doing boot animation then WebUI should trigger
420   // wallpaper load on boot.
421   if (CommandLine::ForCurrentProcess()->HasSwitch(
422           switches::kDisableBootAnimation)) {
423     localized_strings->SetString("bootIntoWallpaper", "on");
424   } else {
425     localized_strings->SetString("bootIntoWallpaper", "off");
426   }
427 
428   bool keyboard_driven_oobe =
429       system::InputDeviceSettings::Get()->ForceKeyboardDrivenUINavigation();
430   localized_strings->SetString("highlightStrength",
431                                keyboard_driven_oobe ? "strong" : "normal");
432 
433   bool new_kiosk_ui = KioskAppMenuHandler::EnableNewKioskUI();
434   localized_strings->SetString("newKioskUI", new_kiosk_ui ? "on" : "off");
435 }
436 
InitializeScreenMaps()437 void OobeUI::InitializeScreenMaps() {
438   screen_names_.resize(SCREEN_UNKNOWN);
439   screen_names_[SCREEN_OOBE_HID_DETECTION] = kScreenOobeHIDDetection;
440   screen_names_[SCREEN_OOBE_NETWORK] = kScreenOobeNetwork;
441   screen_names_[SCREEN_OOBE_EULA] = kScreenOobeEula;
442   screen_names_[SCREEN_OOBE_UPDATE] = kScreenOobeUpdate;
443   screen_names_[SCREEN_OOBE_ENROLLMENT] = kScreenOobeEnrollment;
444   screen_names_[SCREEN_OOBE_RESET] = kScreenOobeReset;
445   screen_names_[SCREEN_GAIA_SIGNIN] = kScreenGaiaSignin;
446   screen_names_[SCREEN_ACCOUNT_PICKER] = kScreenAccountPicker;
447   screen_names_[SCREEN_KIOSK_AUTOLAUNCH] = kScreenKioskAutolaunch;
448   screen_names_[SCREEN_KIOSK_ENABLE] = kScreenKioskEnable;
449   screen_names_[SCREEN_ERROR_MESSAGE] = kScreenErrorMessage;
450   screen_names_[SCREEN_USER_IMAGE_PICKER] = kScreenUserImagePicker;
451   screen_names_[SCREEN_TPM_ERROR] = kScreenTpmError;
452   screen_names_[SCREEN_PASSWORD_CHANGED] = kScreenPasswordChanged;
453   screen_names_[SCREEN_CREATE_SUPERVISED_USER_FLOW] =
454       kScreenSupervisedUserCreationFlow;
455   screen_names_[SCREEN_TERMS_OF_SERVICE] = kScreenTermsOfService;
456   screen_names_[SCREEN_WRONG_HWID] = kScreenWrongHWID;
457   screen_names_[SCREEN_AUTO_ENROLLMENT_CHECK] = kScreenAutoEnrollmentCheck;
458   screen_names_[SCREEN_APP_LAUNCH_SPLASH] = kScreenAppLaunchSplash;
459   screen_names_[SCREEN_CONFIRM_PASSWORD] = kScreenConfirmPassword;
460   screen_names_[SCREEN_FATAL_ERROR] = kScreenFatalError;
461   screen_names_[SCREEN_OOBE_CONTROLLER_PAIRING] = kScreenControllerPairing;
462   screen_names_[SCREEN_OOBE_HOST_PAIRING] = kScreenHostPairing;
463 
464   screen_ids_.clear();
465   for (size_t i = 0; i < screen_names_.size(); ++i)
466     screen_ids_[screen_names_[i]] = static_cast<Screen>(i);
467 }
468 
AddScreenHandler(BaseScreenHandler * handler)469 void OobeUI::AddScreenHandler(BaseScreenHandler* handler) {
470   web_ui()->AddMessageHandler(handler);
471   handlers_.push_back(handler);
472 }
473 
InitializeHandlers()474 void OobeUI::InitializeHandlers() {
475   ready_ = true;
476   for (size_t i = 0; i < ready_callbacks_.size(); ++i)
477     ready_callbacks_[i].Run();
478   ready_callbacks_.clear();
479 
480   // Notify 'initialize' for synchronously loaded screens.
481   for (size_t i = 0; i < handlers_.size(); ++i) {
482     if (handlers_[i]->async_assets_load_id().empty())
483       handlers_[i]->InitializeBase();
484   }
485 }
486 
OnScreenAssetsLoaded(const std::string & async_assets_load_id)487 void OobeUI::OnScreenAssetsLoaded(const std::string& async_assets_load_id) {
488   DCHECK(!async_assets_load_id.empty());
489 
490   for (size_t i = 0; i < handlers_.size(); ++i) {
491     if (handlers_[i]->async_assets_load_id() == async_assets_load_id)
492       handlers_[i]->InitializeBase();
493   }
494 }
495 
IsJSReady(const base::Closure & display_is_ready_callback)496 bool OobeUI::IsJSReady(const base::Closure& display_is_ready_callback) {
497   if (!ready_)
498     ready_callbacks_.push_back(display_is_ready_callback);
499   return ready_;
500 }
501 
ShowOobeUI(bool show)502 void OobeUI::ShowOobeUI(bool show) {
503   core_handler_->ShowOobeUI(show);
504 }
505 
ShowRetailModeLoginSpinner()506 void OobeUI::ShowRetailModeLoginSpinner() {
507   signin_screen_handler_->ShowRetailModeLoginSpinner();
508 }
509 
ShowSigninScreen(const LoginScreenContext & context,SigninScreenHandlerDelegate * delegate,NativeWindowDelegate * native_window_delegate)510 void OobeUI::ShowSigninScreen(const LoginScreenContext& context,
511                               SigninScreenHandlerDelegate* delegate,
512                               NativeWindowDelegate* native_window_delegate) {
513   signin_screen_handler_->SetDelegate(delegate);
514   signin_screen_handler_->SetNativeWindowDelegate(native_window_delegate);
515 
516   LoginScreenContext actual_context(context);
517   actual_context.set_oobe_ui(core_handler_->show_oobe_ui());
518   signin_screen_handler_->Show(actual_context);
519 }
520 
ResetSigninScreenHandlerDelegate()521 void OobeUI::ResetSigninScreenHandlerDelegate() {
522   signin_screen_handler_->SetDelegate(NULL);
523   signin_screen_handler_->SetNativeWindowDelegate(NULL);
524 }
525 
526 
AddObserver(Observer * observer)527 void OobeUI::AddObserver(Observer* observer) {
528   observer_list_.AddObserver(observer);
529 }
530 
RemoveObserver(Observer * observer)531 void OobeUI::RemoveObserver(Observer* observer) {
532   observer_list_.RemoveObserver(observer);
533 }
534 
GetScreenName(Screen screen) const535 const std::string& OobeUI::GetScreenName(Screen screen) const {
536   DCHECK(screen >= 0 && screen < SCREEN_UNKNOWN);
537   return screen_names_[static_cast<size_t>(screen)];
538 }
539 
OnCurrentScreenChanged(const std::string & screen)540 void OobeUI::OnCurrentScreenChanged(const std::string& screen) {
541   previous_screen_ = current_screen_;
542   DCHECK(screen_ids_.count(screen))
543       << "Screen should be registered in InitializeScreenMaps()";
544   Screen new_screen = screen_ids_[screen];
545   FOR_EACH_OBSERVER(Observer,
546                     observer_list_,
547                     OnCurrentScreenChanged(current_screen_, new_screen));
548   current_screen_ = new_screen;
549 }
550 
551 }  // namespace chromeos
552