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