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.
5 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
7 #include "ash/ash_switches.h"
8 #include "base/command_line.h"
9 #include "base/logging.h"
10 #include "base/memory/ref_counted_memory.h"
11 #include "base/values.h"
12 #include "chrome/browser/browser_about_handler.h"
13 #include "chrome/browser/chrome_notification_types.h"
14 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h"
15 #include "chrome/browser/chromeos/login/enrollment/auto_enrollment_check_screen_actor.h"
16 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen_actor.h"
17 #include "chrome/browser/chromeos/login/lock/screen_locker.h"
18 #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
19 #include "chrome/browser/chromeos/login/users/user_manager.h"
20 #include "chrome/browser/chromeos/login/wizard_controller.h"
21 #include "chrome/browser/chromeos/system/input_device_settings.h"
22 #include "chrome/browser/profiles/profile.h"
23 #include "chrome/browser/ui/webui/about_ui.h"
24 #include "chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h"
25 #include "chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.h"
26 #include "chrome/browser/ui/webui/chromeos/login/base_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/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/locally_managed_user_creation_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/reset_screen_handler.h"
40 #include "chrome/browser/ui/webui/chromeos/login/signin_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_constants.h"
50 #include "chromeos/chromeos_switches.h"
51 #include "content/public/browser/web_ui.h"
52 #include "content/public/browser/web_ui_data_source.h"
53 #include "grit/browser_resources.h"
54 #include "ui/base/resource/resource_bundle.h"
55 #include "ui/base/webui/web_ui_util.h"
61 const char* kKnownDisplayTypes[] = {
63 OobeUI::kLoginDisplay,
65 OobeUI::kUserAddingDisplay,
66 OobeUI::kAppLaunchSplashDisplay
69 const char kStringsJSPath[] = "strings.js";
70 const char kLoginJSPath[] = "login.js";
71 const char kOobeJSPath[] = "oobe.js";
72 const char kKeyboardUtilsJSPath[] = "keyboard_utils.js";
73 const char kDemoUserLoginJSPath[] = "demo_user_login.js";
75 // Paths for deferred resource loading.
76 const char kEnrollmentHTMLPath[] = "enrollment.html";
77 const char kEnrollmentCSSPath[] = "enrollment.css";
78 const char kEnrollmentJSPath[] = "enrollment.js";
80 // Creates a WebUIDataSource for chrome://oobe
81 content::WebUIDataSource* CreateOobeUIDataSource(
82 const base::DictionaryValue& localized_strings,
83 const std::string& display_type) {
84 content::WebUIDataSource* source =
85 content::WebUIDataSource::Create(chrome::kChromeUIOobeHost);
86 source->SetUseJsonJSFormatV2();
87 source->AddLocalizedStrings(localized_strings);
88 source->SetJsonPath(kStringsJSPath);
90 if (chromeos::KioskModeSettings::Get()->IsKioskModeEnabled()) {
91 source->SetDefaultResource(IDR_DEMO_USER_LOGIN_HTML);
92 source->AddResourcePath(kDemoUserLoginJSPath, IDR_DEMO_USER_LOGIN_JS);
95 if (display_type == OobeUI::kOobeDisplay) {
96 source->SetDefaultResource(IDR_OOBE_HTML);
97 source->AddResourcePath(kOobeJSPath, IDR_OOBE_JS);
99 source->SetDefaultResource(IDR_LOGIN_HTML);
100 source->AddResourcePath(kLoginJSPath, IDR_LOGIN_JS);
102 source->AddResourcePath(kKeyboardUtilsJSPath, IDR_KEYBOARD_UTILS_JS);
103 source->OverrideContentSecurityPolicyFrameSrc(
104 "frame-src chrome://terms/ "
105 "chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik/;");
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);
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;
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";
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::kScreenManagedUserCreationFlow[]
151 = "managed-user-creation";
152 const char OobeUI::kScreenTermsOfService[] = "terms-of-service";
153 const char OobeUI::kScreenWrongHWID[] = "wrong-hwid";
154 const char OobeUI::kScreenAutoEnrollmentCheck[]
155 = "auto-enrollment-check";
156 const char OobeUI::kScreenHIDDetection[] = "hid-detection";
157 const char OobeUI::kScreenAppLaunchSplash[] = "app-launch-splash";
158 const char OobeUI::kScreenConfirmPassword[] = "confirm-password";
159 const char OobeUI::kScreenFatalError[] = "fatal-error";
161 OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url)
162 : WebUIController(web_ui),
164 network_dropdown_handler_(NULL),
165 update_screen_handler_(NULL),
166 network_screen_actor_(NULL),
167 eula_screen_actor_(NULL),
168 hid_detection_screen_actor_(NULL),
169 reset_screen_actor_(NULL),
170 autolaunch_screen_actor_(NULL),
171 kiosk_enable_screen_actor_(NULL),
172 wrong_hwid_screen_actor_(NULL),
173 auto_enrollment_check_screen_actor_(NULL),
174 locally_managed_user_creation_screen_actor_(NULL),
175 error_screen_handler_(NULL),
176 signin_screen_handler_(NULL),
177 terms_of_service_screen_actor_(NULL),
178 user_image_screen_actor_(NULL),
179 kiosk_app_menu_handler_(NULL),
180 current_screen_(SCREEN_UNKNOWN),
181 previous_screen_(SCREEN_UNKNOWN),
183 display_type_ = GetDisplayType(url);
184 InitializeScreenMaps();
186 network_state_informer_ = new NetworkStateInformer();
187 network_state_informer_->Init();
189 core_handler_ = new CoreOobeHandler(this);
190 AddScreenHandler(core_handler_);
191 core_handler_->SetDelegate(this);
193 network_dropdown_handler_ = new NetworkDropdownHandler();
194 AddScreenHandler(network_dropdown_handler_);
196 update_screen_handler_ = new UpdateScreenHandler();
197 AddScreenHandler(update_screen_handler_);
198 network_dropdown_handler_->AddObserver(update_screen_handler_);
200 if (display_type_ == kOobeDisplay) {
201 NetworkScreenHandler* network_screen_handler =
202 new NetworkScreenHandler(core_handler_);
203 network_screen_actor_ = network_screen_handler;
204 AddScreenHandler(network_screen_handler);
207 EulaScreenHandler* eula_screen_handler = new EulaScreenHandler(core_handler_);
208 eula_screen_actor_ = eula_screen_handler;
209 AddScreenHandler(eula_screen_handler);
211 ResetScreenHandler* reset_screen_handler = new ResetScreenHandler();
212 reset_screen_actor_ = reset_screen_handler;
213 AddScreenHandler(reset_screen_handler);
215 KioskAutolaunchScreenHandler* autolaunch_screen_handler =
216 new KioskAutolaunchScreenHandler();
217 autolaunch_screen_actor_ = autolaunch_screen_handler;
218 AddScreenHandler(autolaunch_screen_handler);
220 KioskEnableScreenHandler* kiosk_enable_screen_handler =
221 new KioskEnableScreenHandler();
222 kiosk_enable_screen_actor_ = kiosk_enable_screen_handler;
223 AddScreenHandler(kiosk_enable_screen_handler);
225 LocallyManagedUserCreationScreenHandler*
226 locally_managed_user_creation_screen_handler =
227 new LocallyManagedUserCreationScreenHandler();
228 locally_managed_user_creation_screen_actor_ =
229 locally_managed_user_creation_screen_handler;
230 AddScreenHandler(locally_managed_user_creation_screen_handler);
232 WrongHWIDScreenHandler* wrong_hwid_screen_handler =
233 new WrongHWIDScreenHandler();
234 wrong_hwid_screen_actor_ = wrong_hwid_screen_handler;
235 AddScreenHandler(wrong_hwid_screen_handler);
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);
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);
247 EnrollmentScreenHandler* enrollment_screen_handler =
248 new EnrollmentScreenHandler();
249 enrollment_screen_actor_ = enrollment_screen_handler;
250 AddScreenHandler(enrollment_screen_handler);
252 TermsOfServiceScreenHandler* terms_of_service_screen_handler =
253 new TermsOfServiceScreenHandler;
254 terms_of_service_screen_actor_ = terms_of_service_screen_handler;
255 AddScreenHandler(terms_of_service_screen_handler);
257 UserImageScreenHandler* user_image_screen_handler =
258 new UserImageScreenHandler();
259 user_image_screen_actor_ = user_image_screen_handler;
260 AddScreenHandler(user_image_screen_handler);
262 error_screen_handler_ = new ErrorScreenHandler(network_state_informer_);
263 AddScreenHandler(error_screen_handler_);
265 gaia_screen_handler_ = new GaiaScreenHandler(network_state_informer_);
266 AddScreenHandler(gaia_screen_handler_);
268 signin_screen_handler_ = new SigninScreenHandler(network_state_informer_,
269 error_screen_handler_,
271 gaia_screen_handler_);
272 AddScreenHandler(signin_screen_handler_);
274 AppLaunchSplashScreenHandler* app_launch_splash_screen_handler =
275 new AppLaunchSplashScreenHandler(network_state_informer_,
276 error_screen_handler_);
277 AddScreenHandler(app_launch_splash_screen_handler);
278 app_launch_splash_screen_actor_ = app_launch_splash_screen_handler;
280 // Initialize KioskAppMenuHandler. Note that it is NOT a screen handler.
281 kiosk_app_menu_handler_ = new KioskAppMenuHandler;
282 web_ui->AddMessageHandler(kiosk_app_menu_handler_);
284 base::DictionaryValue localized_strings;
285 GetLocalizedStrings(&localized_strings);
287 Profile* profile = Profile::FromWebUI(web_ui);
288 // Set up the chrome://theme/ source, for Chrome logo.
289 ThemeSource* theme = new ThemeSource(profile);
290 content::URLDataSource::Add(profile, theme);
292 // Set up the chrome://terms/ data source, for EULA content.
293 AboutUIHTMLSource* about_source =
294 new AboutUIHTMLSource(chrome::kChromeUITermsHost, profile);
295 content::URLDataSource::Add(profile, about_source);
297 // Set up the chrome://oobe/ source.
298 content::WebUIDataSource::Add(profile,
299 CreateOobeUIDataSource(localized_strings,
302 // Set up the chrome://userimage/ source.
303 options::UserImageSource* user_image_source =
304 new options::UserImageSource();
305 content::URLDataSource::Add(profile, user_image_source);
309 core_handler_->SetDelegate(NULL);
310 network_dropdown_handler_->RemoveObserver(update_screen_handler_);
313 void OobeUI::ShowScreen(WizardScreen* screen) {
317 void OobeUI::HideScreen(WizardScreen* screen) {
321 CoreOobeActor* OobeUI::GetCoreOobeActor() {
322 return core_handler_;
325 UpdateScreenActor* OobeUI::GetUpdateScreenActor() {
326 return update_screen_handler_;
329 NetworkScreenActor* OobeUI::GetNetworkScreenActor() {
330 return network_screen_actor_;
333 EulaScreenActor* OobeUI::GetEulaScreenActor() {
334 return eula_screen_actor_;
337 EnrollmentScreenActor* OobeUI::GetEnrollmentScreenActor() {
338 return enrollment_screen_actor_;
341 ResetScreenActor* OobeUI::GetResetScreenActor() {
342 return reset_screen_actor_;
345 KioskAutolaunchScreenActor* OobeUI::GetKioskAutolaunchScreenActor() {
346 return autolaunch_screen_actor_;
349 KioskEnableScreenActor* OobeUI::GetKioskEnableScreenActor() {
350 return kiosk_enable_screen_actor_;
353 TermsOfServiceScreenActor* OobeUI::GetTermsOfServiceScreenActor() {
354 return terms_of_service_screen_actor_;
357 WrongHWIDScreenActor* OobeUI::GetWrongHWIDScreenActor() {
358 return wrong_hwid_screen_actor_;
361 AutoEnrollmentCheckScreenActor* OobeUI::GetAutoEnrollmentCheckScreenActor() {
362 return auto_enrollment_check_screen_actor_;
365 HIDDetectionScreenActor* OobeUI::GetHIDDetectionScreenActor() {
366 return hid_detection_screen_actor_;
369 UserImageScreenActor* OobeUI::GetUserImageScreenActor() {
370 return user_image_screen_actor_;
373 ErrorScreenActor* OobeUI::GetErrorScreenActor() {
374 return error_screen_handler_;
377 LocallyManagedUserCreationScreenHandler*
378 OobeUI::GetLocallyManagedUserCreationScreenActor() {
379 return locally_managed_user_creation_screen_actor_;
382 AppLaunchSplashScreenActor*
383 OobeUI::GetAppLaunchSplashScreenActor() {
384 return app_launch_splash_screen_actor_;
387 void OobeUI::GetLocalizedStrings(base::DictionaryValue* localized_strings) {
388 // Note, handlers_[0] is a GenericHandler used by the WebUI.
389 for (size_t i = 0; i < handlers_.size(); ++i)
390 handlers_[i]->GetLocalizedStrings(localized_strings);
391 webui::SetFontAndTextDirection(localized_strings);
392 kiosk_app_menu_handler_->GetLocalizedStrings(localized_strings);
394 #if defined(GOOGLE_CHROME_BUILD)
395 localized_strings->SetString("buildType", "chrome");
397 localized_strings->SetString("buildType", "chromium");
400 // If we're not doing boot animation then WebUI should trigger
401 // wallpaper load on boot.
402 if (CommandLine::ForCurrentProcess()->HasSwitch(
403 switches::kDisableBootAnimation)) {
404 localized_strings->SetString("bootIntoWallpaper", "on");
406 localized_strings->SetString("bootIntoWallpaper", "off");
409 bool keyboard_driven_oobe =
410 system::InputDeviceSettings::Get()->ForceKeyboardDrivenUINavigation();
411 localized_strings->SetString("highlightStrength",
412 keyboard_driven_oobe ? "strong" : "normal");
414 bool new_kiosk_ui = KioskAppMenuHandler::EnableNewKioskUI();
415 localized_strings->SetString("newKioskUI", new_kiosk_ui ? "on" : "off");
418 void OobeUI::InitializeScreenMaps() {
419 screen_names_.resize(SCREEN_UNKNOWN);
420 screen_names_[SCREEN_OOBE_HID_DETECTION] = kScreenOobeHIDDetection;
421 screen_names_[SCREEN_OOBE_NETWORK] = kScreenOobeNetwork;
422 screen_names_[SCREEN_OOBE_EULA] = kScreenOobeEula;
423 screen_names_[SCREEN_OOBE_UPDATE] = kScreenOobeUpdate;
424 screen_names_[SCREEN_OOBE_ENROLLMENT] = kScreenOobeEnrollment;
425 screen_names_[SCREEN_OOBE_RESET] = kScreenOobeReset;
426 screen_names_[SCREEN_GAIA_SIGNIN] = kScreenGaiaSignin;
427 screen_names_[SCREEN_ACCOUNT_PICKER] = kScreenAccountPicker;
428 screen_names_[SCREEN_KIOSK_AUTOLAUNCH] = kScreenKioskAutolaunch;
429 screen_names_[SCREEN_KIOSK_ENABLE] = kScreenKioskEnable;
430 screen_names_[SCREEN_ERROR_MESSAGE] = kScreenErrorMessage;
431 screen_names_[SCREEN_USER_IMAGE_PICKER] = kScreenUserImagePicker;
432 screen_names_[SCREEN_TPM_ERROR] = kScreenTpmError;
433 screen_names_[SCREEN_PASSWORD_CHANGED] = kScreenPasswordChanged;
434 screen_names_[SCREEN_CREATE_MANAGED_USER_FLOW] =
435 kScreenManagedUserCreationFlow;
436 screen_names_[SCREEN_TERMS_OF_SERVICE] = kScreenTermsOfService;
437 screen_names_[SCREEN_WRONG_HWID] = kScreenWrongHWID;
438 screen_names_[SCREEN_AUTO_ENROLLMENT_CHECK] = kScreenAutoEnrollmentCheck;
439 screen_names_[SCREEN_APP_LAUNCH_SPLASH] = kScreenAppLaunchSplash;
440 screen_names_[SCREEN_CONFIRM_PASSWORD] = kScreenConfirmPassword;
441 screen_names_[SCREEN_FATAL_ERROR] = kScreenFatalError;
444 for (size_t i = 0; i < screen_names_.size(); ++i)
445 screen_ids_[screen_names_[i]] = static_cast<Screen>(i);
448 void OobeUI::AddScreenHandler(BaseScreenHandler* handler) {
449 web_ui()->AddMessageHandler(handler);
450 handlers_.push_back(handler);
453 void OobeUI::InitializeHandlers() {
455 for (size_t i = 0; i < ready_callbacks_.size(); ++i)
456 ready_callbacks_[i].Run();
457 ready_callbacks_.clear();
459 // Notify 'initialize' for synchronously loaded screens.
460 for (size_t i = 0; i < handlers_.size(); ++i) {
461 if (handlers_[i]->async_assets_load_id().empty())
462 handlers_[i]->InitializeBase();
466 void OobeUI::OnScreenAssetsLoaded(const std::string& async_assets_load_id) {
467 DCHECK(!async_assets_load_id.empty());
469 for (size_t i = 0; i < handlers_.size(); ++i) {
470 if (handlers_[i]->async_assets_load_id() == async_assets_load_id)
471 handlers_[i]->InitializeBase();
475 bool OobeUI::IsJSReady(const base::Closure& display_is_ready_callback) {
477 ready_callbacks_.push_back(display_is_ready_callback);
481 void OobeUI::ShowOobeUI(bool show) {
482 core_handler_->ShowOobeUI(show);
485 void OobeUI::ShowRetailModeLoginSpinner() {
486 signin_screen_handler_->ShowRetailModeLoginSpinner();
489 void OobeUI::ShowSigninScreen(const LoginScreenContext& context,
490 SigninScreenHandlerDelegate* delegate,
491 NativeWindowDelegate* native_window_delegate) {
492 signin_screen_handler_->SetDelegate(delegate);
493 signin_screen_handler_->SetNativeWindowDelegate(native_window_delegate);
495 LoginScreenContext actual_context(context);
496 actual_context.set_oobe_ui(core_handler_->show_oobe_ui());
497 signin_screen_handler_->Show(actual_context);
500 void OobeUI::ResetSigninScreenHandlerDelegate() {
501 signin_screen_handler_->SetDelegate(NULL);
502 signin_screen_handler_->SetNativeWindowDelegate(NULL);
506 void OobeUI::AddObserver(Observer* observer) {
507 observer_list_.AddObserver(observer);
510 void OobeUI::RemoveObserver(Observer* observer) {
511 observer_list_.RemoveObserver(observer);
514 const std::string& OobeUI::GetScreenName(Screen screen) const {
515 DCHECK(screen >= 0 && screen < SCREEN_UNKNOWN);
516 return screen_names_[static_cast<size_t>(screen)];
519 void OobeUI::OnCurrentScreenChanged(const std::string& screen) {
520 previous_screen_ = current_screen_;
521 if (screen_ids_.count(screen)) {
522 Screen new_screen = screen_ids_[screen];
523 FOR_EACH_OBSERVER(Observer,
525 OnCurrentScreenChanged(current_screen_, new_screen));
526 current_screen_ = new_screen;
528 NOTREACHED() << "Screen should be registered in InitializeScreenMaps()";
529 current_screen_ = SCREEN_UNKNOWN;
533 } // namespace chromeos