1// Copyright (c) 2011 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#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_OOBE_UI_H_
6#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_OOBE_UI_H_
7
8#include <map>
9#include <string>
10#include <vector>
11
12#include "base/compiler_specific.h"
13#include "base/memory/ref_counted.h"
14#include "base/observer_list.h"
15#include "chrome/browser/chromeos/login/ui/oobe_display.h"
16#include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h"
17#include "content/public/browser/web_ui_controller.h"
18
19namespace base {
20class DictionaryValue;
21}  // namespace base
22
23namespace chromeos {
24class AppLaunchSplashScreenActor;
25class BaseScreenHandler;
26class ControllerPairingScreenActor;
27class ErrorScreenHandler;
28class HostPairingScreenActor;
29class KioskAppMenuHandler;
30class KioskEnableScreenActor;
31class LoginScreenContext;
32class NativeWindowDelegate;
33class NetworkDropdownHandler;
34class NetworkStateInformer;
35class GaiaScreenHandler;
36class SigninScreenHandler;
37class SigninScreenHandlerDelegate;
38class UpdateScreenHandler;
39
40// A custom WebUI that defines datasource for out-of-box-experience (OOBE) UI:
41// - welcome screen (setup language/keyboard/network).
42// - eula screen (CrOS (+ OEM) EULA content/TPM password/crash reporting).
43// - update screen.
44class OobeUI : public OobeDisplay,
45               public content::WebUIController,
46               public CoreOobeHandler::Delegate {
47 public:
48  class Observer {
49   public:
50    virtual ~Observer() {}
51    virtual void OnCurrentScreenChanged(
52        Screen current_screen, Screen new_screen) = 0;
53  };
54
55  // List of known types of OobeUI. Type added as path in chrome://oobe url, for
56  // example chrome://oobe/user-adding.
57  static const char kOobeDisplay[];
58  static const char kLoginDisplay[];
59  static const char kLockDisplay[];
60  static const char kUserAddingDisplay[];
61  static const char kAppLaunchSplashDisplay[];
62
63  // JS oobe/login screens names.
64  static const char kScreenOobeHIDDetection[];
65  static const char kScreenOobeNetwork[];
66  static const char kScreenOobeEula[];
67  static const char kScreenOobeUpdate[];
68  static const char kScreenOobeEnrollment[];
69  static const char kScreenOobeReset[];
70  static const char kScreenGaiaSignin[];
71  static const char kScreenAccountPicker[];
72  static const char kScreenKioskAutolaunch[];
73  static const char kScreenKioskEnable[];
74  static const char kScreenErrorMessage[];
75  static const char kScreenUserImagePicker[];
76  static const char kScreenTpmError[];
77  static const char kScreenPasswordChanged[];
78  static const char kScreenSupervisedUserCreationFlow[];
79  static const char kScreenTermsOfService[];
80  static const char kScreenWrongHWID[];
81  static const char kScreenAutoEnrollmentCheck[];
82  static const char kScreenAppLaunchSplash[];
83  static const char kScreenConfirmPassword[];
84  static const char kScreenFatalError[];
85  static const char kScreenHIDDetection[];
86  static const char kScreenControllerPairing[];
87  static const char kScreenHostPairing[];
88
89  OobeUI(content::WebUI* web_ui, const GURL& url);
90  virtual ~OobeUI();
91
92  // OobeDisplay implementation:
93  virtual CoreOobeActor* GetCoreOobeActor() OVERRIDE;
94  virtual UpdateScreenActor* GetUpdateScreenActor() OVERRIDE;
95  virtual NetworkScreenActor* GetNetworkScreenActor() OVERRIDE;
96  virtual EulaScreenActor* GetEulaScreenActor() OVERRIDE;
97  virtual EnrollmentScreenActor* GetEnrollmentScreenActor() OVERRIDE;
98  virtual ResetScreenActor* GetResetScreenActor() OVERRIDE;
99  virtual KioskAutolaunchScreenActor* GetKioskAutolaunchScreenActor() OVERRIDE;
100  virtual KioskEnableScreenActor* GetKioskEnableScreenActor() OVERRIDE;
101  virtual TermsOfServiceScreenActor*
102      GetTermsOfServiceScreenActor() OVERRIDE;
103  virtual UserImageScreenActor* GetUserImageScreenActor() OVERRIDE;
104  virtual ErrorScreenActor* GetErrorScreenActor() OVERRIDE;
105  virtual WrongHWIDScreenActor* GetWrongHWIDScreenActor() OVERRIDE;
106  virtual AutoEnrollmentCheckScreenActor*
107      GetAutoEnrollmentCheckScreenActor() OVERRIDE;
108  virtual SupervisedUserCreationScreenHandler*
109      GetSupervisedUserCreationScreenActor() OVERRIDE;
110  virtual AppLaunchSplashScreenActor*
111      GetAppLaunchSplashScreenActor() OVERRIDE;
112  virtual bool IsJSReady(const base::Closure& display_is_ready_callback)
113      OVERRIDE;
114  virtual HIDDetectionScreenActor* GetHIDDetectionScreenActor() OVERRIDE;
115  virtual ControllerPairingScreenActor* GetControllerPairingScreenActor()
116      OVERRIDE;
117  virtual HostPairingScreenActor* GetHostPairingScreenActor() OVERRIDE;
118
119  // Collects localized strings from the owned handlers.
120  void GetLocalizedStrings(base::DictionaryValue* localized_strings);
121
122  // Initializes the handlers.
123  void InitializeHandlers();
124
125  // Invoked after the async assets load. The screen handler that has the same
126  // async assets load id will be initialized.
127  void OnScreenAssetsLoaded(const std::string& async_assets_load_id);
128
129  // Shows or hides OOBE UI elements.
130  void ShowOobeUI(bool show);
131
132  // TODO(rkc): Create a separate retail mode login UI and move this method
133  // there - see crbug.com/157671.
134  // Shows a login spinner for retail mode logins.
135  void ShowRetailModeLoginSpinner();
136
137  // Shows the signin screen.
138  void ShowSigninScreen(const LoginScreenContext& context,
139                        SigninScreenHandlerDelegate* delegate,
140                        NativeWindowDelegate* native_window_delegate);
141
142  // Resets the delegate set in ShowSigninScreen.
143  void ResetSigninScreenHandlerDelegate();
144
145  // Add and remove observers for screen change events.
146  void AddObserver(Observer* observer);
147  void RemoveObserver(Observer* observer);
148
149  Screen current_screen() const { return current_screen_; }
150
151  Screen previous_screen() const { return previous_screen_; }
152
153  const std::string& display_type() const { return display_type_; }
154
155  const std::string& GetScreenName(Screen screen) const;
156
157  SigninScreenHandler* signin_screen_handler_for_test() {
158    return signin_screen_handler_;
159  }
160
161 private:
162  // Initializes |screen_ids_| and |screen_names_| structures.
163  void InitializeScreenMaps();
164
165  void AddScreenHandler(BaseScreenHandler* handler);
166
167  // CoreOobeHandler::Delegate implementation:
168  virtual void OnCurrentScreenChanged(const std::string& screen) OVERRIDE;
169
170  // Type of UI.
171  std::string display_type_;
172
173  // Reference to NetworkStateInformer that handles changes in network
174  // state.
175  scoped_refptr<NetworkStateInformer> network_state_informer_;
176
177  // Reference to CoreOobeHandler that handles common requests of Oobe page.
178  CoreOobeHandler* core_handler_;
179
180  // Reference to NetworkDropdownHandler that handles interaction with
181  // network dropdown.
182  NetworkDropdownHandler* network_dropdown_handler_;
183
184  // Screens actors. Note, OobeUI owns them via |handlers_|, not directly here.
185  UpdateScreenHandler* update_screen_handler_;
186  NetworkScreenActor* network_screen_actor_;
187  EulaScreenActor* eula_screen_actor_;
188  EnrollmentScreenActor* enrollment_screen_actor_;
189  HIDDetectionScreenActor* hid_detection_screen_actor_;
190  ResetScreenActor* reset_screen_actor_;
191  KioskAutolaunchScreenActor* autolaunch_screen_actor_;
192  KioskEnableScreenActor* kiosk_enable_screen_actor_;
193  WrongHWIDScreenActor* wrong_hwid_screen_actor_;
194  AutoEnrollmentCheckScreenActor* auto_enrollment_check_screen_actor_;
195  SupervisedUserCreationScreenHandler*
196      supervised_user_creation_screen_actor_;
197  AppLaunchSplashScreenActor* app_launch_splash_screen_actor_;
198  ControllerPairingScreenActor* controller_pairing_screen_actor_;
199  HostPairingScreenActor* host_pairing_screen_actor_;
200
201  // Reference to ErrorScreenHandler that handles error screen
202  // requests and forward calls from native code to JS side.
203  ErrorScreenHandler* error_screen_handler_;
204
205  // Reference to GaiaScreenHandler that handles gaia screen requests and
206  // forwards calls from native code to JS side.
207  GaiaScreenHandler* gaia_screen_handler_;
208
209  // Reference to SigninScreenHandler that handles sign-in screen requests and
210  // forwards calls from native code to JS side.
211  SigninScreenHandler* signin_screen_handler_;
212
213  TermsOfServiceScreenActor* terms_of_service_screen_actor_;
214  UserImageScreenActor* user_image_screen_actor_;
215
216  std::vector<BaseScreenHandler*> handlers_;  // Non-owning pointers.
217
218  KioskAppMenuHandler* kiosk_app_menu_handler_;  // Non-owning pointers.
219
220  // Id of the current oobe/login screen.
221  Screen current_screen_;
222
223  // Id of the previous oobe/login screen.
224  Screen previous_screen_;
225
226  // Maps JS screen names to screen ids.
227  std::map<std::string, Screen> screen_ids_;
228
229  // Maps screen ids to JS screen names.
230  std::vector<std::string> screen_names_;
231
232  // Flag that indicates whether JS part is fully loaded and ready to accept
233  // calls.
234  bool ready_;
235
236  // Callbacks to notify when JS part is fully loaded and ready to accept calls.
237  std::vector<base::Closure> ready_callbacks_;
238
239  // List of registered observers.
240  ObserverList<Observer> observer_list_;
241
242  DISALLOW_COPY_AND_ASSIGN(OobeUI);
243};
244
245}  // namespace chromeos
246
247#endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_OOBE_UI_H_
248