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