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