oobe_ui.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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 <string> 8 9#include "ash/ash_switches.h" 10#include "base/command_line.h" 11#include "base/logging.h" 12#include "base/memory/ref_counted_memory.h" 13#include "base/values.h" 14#include "chrome/browser/browser_about_handler.h" 15#include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h" 16#include "chrome/browser/chromeos/login/enrollment/enrollment_screen_actor.h" 17#include "chrome/browser/chromeos/login/login_display_host_impl.h" 18#include "chrome/browser/chromeos/login/screen_locker.h" 19#include "chrome/browser/chromeos/login/user_manager.h" 20#include "chrome/browser/chromeos/login/wizard_controller.h" 21#include "chrome/browser/chromeos/system/statistics_provider.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/base_screen_handler.h" 25#include "chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h" 26#include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h" 27#include "chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h" 28#include "chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.h" 29#include "chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.h" 30#include "chrome/browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.h" 31#include "chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.h" 32#include "chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.h" 33#include "chrome/browser/ui/webui/chromeos/login/network_screen_handler.h" 34#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" 35#include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h" 36#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" 37#include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h" 38#include "chrome/browser/ui/webui/chromeos/login/update_screen_handler.h" 39#include "chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h" 40#include "chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.h" 41#include "chrome/browser/ui/webui/options/chromeos/user_image_source.h" 42#include "chrome/browser/ui/webui/theme_source.h" 43#include "chrome/common/chrome_constants.h" 44#include "chrome/common/url_constants.h" 45#include "chromeos/chromeos_constants.h" 46#include "chromeos/chromeos_switches.h" 47#include "content/public/browser/web_ui.h" 48#include "content/public/browser/web_ui_data_source.h" 49#include "grit/browser_resources.h" 50#include "ui/base/resource/resource_bundle.h" 51#include "ui/webui/web_ui_util.h" 52 53namespace chromeos { 54 55namespace { 56 57// Path for a stripped down login page that does not have OOBE elements. 58const char kLoginPath[] = "login#login"; 59 60const char kStringsJSPath[] = "strings.js"; 61const char kLoginJSPath[] = "login.js"; 62const char kOobeJSPath[] = "oobe.js"; 63const char kKeyboardUtilsJSPath[] = "keyboard_utils.js"; 64const char kDemoUserLoginJSPath[] = "demo_user_login.js"; 65 66// Paths for deferred resource loading. 67const char kEnrollmentHTMLPath[] = "enrollment.html"; 68const char kEnrollmentCSSPath[] = "enrollment.css"; 69const char kEnrollmentJSPath[] = "enrollment.js"; 70 71// Filter handler of chrome://oobe data source. 72bool HandleRequestCallback( 73 const std::string& path, 74 const content::WebUIDataSource::GotDataCallback& callback) { 75 if (UserManager::Get()->IsUserLoggedIn() && 76 !UserManager::Get()->IsLoggedInAsStub() && 77 !ScreenLocker::default_screen_locker()) { 78 scoped_refptr<base::RefCountedBytes> empty_bytes = 79 new base::RefCountedBytes(); 80 callback.Run(empty_bytes.get()); 81 return true; 82 } 83 84 return false; 85} 86 87// Creates a WebUIDataSource for chrome://oobe 88content::WebUIDataSource* CreateOobeUIDataSource( 89 const base::DictionaryValue& localized_strings) { 90 content::WebUIDataSource* source = 91 content::WebUIDataSource::Create(chrome::kChromeUIOobeHost); 92 source->SetUseJsonJSFormatV2(); 93 source->AddLocalizedStrings(localized_strings); 94 source->SetJsonPath(kStringsJSPath); 95 96 if (chromeos::KioskModeSettings::Get()->IsKioskModeEnabled()) { 97 source->SetDefaultResource(IDR_DEMO_USER_LOGIN_HTML); 98 source->AddResourcePath(kDemoUserLoginJSPath, 99 IDR_DEMO_USER_LOGIN_JS); 100 return source; 101 } 102 103 source->SetDefaultResource(IDR_OOBE_HTML); 104 source->AddResourcePath(kOobeJSPath, 105 IDR_OOBE_JS); 106 source->AddResourcePath(kLoginPath, 107 IDR_LOGIN_HTML); 108 source->AddResourcePath(kLoginJSPath, 109 IDR_LOGIN_JS); 110 source->AddResourcePath(kKeyboardUtilsJSPath, 111 IDR_KEYBOARD_UTILS_JS); 112 source->OverrideContentSecurityPolicyFrameSrc( 113 "frame-src chrome://terms/ " 114 "chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik/;"); 115 116 // Serve deferred resources. 117 source->AddResourcePath(kEnrollmentHTMLPath, 118 IDR_OOBE_ENROLLMENT_HTML); 119 source->AddResourcePath(kEnrollmentCSSPath, 120 IDR_OOBE_ENROLLMENT_CSS); 121 source->AddResourcePath(kEnrollmentJSPath, 122 IDR_OOBE_ENROLLMENT_JS); 123 124 return source; 125} 126 127} // namespace 128 129// static 130const char OobeUI::kScreenOobeNetwork[] = "connect"; 131const char OobeUI::kScreenOobeEula[] = "eula"; 132const char OobeUI::kScreenOobeUpdate[] = "update"; 133const char OobeUI::kScreenOobeEnrollment[] = "oauth-enrollment"; 134const char OobeUI::kScreenGaiaSignin[] = "gaia-signin"; 135const char OobeUI::kScreenAccountPicker[] = "account-picker"; 136const char OobeUI::kScreenKioskAutolaunch[] = "autolaunch"; 137const char OobeUI::kScreenKioskEnable[] = "kiosk-enable"; 138const char OobeUI::kScreenErrorMessage[] = "error-message"; 139const char OobeUI::kScreenUserImagePicker[] = "user-image"; 140const char OobeUI::kScreenTpmError[] = "tpm-error-message"; 141const char OobeUI::kScreenPasswordChanged[] = "password-changed"; 142const char OobeUI::kScreenManagedUserCreationFlow[] 143 = "managed-user-creation"; 144const char OobeUI::kScreenTermsOfService[] = "terms-of-service"; 145const char OobeUI::kScreenWrongHWID[] = "wrong-hwid"; 146 147OobeUI::OobeUI(content::WebUI* web_ui) 148 : WebUIController(web_ui), 149 update_screen_handler_(NULL), 150 network_screen_actor_(NULL), 151 eula_screen_actor_(NULL), 152 reset_screen_actor_(NULL), 153 autolaunch_screen_actor_(NULL), 154 kiosk_enable_screen_actor_(NULL), 155 wrong_hwid_screen_actor_(NULL), 156 locally_managed_user_creation_screen_actor_(NULL), 157 error_screen_handler_(NULL), 158 signin_screen_handler_(NULL), 159 terms_of_service_screen_actor_(NULL), 160 user_image_screen_actor_(NULL), 161 kiosk_app_menu_handler_(NULL), 162 current_screen_(SCREEN_UNKNOWN), 163 ready_(false) { 164 InitializeScreenMaps(); 165 166 network_state_informer_ = new NetworkStateInformer(); 167 network_state_informer_->Init(); 168 169 core_handler_ = new CoreOobeHandler(this); 170 AddScreenHandler(core_handler_); 171 core_handler_->SetDelegate(this); 172 173 AddScreenHandler(new NetworkDropdownHandler); 174 175 update_screen_handler_ = new UpdateScreenHandler(); 176 AddScreenHandler(update_screen_handler_); 177 178 NetworkScreenHandler* network_screen_handler = new NetworkScreenHandler(); 179 network_screen_actor_ = network_screen_handler; 180 AddScreenHandler(network_screen_handler); 181 182 EulaScreenHandler* eula_screen_handler = new EulaScreenHandler(); 183 eula_screen_actor_ = eula_screen_handler; 184 AddScreenHandler(eula_screen_handler); 185 186 ResetScreenHandler* reset_screen_handler = new ResetScreenHandler(); 187 reset_screen_actor_ = reset_screen_handler; 188 AddScreenHandler(reset_screen_handler); 189 190 KioskAutolaunchScreenHandler* autolaunch_screen_handler = 191 new KioskAutolaunchScreenHandler(); 192 autolaunch_screen_actor_ = autolaunch_screen_handler; 193 AddScreenHandler(autolaunch_screen_handler); 194 195 KioskEnableScreenHandler* kiosk_enable_screen_handler = 196 new KioskEnableScreenHandler(); 197 kiosk_enable_screen_actor_ = kiosk_enable_screen_handler; 198 AddScreenHandler(kiosk_enable_screen_handler); 199 200 LocallyManagedUserCreationScreenHandler* 201 locally_managed_user_creation_screen_handler = 202 new LocallyManagedUserCreationScreenHandler(); 203 locally_managed_user_creation_screen_actor_ = 204 locally_managed_user_creation_screen_handler; 205 AddScreenHandler(locally_managed_user_creation_screen_handler); 206 207 WrongHWIDScreenHandler* wrong_hwid_screen_handler = 208 new WrongHWIDScreenHandler(); 209 wrong_hwid_screen_actor_ = wrong_hwid_screen_handler; 210 AddScreenHandler(wrong_hwid_screen_handler); 211 212 EnrollmentScreenHandler* enrollment_screen_handler = 213 new EnrollmentScreenHandler(); 214 enrollment_screen_actor_ = enrollment_screen_handler; 215 AddScreenHandler(enrollment_screen_handler); 216 217 TermsOfServiceScreenHandler* terms_of_service_screen_handler = 218 new TermsOfServiceScreenHandler; 219 terms_of_service_screen_actor_ = terms_of_service_screen_handler; 220 AddScreenHandler(terms_of_service_screen_handler); 221 222 UserImageScreenHandler* user_image_screen_handler = 223 new UserImageScreenHandler(); 224 user_image_screen_actor_ = user_image_screen_handler; 225 AddScreenHandler(user_image_screen_handler); 226 227 error_screen_handler_ = new ErrorScreenHandler(network_state_informer_); 228 AddScreenHandler(error_screen_handler_); 229 230 signin_screen_handler_ = new SigninScreenHandler(network_state_informer_, 231 error_screen_handler_); 232 AddScreenHandler(signin_screen_handler_); 233 234 // Initialize KioskAppMenuHandler. Note that it is NOT a screen handler. 235 kiosk_app_menu_handler_ = new KioskAppMenuHandler; 236 web_ui->AddMessageHandler(kiosk_app_menu_handler_); 237 238 base::DictionaryValue localized_strings; 239 GetLocalizedStrings(&localized_strings); 240 241 Profile* profile = Profile::FromWebUI(web_ui); 242 // Set up the chrome://theme/ source, for Chrome logo. 243 ThemeSource* theme = new ThemeSource(profile); 244 content::URLDataSource::Add(profile, theme); 245 246 // Set up the chrome://terms/ data source, for EULA content. 247 AboutUIHTMLSource* about_source = 248 new AboutUIHTMLSource(chrome::kChromeUITermsHost, profile); 249 content::URLDataSource::Add(profile, about_source); 250 251 // Set up the chrome://oobe/ source. 252 content::WebUIDataSource::Add(profile, 253 CreateOobeUIDataSource(localized_strings)); 254 255 // Set up the chrome://userimage/ source. 256 options::UserImageSource* user_image_source = 257 new options::UserImageSource(); 258 content::URLDataSource::Add(profile, user_image_source); 259} 260 261OobeUI::~OobeUI() { 262 core_handler_->SetDelegate(NULL); 263} 264 265void OobeUI::ShowScreen(WizardScreen* screen) { 266 screen->Show(); 267} 268 269void OobeUI::HideScreen(WizardScreen* screen) { 270 screen->Hide(); 271} 272 273UpdateScreenActor* OobeUI::GetUpdateScreenActor() { 274 return update_screen_handler_; 275} 276 277NetworkScreenActor* OobeUI::GetNetworkScreenActor() { 278 return network_screen_actor_; 279} 280 281EulaScreenActor* OobeUI::GetEulaScreenActor() { 282 return eula_screen_actor_; 283} 284 285EnrollmentScreenActor* OobeUI::GetEnrollmentScreenActor() { 286 return enrollment_screen_actor_; 287} 288 289ResetScreenActor* OobeUI::GetResetScreenActor() { 290 return reset_screen_actor_; 291} 292 293KioskAutolaunchScreenActor* OobeUI::GetKioskAutolaunchScreenActor() { 294 return autolaunch_screen_actor_; 295} 296 297KioskEnableScreenActor* OobeUI::GetKioskEnableScreenActor() { 298 return kiosk_enable_screen_actor_; 299} 300 301TermsOfServiceScreenActor* OobeUI::GetTermsOfServiceScreenActor() { 302 return terms_of_service_screen_actor_; 303} 304 305WrongHWIDScreenActor* OobeUI::GetWrongHWIDScreenActor() { 306 return wrong_hwid_screen_actor_; 307} 308 309UserImageScreenActor* OobeUI::GetUserImageScreenActor() { 310 return user_image_screen_actor_; 311} 312 313ErrorScreenActor* OobeUI::GetErrorScreenActor() { 314 return error_screen_handler_; 315} 316 317LocallyManagedUserCreationScreenHandler* 318 OobeUI::GetLocallyManagedUserCreationScreenActor() { 319 return locally_managed_user_creation_screen_actor_; 320} 321 322void OobeUI::GetLocalizedStrings(base::DictionaryValue* localized_strings) { 323 // Note, handlers_[0] is a GenericHandler used by the WebUI. 324 for (size_t i = 0; i < handlers_.size(); ++i) 325 handlers_[i]->GetLocalizedStrings(localized_strings); 326 webui::SetFontAndTextDirection(localized_strings); 327 kiosk_app_menu_handler_->GetLocalizedStrings(localized_strings); 328 329#if defined(GOOGLE_CHROME_BUILD) 330 localized_strings->SetString("buildType", "chrome"); 331#else 332 localized_strings->SetString("buildType", "chromium"); 333#endif 334 335 if (CommandLine::ForCurrentProcess()-> 336 HasSwitch(ash::switches::kAshDisableNewLockAnimations)) 337 localized_strings->SetString("lockAnimationsType", "old"); 338 else 339 localized_strings->SetString("lockAnimationsType", "new"); 340 341 // If we're not doing boot animation then WebUI should trigger 342 // wallpaper load on boot. 343 if (CommandLine::ForCurrentProcess()->HasSwitch( 344 switches::kDisableBootAnimation)) { 345 localized_strings->SetString("bootIntoWallpaper", "on"); 346 } else { 347 localized_strings->SetString("bootIntoWallpaper", "off"); 348 } 349 350 bool keyboard_driven_oobe = false; 351 system::StatisticsProvider::GetInstance()->GetMachineFlag( 352 chromeos::system::kOemKeyboardDrivenOobeKey, &keyboard_driven_oobe); 353 localized_strings->SetString("highlightStrength", 354 keyboard_driven_oobe ? "strong" : "normal"); 355} 356 357void OobeUI::InitializeScreenMaps() { 358 screen_names_.resize(SCREEN_UNKNOWN); 359 screen_names_[SCREEN_OOBE_NETWORK] = kScreenOobeNetwork; 360 screen_names_[SCREEN_OOBE_EULA] = kScreenOobeEula; 361 screen_names_[SCREEN_OOBE_UPDATE] = kScreenOobeUpdate; 362 screen_names_[SCREEN_OOBE_ENROLLMENT] = kScreenOobeEnrollment; 363 screen_names_[SCREEN_GAIA_SIGNIN] = kScreenGaiaSignin; 364 screen_names_[SCREEN_ACCOUNT_PICKER] = kScreenAccountPicker; 365 screen_names_[SCREEN_KIOSK_AUTOLAUNCH] = kScreenKioskAutolaunch; 366 screen_names_[SCREEN_KIOSK_ENABLE] = kScreenKioskEnable; 367 screen_names_[SCREEN_ERROR_MESSAGE] = kScreenErrorMessage; 368 screen_names_[SCREEN_USER_IMAGE_PICKER] = kScreenUserImagePicker; 369 screen_names_[SCREEN_TPM_ERROR] = kScreenTpmError; 370 screen_names_[SCREEN_PASSWORD_CHANGED] = kScreenPasswordChanged; 371 screen_names_[SCREEN_CREATE_MANAGED_USER_FLOW] = 372 kScreenManagedUserCreationFlow; 373 screen_names_[SCREEN_TERMS_OF_SERVICE] = kScreenTermsOfService; 374 screen_names_[SCREEN_WRONG_HWID] = kScreenWrongHWID; 375 376 screen_ids_.clear(); 377 for (size_t i = 0; i < screen_names_.size(); ++i) 378 screen_ids_[screen_names_[i]] = static_cast<Screen>(i); 379} 380 381void OobeUI::AddScreenHandler(BaseScreenHandler* handler) { 382 web_ui()->AddMessageHandler(handler); 383 handlers_.push_back(handler); 384} 385 386void OobeUI::InitializeHandlers() { 387 ready_ = true; 388 for (size_t i = 0; i < ready_callbacks_.size(); ++i) 389 ready_callbacks_[i].Run(); 390 ready_callbacks_.clear(); 391 392 for (size_t i = 0; i < handlers_.size(); ++i) 393 handlers_[i]->InitializeBase(); 394} 395 396bool OobeUI::IsJSReady(const base::Closure& display_is_ready_callback) { 397 if (!ready_) 398 ready_callbacks_.push_back(display_is_ready_callback); 399 return ready_; 400} 401 402void OobeUI::ShowOobeUI(bool show) { 403 core_handler_->ShowOobeUI(show); 404} 405 406void OobeUI::ShowRetailModeLoginSpinner() { 407 signin_screen_handler_->ShowRetailModeLoginSpinner(); 408} 409 410void OobeUI::ShowSigninScreen(SigninScreenHandlerDelegate* delegate, 411 NativeWindowDelegate* native_window_delegate) { 412 signin_screen_handler_->SetDelegate(delegate); 413 signin_screen_handler_->SetNativeWindowDelegate(native_window_delegate); 414 signin_screen_handler_->Show(core_handler_->show_oobe_ui()); 415} 416 417void OobeUI::ResetSigninScreenHandlerDelegate() { 418 signin_screen_handler_->SetDelegate(NULL); 419 signin_screen_handler_->SetNativeWindowDelegate(NULL); 420} 421 422const std::string& OobeUI::GetScreenName(Screen screen) const { 423 DCHECK(screen >= 0 && screen < SCREEN_UNKNOWN); 424 return screen_names_[static_cast<size_t>(screen)]; 425} 426 427void OobeUI::OnCurrentScreenChanged(const std::string& screen) { 428 if (screen_ids_.count(screen)) { 429 current_screen_ = screen_ids_[screen]; 430 } else { 431 NOTREACHED() << "Screen should be registered in InitializeScreenMaps()"; 432 current_screen_ = SCREEN_UNKNOWN; 433 } 434} 435 436} // namespace chromeos 437