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 <memory>
10 #include <string>
11 #include <vector>
12 
13 #include "base/compiler_specific.h"
14 #include "base/macros.h"
15 #include "base/memory/ref_counted.h"
16 #include "base/observer_list.h"
17 #include "chrome/browser/chromeos/login/oobe_screen.h"
18 #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
19 #include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h"
20 #include "chromeos/services/multidevice_setup/public/mojom/multidevice_setup.mojom-forward.h"
21 #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h"  // nogncheck
22 #include "mojo/public/cpp/bindings/pending_receiver.h"
23 #include "ui/webui/mojo_web_ui_controller.h"
24 
25 namespace base {
26 class DictionaryValue;
27 }  // namespace base
28 
29 namespace content {
30 class WebUIDataSource;
31 }
32 
33 namespace chromeos {
34 
35 class ErrorScreen;
36 class NetworkStateInformer;
37 class OobeDisplayChooser;
38 class SigninScreenHandler;
39 class SigninScreenHandlerDelegate;
40 
41 // A custom WebUI that defines datasource for out-of-box-experience (OOBE) UI:
42 // - welcome screen (setup language/keyboard/network).
43 // - eula screen (CrOS (+ OEM) EULA content/TPM password/crash reporting).
44 // - update screen.
45 class OobeUI : public ui::MojoWebUIController {
46  public:
47   // List of known types of OobeUI. Type added as path in chrome://oobe url, for
48   // example chrome://oobe/user-adding.
49   static const char kAppLaunchSplashDisplay[];
50   static const char kGaiaSigninDisplay[];
51   static const char kLockDisplay[];
52   static const char kLoginDisplay[];
53   static const char kOobeDisplay[];
54   static const char kUserAddingDisplay[];
55 
56   class Observer {
57    public:
Observer()58     Observer() {}
59     virtual void OnCurrentScreenChanged(OobeScreenId current_screen,
60                                         OobeScreenId new_screen) = 0;
61 
62     virtual void OnDestroyingOobeUI() = 0;
63 
64    protected:
~Observer()65     virtual ~Observer() {}
66     DISALLOW_COPY(Observer);
67   };
68 
69   OobeUI(content::WebUI* web_ui, const GURL& url);
70   ~OobeUI() override;
71 
72   CoreOobeView* GetCoreOobeView();
73   ErrorScreen* GetErrorScreen();
74 
75   // Collects localized strings from the owned handlers.
76   void GetLocalizedStrings(base::DictionaryValue* localized_strings);
77 
78   // Initializes the handlers.
79   void InitializeHandlers();
80 
81   // Called when the screen has changed.
82   void CurrentScreenChanged(OobeScreenId screen);
83 
84   bool IsScreenInitialized(OobeScreenId screen);
85 
86   bool IsJSReady(const base::Closure& display_is_ready_callback);
87 
88   // Shows or hides OOBE UI elements.
89   void ShowOobeUI(bool show);
90 
91   // Shows the signin screen.
92   void ShowSigninScreen(SigninScreenHandlerDelegate* delegate);
93 
94   // Forwards an accelerator to the webui to be handled.
95   void ForwardAccelerator(std::string accelerator_name);
96 
97   // Resets the delegate set in ShowSigninScreen.
98   void ResetSigninScreenHandlerDelegate();
99 
100   gfx::NativeView GetNativeView();
101 
102   gfx::NativeWindow GetTopLevelNativeWindow();
103 
104   gfx::Size GetViewSize();
105 
106   // Add and remove observers for screen change events.
107   void AddObserver(Observer* observer);
108   void RemoveObserver(Observer* observer);
109 
current_screen()110   OobeScreenId current_screen() const { return current_screen_; }
111 
previous_screen()112   OobeScreenId previous_screen() const { return previous_screen_; }
113 
display_type()114   const std::string& display_type() const { return display_type_; }
115 
signin_screen_handler()116   SigninScreenHandler* signin_screen_handler() {
117     return signin_screen_handler_;
118   }
119 
network_state_informer_for_test()120   NetworkStateInformer* network_state_informer_for_test() const {
121     return network_state_informer_.get();
122   }
123 
124   // Re-evaluate OOBE display placement.
125   void OnDisplayConfigurationChanged();
126 
127   // Notify WebUI of the user count on the views login screen.
128   void SetLoginUserCount(int user_count);
129 
130   // Find a *View instance provided by a given *Handler type.
131   //
132   // This is the same as GetHandler() except the return type is limited to the
133   // view.
134   template <typename THandler>
GetView()135   typename THandler::TView* GetView() {
136     return GetHandler<THandler>();
137   }
138 
139   // Find a handler instance.
140   template <typename THandler>
GetHandler()141   THandler* GetHandler() {
142     OobeScreenId expected_screen = THandler::kScreenId;
143     for (BaseScreenHandler* handler : screen_handlers_) {
144       if (expected_screen == handler->oobe_screen())
145         return static_cast<THandler*>(handler);
146     }
147 
148     NOTREACHED() << "Unable to find handler for screen " << expected_screen;
149     return nullptr;
150   }
151 
152   // Instantiates implementor of the mojom::MultiDeviceSetup mojo interface
153   // passing the pending receiver that will be internally bound.
154   void BindInterface(
155       mojo::PendingReceiver<multidevice_setup::mojom::MultiDeviceSetup>
156           receiver);
157   // Instantiates implementor of the mojom::PrivilegedHostDeviceSetter mojo
158   // interface passing the pending receiver that will be internally bound.
159   void BindInterface(
160       mojo::PendingReceiver<
161           multidevice_setup::mojom::PrivilegedHostDeviceSetter> receiver);
162   // Instantiates implementor of the mojom::CrosNetworkConfig mojo
163   // interface passing the pending receiver that will be internally bound.
164   void BindInterface(
165       mojo::PendingReceiver<chromeos::network_config::mojom::CrosNetworkConfig>
166           receiver);
167 
168   static void AddOobeComponents(content::WebUIDataSource* source,
169                                 const base::DictionaryValue& localized_strings);
170 
171  private:
172   void AddWebUIHandler(std::unique_ptr<BaseWebUIHandler> handler);
173   void AddScreenHandler(std::unique_ptr<BaseScreenHandler> handler);
174 
175   // Configures all the relevant screen shandlers and resources for OOBE/Login
176   // display type.
177   void ConfigureOobeDisplay();
178 
179   // Type of UI.
180   std::string display_type_;
181 
182   // Reference to NetworkStateInformer that handles changes in network
183   // state.
184   scoped_refptr<NetworkStateInformer> network_state_informer_;
185 
186   // Reference to CoreOobeHandler that handles common requests of Oobe page.
187   CoreOobeHandler* core_handler_ = nullptr;
188 
189   // Reference to SigninScreenHandler that handles sign-in screen requests and
190   // forwards calls from native code to JS side.
191   SigninScreenHandler* signin_screen_handler_ = nullptr;
192 
193   std::vector<BaseWebUIHandler*> webui_handlers_;       // Non-owning pointers.
194   std::vector<BaseWebUIHandler*> webui_only_handlers_;  // Non-owning pointers.
195   std::vector<BaseScreenHandler*> screen_handlers_;     // Non-owning pointers.
196 
197   std::unique_ptr<ErrorScreen> error_screen_;
198 
199   // Id of the current oobe/login screen.
200   OobeScreenId current_screen_ = OobeScreen::SCREEN_UNKNOWN;
201 
202   // Id of the previous oobe/login screen.
203   OobeScreenId previous_screen_ = OobeScreen::SCREEN_UNKNOWN;
204 
205   // Flag that indicates whether JS part is fully loaded and ready to accept
206   // calls.
207   bool ready_ = false;
208 
209   // Callbacks to notify when JS part is fully loaded and ready to accept calls.
210   std::vector<base::Closure> ready_callbacks_;
211 
212   // List of registered observers.
213   base::ObserverList<Observer>::Unchecked observer_list_;
214 
215   std::unique_ptr<OobeDisplayChooser> oobe_display_chooser_;
216 
217   // Store the deferred JS calls before the screen handler instance is
218   // initialized.
219   std::unique_ptr<JSCallsContainer> js_calls_container_;
220 
221   WEB_UI_CONTROLLER_TYPE_DECL();
222 
223   DISALLOW_COPY_AND_ASSIGN(OobeUI);
224 };
225 
226 }  // namespace chromeos
227 
228 #endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_OOBE_UI_H_
229