[WebUI] Migrate OobeUI to WebUIConfig
This CL migrates OobeUI to WebUIConfig. It also refactors
ChromeOSWebUIConfig so that its default CreateWebUIControllerFunc
determines whether the WebUIController requires a GURL (e.g. OobeUI) to
be constructed at compile time.
Context:
Currently WebUI properties, e.g. CSPs, requesting schemes, host, mojo,
etc. are stored in WebUIControllers themselves or in separate lists
like IsWebUIAllowedToMakeNetworkRequests. The lifetime of a
WebUIController is bound to the frame, which makes it hard to use for
some use cases where the WebUIController hasn't been created yet. A
non-dynamically allocated class where clients could query a WebUI's
properties would be easier to use and audit.
WebUIConfig is a class that stores properties of WebUIs. For now the
properties are 1. the WebUI's origin, 2. if the WebUI is enabled,
and 3. GetURLDataSource() method for service worker initialization.
In the future this class could include information like CSPs, if we
should enable Mojo, if we should enable chrome.send(), if we should
allow network requests, URLDataSource, etc.
Bug: 1317510
Change-Id: I36f32a8ebd447943b39c3a9532e1b826cd7a1670
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4451971
Reviewed-by: Giovanni Ortuno Urquidi <ortuno@chromium.org>
Code-Coverage: Findit <findit-for-me@appspot.gserviceaccount.com>
Commit-Queue: Junguo (Jun) W. <jungoog@google.com>
Cr-Commit-Position: refs/heads/main@{#1133655}
diff --git a/ash/webui/common/chrome_os_webui_config.h b/ash/webui/common/chrome_os_webui_config.h
index f84b8e97..4eb7ffc5 100644
--- a/ash/webui/common/chrome_os_webui_config.h
+++ b/ash/webui/common/chrome_os_webui_config.h
@@ -32,7 +32,20 @@
host,
[](content::WebUI* web_ui,
const GURL& url) -> std::unique_ptr<content::WebUIController> {
- return std::make_unique<T>(web_ui);
+ // We need to determine the correct WebUIController constructor to
+ // use at compile time, depending on whether it requires only
+ // WebUI* or both WebUI* and GURL. We currently don't support
+ // WebUIControllers that have two constructors where one has a
+ // single WebUI* arg and the other has both WebUI* and GURL
+ // params.
+ static_assert(
+ !(std::is_constructible_v<T, content::WebUI*> &&
+ std::is_constructible_v<T, content::WebUI*, GURL>));
+ if constexpr (std::is_constructible_v<T, content::WebUI*, GURL>) {
+ return std::make_unique<T>(web_ui, url);
+ } else {
+ return std::make_unique<T>(web_ui);
+ }
}) {}
// Same as above, but takes in an extra `create_controller_func` argument that
diff --git a/chrome/browser/ui/webui/ash/login/oobe_ui.cc b/chrome/browser/ui/webui/ash/login/oobe_ui.cc
index 728a8ee2..3c7e963 100644
--- a/chrome/browser/ui/webui/ash/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/ash/login/oobe_ui.cc
@@ -350,6 +350,11 @@
const DisplayScaleFactor k4KDisplay = {3840, 1.5f},
kMediumDisplay = {1440, 4.f / 3};
+bool OobeUIConfig::IsWebUIEnabled(content::BrowserContext* browser_context) {
+ return ash::ProfileHelper::IsSigninProfile(
+ Profile::FromBrowserContext(browser_context));
+}
+
// static
const char OobeUI::kAppLaunchSplashDisplay[] = "app-launch-splash";
const char OobeUI::kGaiaSigninDisplay[] = "gaia-signin";
diff --git a/chrome/browser/ui/webui/ash/login/oobe_ui.h b/chrome/browser/ui/webui/ash/login/oobe_ui.h
index f133fbc..b6ca84a 100644
--- a/chrome/browser/ui/webui/ash/login/oobe_ui.h
+++ b/chrome/browser/ui/webui/ash/login/oobe_ui.h
@@ -10,16 +10,19 @@
#include <string>
#include <vector>
+#include "ash/webui/common/chrome_os_webui_config.h"
#include "base/memory/ref_counted.h"
#include "base/observer_list.h"
#include "base/values.h"
#include "chrome/browser/ash/login/oobe_screen.h"
#include "chrome/browser/ui/webui/ash/login/base_screen_handler.h"
#include "chrome/browser/ui/webui/ash/login/core_oobe_handler.h"
+#include "chrome/common/webui_url_constants.h"
#include "chromeos/ash/services/auth_factor_config/public/mojom/auth_factor_config.mojom-forward.h"
#include "chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h"
#include "chromeos/ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom-forward.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h"
+#include "content/public/common/url_constants.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "ui/webui/mojo_web_ui_controller.h"
#include "ui/webui/resources/cr_components/color_change_listener/color_change_listener.mojom.h"
@@ -37,6 +40,17 @@
class ErrorScreen;
class NetworkStateInformer;
class OobeDisplayChooser;
+class OobeUI;
+
+// The WebUIConfig for chrome://oobe urls
+class OobeUIConfig : public ChromeOSWebUIConfig<OobeUI> {
+ public:
+ OobeUIConfig()
+ : ChromeOSWebUIConfig(content::kChromeUIScheme,
+ chrome::kChromeUIOobeHost) {}
+
+ bool IsWebUIEnabled(content::BrowserContext* browser_context) override;
+};
// A custom WebUI that defines datasource for out-of-box-experience (OOBE) UI:
// - welcome screen (setup language/keyboard/network).
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index 9f1dfc0..f0e8983 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -282,7 +282,6 @@
#include "chrome/browser/ui/webui/ash/launcher_internals/launcher_internals_ui.h"
#include "chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_network_ui.h"
#include "chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_start_reauth_ui.h"
-#include "chrome/browser/ui/webui/ash/login/oobe_ui.h"
#include "chrome/browser/ui/webui/ash/manage_mirrorsync/manage_mirrorsync_ui.h"
#include "chrome/browser/ui/webui/ash/multidevice_internals/multidevice_internals_ui.h"
#include "chrome/browser/ui/webui/ash/multidevice_setup/multidevice_setup_dialog.h"
@@ -500,11 +499,6 @@
#if BUILDFLAG(IS_CHROMEOS_ASH)
template <>
-WebUIController* NewWebUI<ash::OobeUI>(WebUI* web_ui, const GURL& url) {
- return new ash::OobeUI(web_ui, url);
-}
-
-template <>
WebUIController* NewWebUI<ash::TrustedProjectorUI>(WebUI* web_ui,
const GURL& url) {
return new ash::TrustedProjectorUI(web_ui, url,
@@ -970,12 +964,6 @@
return &NewComponentUI<ash::HelpAppUI, ash::ChromeHelpAppUIDelegate>;
if (url.host_piece() == chrome::kChromeUIMobileSetupHost)
return &NewWebUI<ash::cellular_setup::MobileSetupUI>;
- if (url.host_piece() == chrome::kChromeUIOobeHost) {
- if (ash::ProfileHelper::IsSigninProfile(profile)) {
- return &NewWebUI<ash::OobeUI>;
- }
- return nullptr;
- }
if (url.host_piece() == ash::kChromeUIDiagnosticsAppHost) {
return &NewWebUI<ash::DiagnosticsDialogUI>;
}
diff --git a/chrome/browser/ui/webui/chromeos/chrome_web_ui_configs_chromeos.cc b/chrome/browser/ui/webui/chromeos/chrome_web_ui_configs_chromeos.cc
index e068305d..656d152e 100644
--- a/chrome/browser/ui/webui/chromeos/chrome_web_ui_configs_chromeos.cc
+++ b/chrome/browser/ui/webui/chromeos/chrome_web_ui_configs_chromeos.cc
@@ -55,6 +55,7 @@
#include "chrome/browser/ui/webui/ash/launcher_internals/launcher_internals_ui.h"
#include "chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_network_ui.h"
#include "chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_start_reauth_ui.h"
+#include "chrome/browser/ui/webui/ash/login/oobe_ui.h"
#include "chrome/browser/ui/webui/ash/manage_mirrorsync/manage_mirrorsync_ui.h"
#include "chrome/browser/ui/webui/ash/multidevice_internals/multidevice_internals_ui.h"
#include "chrome/browser/ui/webui/ash/multidevice_setup/multidevice_setup_dialog.h"
@@ -188,6 +189,7 @@
map.AddWebUIConfig(std::make_unique<ash::NotificationTesterUIConfig>());
map.AddWebUIConfig(
std::make_unique<ash::office_fallback::OfficeFallbackUIConfig>());
+ map.AddWebUIConfig(std::make_unique<ash::OobeUIConfig>());
map.AddWebUIConfig(
MakeComponentConfig<ash::OSFeedbackUIConfig, ash::OSFeedbackUI,
ash::ChromeOsFeedbackDelegate>());