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