Commit f82310da authored by Christopher Lam's avatar Christopher Lam Committed by Commit Bot

Allow multiple Mojo handlers on a single WebUI.

This CL changes MojoWebUIController to use a templated
AddHandlerToRegistry function which allows subclasses to add multiple
interfaces to the binder registry.

TBR=khorimoto@chromium.org

Change-Id: I943e3d583c9a3c8bb08873001cc533c2d23a0bcf
Reviewed-on: https://chromium-review.googlesource.com/991497
Commit-Queue: calamity <calamity@chromium.org>
Reviewed-by: default avatarcalamity <calamity@chromium.org>
Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@chromium.org>
Reviewed-by: default avatarSam McNally <sammc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#551256}
parent c4fbef24
......@@ -11,7 +11,7 @@
#include "content/public/browser/web_ui_data_source.h"
BluetoothInternalsUI::BluetoothInternalsUI(content::WebUI* web_ui)
: ui::MojoWebUIController<mojom::BluetoothInternalsHandler>(web_ui) {
: ui::MojoWebUIController(web_ui) {
// Set up the chrome://bluetooth-internals source.
content::WebUIDataSource* html_source =
content::WebUIDataSource::Create(chrome::kChromeUIBluetoothInternalsHost);
......@@ -63,11 +63,14 @@ BluetoothInternalsUI::BluetoothInternalsUI(content::WebUI* web_ui)
Profile* profile = Profile::FromWebUI(web_ui);
content::WebUIDataSource::Add(profile, html_source);
AddHandlerToRegistry(
base::BindRepeating(&BluetoothInternalsUI::BindBluetoothInternalsHandler,
base::Unretained(this)));
}
BluetoothInternalsUI::~BluetoothInternalsUI() {}
void BluetoothInternalsUI::BindUIHandler(
void BluetoothInternalsUI::BindBluetoothInternalsHandler(
mojom::BluetoothInternalsHandlerRequest request) {
page_handler_.reset(new BluetoothInternalsHandler(std::move(request)));
}
......@@ -12,18 +12,14 @@
class BluetoothInternalsHandler;
// The WebUI for chrome://bluetooth-internals
class BluetoothInternalsUI
: public ui::MojoWebUIController<mojom::BluetoothInternalsHandler> {
class BluetoothInternalsUI : public ui::MojoWebUIController {
public:
explicit BluetoothInternalsUI(content::WebUI* web_ui);
~BluetoothInternalsUI() override;
private:
// ui::MojoWebUIController overrides:
void BindUIHandler(
// mojo::InterfaceRequest<mojom::BluetoothInternalsHandler> request)
// override;
mojom::BluetoothInternalsHandlerRequest request) override;
void BindBluetoothInternalsHandler(
mojom::BluetoothInternalsHandlerRequest request);
std::unique_ptr<BluetoothInternalsHandler> page_handler_;
......
......@@ -150,7 +150,7 @@ class DiscardsDetailsProviderImpl : public mojom::DiscardsDetailsProvider {
} // namespace
DiscardsUI::DiscardsUI(content::WebUI* web_ui)
: ui::MojoWebUIController<mojom::DiscardsDetailsProvider>(web_ui) {
: ui::MojoWebUIController(web_ui) {
std::unique_ptr<content::WebUIDataSource> source(
content::WebUIDataSource::Create(chrome::kChromeUIDiscardsHost));
......@@ -163,11 +163,14 @@ DiscardsUI::DiscardsUI(content::WebUI* web_ui)
Profile* profile = Profile::FromWebUI(web_ui);
content::WebUIDataSource::Add(profile, source.release());
AddHandlerToRegistry(base::BindRepeating(
&DiscardsUI::BindDiscardsDetailsProvider, base::Unretained(this)));
}
DiscardsUI::~DiscardsUI() {}
void DiscardsUI::BindUIHandler(mojom::DiscardsDetailsProviderRequest request) {
void DiscardsUI::BindDiscardsDetailsProvider(
mojom::DiscardsDetailsProviderRequest request) {
ui_handler_ =
std::make_unique<DiscardsDetailsProviderImpl>(std::move(request));
}
......@@ -13,15 +13,14 @@
// Controller for chrome://discards. Corresponding resources are in
// file://chrome/browser/resources/discards.
class DiscardsUI
: public ui::MojoWebUIController<mojom::DiscardsDetailsProvider> {
class DiscardsUI : public ui::MojoWebUIController {
public:
explicit DiscardsUI(content::WebUI* web_ui);
~DiscardsUI() override;
private:
// ui::MojoWebUIController overrides:
void BindUIHandler(mojom::DiscardsDetailsProviderRequest request) override;
void BindDiscardsDetailsProvider(
mojom::DiscardsDetailsProviderRequest request);
std::unique_ptr<mojom::DiscardsDetailsProvider> ui_handler_;
......
......@@ -77,7 +77,7 @@ class SiteEngagementDetailsProviderImpl
} // namespace
SiteEngagementUI::SiteEngagementUI(content::WebUI* web_ui)
: ui::MojoWebUIController<mojom::SiteEngagementDetailsProvider>(web_ui) {
: ui::MojoWebUIController(web_ui) {
// Set up the chrome://site-engagement/ source.
std::unique_ptr<content::WebUIDataSource> source(
content::WebUIDataSource::Create(chrome::kChromeUISiteEngagementHost));
......@@ -89,11 +89,15 @@ SiteEngagementUI::SiteEngagementUI(content::WebUI* web_ui)
source->SetDefaultResource(IDR_SITE_ENGAGEMENT_HTML);
source->UseGzip();
content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source.release());
AddHandlerToRegistry(
base::BindRepeating(&SiteEngagementUI::BindSiteEngagementDetailsProvider,
base::Unretained(this)));
}
SiteEngagementUI::~SiteEngagementUI() {}
void SiteEngagementUI::BindUIHandler(
void SiteEngagementUI::BindSiteEngagementDetailsProvider(
mojom::SiteEngagementDetailsProviderRequest request) {
ui_handler_.reset(new SiteEngagementDetailsProviderImpl(
Profile::FromWebUI(web_ui()), std::move(request)));
......
......@@ -10,16 +10,14 @@
#include "ui/webui/mojo_web_ui_controller.h"
// The UI for chrome://site-engagement/.
class SiteEngagementUI
: public ui::MojoWebUIController<mojom::SiteEngagementDetailsProvider> {
class SiteEngagementUI : public ui::MojoWebUIController {
public:
explicit SiteEngagementUI(content::WebUI* web_ui);
~SiteEngagementUI() override;
private:
// ui::MojoWebUIController overrides:
void BindUIHandler(
mojom::SiteEngagementDetailsProviderRequest request) override;
void BindSiteEngagementDetailsProvider(
mojom::SiteEngagementDetailsProviderRequest request);
std::unique_ptr<mojom::SiteEngagementDetailsProvider> ui_handler_;
......
......@@ -45,8 +45,7 @@ content::WebUIDataSource* GetUnsupportedSource() {
} // namespace
InterventionsInternalsUI::InterventionsInternalsUI(content::WebUI* web_ui)
: ui::MojoWebUIController<mojom::InterventionsInternalsPageHandler>(web_ui),
previews_ui_service_(nullptr) {
: ui::MojoWebUIController(web_ui), previews_ui_service_(nullptr) {
// Set up the chrome://interventions-internals/ source.
Profile* profile = Profile::FromWebUI(web_ui);
......@@ -61,11 +60,14 @@ InterventionsInternalsUI::InterventionsInternalsUI(content::WebUI* web_ui)
previews_ui_service_ = previews_service->previews_ui_service();
ui_nqe_service_ =
UINetworkQualityEstimatorServiceFactory::GetForProfile(profile);
AddHandlerToRegistry(base::BindRepeating(
&InterventionsInternalsUI::BindInterventionsInternalsPageHandler,
base::Unretained(this)));
}
InterventionsInternalsUI::~InterventionsInternalsUI() {}
void InterventionsInternalsUI::BindUIHandler(
void InterventionsInternalsUI::BindInterventionsInternalsPageHandler(
mojom::InterventionsInternalsPageHandlerRequest request) {
DCHECK(previews_ui_service_);
DCHECK(ui_nqe_service_);
......
......@@ -17,16 +17,14 @@ class PreviewsUIService;
class UINetworkQualityEstimatorService;
// The WebUI for chrome://interventions-internals.
class InterventionsInternalsUI
: public ui::MojoWebUIController<mojom::InterventionsInternalsPageHandler> {
class InterventionsInternalsUI : public ui::MojoWebUIController {
public:
explicit InterventionsInternalsUI(content::WebUI* web_ui);
~InterventionsInternalsUI() override;
private:
// ui::MojoWebUIController overrides:
void BindUIHandler(
mojom::InterventionsInternalsPageHandlerRequest request) override;
void BindInterventionsInternalsPageHandler(
mojom::InterventionsInternalsPageHandlerRequest request);
// The PreviewsUIService associated with this UI.
previews::PreviewsUIService* previews_ui_service_;
......
......@@ -64,8 +64,7 @@ class MediaEngagementScoreDetailsProviderImpl
} // namespace
MediaEngagementUI::MediaEngagementUI(content::WebUI* web_ui)
: ui::MojoWebUIController<
media::mojom::MediaEngagementScoreDetailsProvider>(web_ui) {
: ui::MojoWebUIController(web_ui) {
// Setup the data source behind chrome://media-engagement.
std::unique_ptr<content::WebUIDataSource> source(
content::WebUIDataSource::Create(chrome::kChromeUIMediaEngagementHost));
......@@ -77,11 +76,14 @@ MediaEngagementUI::MediaEngagementUI(content::WebUI* web_ui)
source->SetDefaultResource(IDR_MEDIA_ENGAGEMENT_HTML);
source->UseGzip();
content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source.release());
AddHandlerToRegistry(base::BindRepeating(
&MediaEngagementUI::BindMediaEngagementScoreDetailsProvider,
base::Unretained(this)));
}
MediaEngagementUI::~MediaEngagementUI() = default;
void MediaEngagementUI::BindUIHandler(
void MediaEngagementUI::BindMediaEngagementScoreDetailsProvider(
media::mojom::MediaEngagementScoreDetailsProviderRequest request) {
ui_handler_ = std::make_unique<MediaEngagementScoreDetailsProviderImpl>(
Profile::FromWebUI(web_ui()), std::move(request));
......
......@@ -10,17 +10,14 @@
#include "ui/webui/mojo_web_ui_controller.h"
// The UI for chrome://media-engagement/.
class MediaEngagementUI
: public ui::MojoWebUIController<
media::mojom::MediaEngagementScoreDetailsProvider> {
class MediaEngagementUI : public ui::MojoWebUIController {
public:
explicit MediaEngagementUI(content::WebUI* web_ui);
~MediaEngagementUI() override;
private:
// ui::MojoWebUIController overrides:
void BindUIHandler(media::mojom::MediaEngagementScoreDetailsProviderRequest
request) override;
void BindMediaEngagementScoreDetailsProvider(
media::mojom::MediaEngagementScoreDetailsProviderRequest request);
std::unique_ptr<media::mojom::MediaEngagementScoreDetailsProvider>
ui_handler_;
......
......@@ -14,8 +14,7 @@
#include "content/public/browser/web_ui_controller.h"
#include "content/public/browser/web_ui_data_source.h"
OmniboxUI::OmniboxUI(content::WebUI* web_ui)
: ui::MojoWebUIController<mojom::OmniboxPageHandler>(web_ui) {
OmniboxUI::OmniboxUI(content::WebUI* web_ui) : ui::MojoWebUIController(web_ui) {
// Set up the chrome://omnibox/ source.
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIOmniboxHost);
......@@ -27,11 +26,13 @@ OmniboxUI::OmniboxUI(content::WebUI* web_ui)
source->UseGzip();
content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
AddHandlerToRegistry(base::BindRepeating(&OmniboxUI::BindOmniboxPageHandler,
base::Unretained(this)));
}
OmniboxUI::~OmniboxUI() {}
void OmniboxUI::BindUIHandler(
void OmniboxUI::BindOmniboxPageHandler(
mojom::OmniboxPageHandlerRequest request) {
omnibox_handler_.reset(
new OmniboxPageHandler(Profile::FromWebUI(web_ui()), std::move(request)));
......
......@@ -12,14 +12,13 @@
class OmniboxPageHandler;
// The UI for chrome://omnibox/
class OmniboxUI : public ui::MojoWebUIController<mojom::OmniboxPageHandler> {
class OmniboxUI : public ui::MojoWebUIController {
public:
explicit OmniboxUI(content::WebUI* contents);
~OmniboxUI() override;
private:
// ui::MojoWebUIController overrides:
void BindUIHandler(mojom::OmniboxPageHandlerRequest request) override;
void BindOmniboxPageHandler(mojom::OmniboxPageHandlerRequest request);
std::unique_ptr<OmniboxPageHandler> omnibox_handler_;
......
......@@ -11,7 +11,7 @@
#include "content/public/browser/web_ui_data_source.h"
UsbInternalsUI::UsbInternalsUI(content::WebUI* web_ui)
: ui::MojoWebUIController<mojom::UsbInternalsPageHandler>(web_ui) {
: ui::MojoWebUIController(web_ui) {
// Set up the chrome://usb-internals source.
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIUsbInternalsHost);
......@@ -26,11 +26,13 @@ UsbInternalsUI::UsbInternalsUI(content::WebUI* web_ui)
source->UseGzip();
content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
AddHandlerToRegistry(base::BindRepeating(
&UsbInternalsUI::BindUsbInternalsPageHandler, base::Unretained(this)));
}
UsbInternalsUI::~UsbInternalsUI() {}
void UsbInternalsUI::BindUIHandler(
void UsbInternalsUI::BindUsbInternalsPageHandler(
mojom::UsbInternalsPageHandlerRequest request) {
page_handler_.reset(new UsbInternalsPageHandler(std::move(request)));
}
......@@ -12,15 +12,14 @@
class UsbInternalsPageHandler;
// The WebUI for chrome://usb-internals.
class UsbInternalsUI
: public ui::MojoWebUIController<mojom::UsbInternalsPageHandler> {
class UsbInternalsUI : public ui::MojoWebUIController {
public:
explicit UsbInternalsUI(content::WebUI* web_ui);
~UsbInternalsUI() override;
private:
// ui::MojoWebUIController overrides:
void BindUIHandler(mojom::UsbInternalsPageHandlerRequest request) override;
void BindUsbInternalsPageHandler(
mojom::UsbInternalsPageHandlerRequest request);
std::unique_ptr<UsbInternalsPageHandler> page_handler_;
......
......@@ -21,8 +21,7 @@ namespace proximity_auth {
ProximityAuthUI::ProximityAuthUI(content::WebUI* web_ui,
ProximityAuthClient* delegate)
: ui::MojoWebUIController<
chromeos::multidevice_setup::mojom::MultiDeviceSetup>(web_ui) {
: ui::MojoWebUIController(web_ui) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(kChromeUIProximityAuthHost);
source->SetDefaultResource(IDR_PROXIMITY_AUTH_INDEX_HTML);
......@@ -52,11 +51,13 @@ ProximityAuthUI::ProximityAuthUI(content::WebUI* web_ui,
content::WebUIDataSource::Add(browser_context, source);
web_ui->AddMessageHandler(
std::make_unique<ProximityAuthWebUIHandler>(delegate));
AddHandlerToRegistry(base::BindRepeating(
&ProximityAuthUI::BindMultiDeviceSetup, base::Unretained(this)));
}
ProximityAuthUI::~ProximityAuthUI() = default;
void ProximityAuthUI::BindUIHandler(
void ProximityAuthUI::BindMultiDeviceSetup(
chromeos::multidevice_setup::mojom::MultiDeviceSetupRequest request) {
service_manager::Connector* connector =
content::BrowserContext::GetConnectorFor(
......
......@@ -17,9 +17,7 @@ namespace proximity_auth {
class ProximityAuthClient;
// The WebUI controller for chrome://proximity-auth.
class ProximityAuthUI
: public ui::MojoWebUIController<
chromeos::multidevice_setup::mojom::MultiDeviceSetup> {
class ProximityAuthUI : public ui::MojoWebUIController {
public:
// Note: |web_ui| and |delegate| are not owned by this instance and must
// outlive this instance.
......@@ -27,9 +25,8 @@ class ProximityAuthUI
~ProximityAuthUI() override;
protected:
// ui::MojoWebUIController overrides:
void BindUIHandler(chromeos::multidevice_setup::mojom::MultiDeviceSetupRequest
request) override;
void BindMultiDeviceSetup(
chromeos::multidevice_setup::mojom::MultiDeviceSetupRequest request);
private:
DISALLOW_COPY_AND_ASSIGN(ProximityAuthUI);
......
......@@ -84,14 +84,13 @@ class WEB_DIALOGS_EXPORT WebDialogUI : public WebDialogUIBase,
// Displays file URL contents inside a modal web dialog while also enabling
// Mojo calls to be made from within the dialog.
template <typename Interface>
class WEB_DIALOGS_EXPORT MojoWebDialogUI
: public WebDialogUIBase,
public MojoWebUIController<Interface> {
class WEB_DIALOGS_EXPORT MojoWebDialogUI : public WebDialogUIBase,
public MojoWebUIController {
public:
// When created, the delegate should already be set as user data on the
// WebContents.
explicit MojoWebDialogUI(content::WebUI* web_ui)
: WebDialogUIBase(web_ui), MojoWebUIController<Interface>(web_ui) {}
: WebDialogUIBase(web_ui), MojoWebUIController(web_ui) {}
~MojoWebDialogUI() override {}
private:
......
include_rules = [
"+content/public",
"+mojo/public/cpp/system/core.h",
"+mojo/public",
"+net",
"+services/service_manager/public/cpp/binder_registry.h",
"+ui/base",
......
......@@ -4,18 +4,37 @@
#include "ui/webui/mojo_web_ui_controller.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/common/bindings_policy.h"
namespace ui {
MojoWebUIControllerBase::MojoWebUIControllerBase(content::WebUI* contents)
: content::WebUIController(contents) {}
: content::WebUIController(contents) {
contents->SetBindings(content::BINDINGS_POLICY_WEB_UI);
}
MojoWebUIControllerBase::~MojoWebUIControllerBase() = default;
void MojoWebUIControllerBase::RenderFrameCreated(
content::RenderFrameHost* render_frame_host) {
render_frame_host->AllowBindings(content::BINDINGS_POLICY_WEB_UI);
MojoWebUIController::MojoWebUIController(content::WebUI* contents)
: MojoWebUIControllerBase(contents),
content::WebContentsObserver(contents->GetWebContents()) {}
MojoWebUIController::~MojoWebUIController() = default;
void MojoWebUIController::OnInterfaceRequestFromFrame(
content::RenderFrameHost* render_frame_host,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
// Right now, this is expected to be called only for main frames.
if (render_frame_host->GetParent()) {
LOG(ERROR) << "Terminating renderer for requesting " << interface_name
<< " interface from subframe";
render_frame_host->GetProcess()->ShutdownForBadMessage(
content::RenderProcessHost::CrashReportMode::GENERATE_CRASH_DUMP);
return;
}
registry_.TryBindInterface(interface_name, interface_pipe);
}
} // namespace ui
......@@ -23,9 +23,6 @@ class MojoWebUIControllerBase : public content::WebUIController {
explicit MojoWebUIControllerBase(content::WebUI* contents);
~MojoWebUIControllerBase() override;
// content::WebUIController overrides:
void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
private:
DISALLOW_COPY_AND_ASSIGN(MojoWebUIControllerBase);
};
......@@ -36,40 +33,27 @@ class MojoWebUIControllerBase : public content::WebUIController {
// files, eg:
// AddMojoResourcePath("chrome/browser/ui/webui/omnibox/omnibox.mojom",
// IDR_OMNIBOX_MOJO_JS);
// . Override BindUIHandler() to create and bind the implementation of the
// bindings.
template <typename Interface>
// . Call AddHandlerToRegistry for all Mojo Interfaces it wishes to handle.
class MojoWebUIController : public MojoWebUIControllerBase,
public content::WebContentsObserver {
public:
explicit MojoWebUIController(content::WebUI* contents)
: MojoWebUIControllerBase(contents),
content::WebContentsObserver(contents->GetWebContents()),
weak_factory_(this) {
registry_.AddInterface<Interface>(base::Bind(
&MojoWebUIController::BindUIHandler, base::Unretained(this)));
}
~MojoWebUIController() override {}
explicit MojoWebUIController(content::WebUI* contents);
~MojoWebUIController() override;
// content::WebContentsObserver implementation.
void OnInterfaceRequestFromFrame(
content::RenderFrameHost* render_frame_host,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override {
// Right now, this is expected to be called only for main frames.
DCHECK(!render_frame_host->GetParent());
registry_.TryBindInterface(interface_name, interface_pipe);
}
mojo::ScopedMessagePipeHandle* interface_pipe) override;
protected:
// Invoked to create the specific bindings implementation.
virtual void BindUIHandler(mojo::InterfaceRequest<Interface> request) = 0;
template <typename Binder>
void AddHandlerToRegistry(Binder binder) {
registry_.AddInterface(std::move(binder));
}
private:
service_manager::BinderRegistry registry_;
base::WeakPtrFactory<MojoWebUIController> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(MojoWebUIController);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment