Skip to content

Commit

Permalink
MCC Refactor step0: Allow embedders to register
Browse files Browse the repository at this point in the history
associated_interface binders with
RenderFrameHostImpl::associated_registry_.

(This series of CLs will refactor Mojo Capability Control(MCC) related
logic.)

Currently embedders bind the associated interfaces by retrieving the
rules listed in ContentBrowserClient::BindAssociatedReceiverFromFrame,
which makes it difficult to perform consistency check when specifying
corresponding binding policies.
So this CL replaces BindAssociatedReceiverFromFrame with
RegisterAssociatedInterfaceBinderForFrame, which allows embedders to
register their binders directly instead of adding rules.

No behavior changes.

-----------
relation chain:

CL(1/N): current CL.
CL(2.*/N):
  These CL move some binding related logic to another class.
  2.1 https://crrev.com/c/3261198
  2.2 https://crrev.com/c/3279325
  2.3 https://crrev.com/c/3279326
CL(3/N): https://crrev.com/c/3278834
  Prepare for CL(4/N). I will introduce ManagedBinderMap, which will
  take over the ownership of mojo::BinderMaps.
CL(4/N): https://crrev.com/c/3291014
  Introduce ManagedBinderMap for consistency check.
CL(5/N): TODO.
  ManagedBinderMap should also take care of AssociatedInterfaceRegistry.

Design doc
https://docs.google.com/document/d/1yQ4aaHrXGiozYLhYM-HuBGKznIKcAI86kKcY9Jp3pkE/edit?resourcekey=0-RjlGRqsDbU-abftgdHpFog#heading=h.tbl610ys2iap

Bug: 1265864, 1157334
Change-Id: Icbe312accf3e7eac734931f29885a7fbc546d0f5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3281481
Reviewed-by: Hiroki Nakagawa <nhiroki@chromium.org>
Reviewed-by: Kouhei Ueno <kouhei@chromium.org>
Reviewed-by: Takashi Toyoshima <toyoshim@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: Alexander Timin <altimin@chromium.org>
Reviewed-by: Rakina Zata Amni <rakina@chromium.org>
Owners-Override: Alexander Timin <altimin@chromium.org>
Commit-Queue: Lingqi Chi <lingqi@chromium.org>
Cr-Commit-Position: refs/heads/main@{#954602}
  • Loading branch information
Clqsin45 authored and Chromium LUCI CQ committed Dec 30, 2021
1 parent 41cb76d commit cdaf0c0
Show file tree
Hide file tree
Showing 17 changed files with 375 additions and 362 deletions.
2 changes: 1 addition & 1 deletion android_webview/browser/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ include_rules = [
"!ui/resources/grit/ui_resources.h",

# For using the same legacy IPC channel for mojo.
"+third_party/blink/public/common/associated_interfaces/associated_interface_provider.h",
"+third_party/blink/public/common/associated_interfaces",
# Required for AwURLLoaderThrottle.
"+third_party/blink/public/common/loader/url_loader_throttle.h",
# For messaging between embedders and Javascript content.
Expand Down
105 changes: 55 additions & 50 deletions android_webview/browser/aw_content_browser_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@
#include "services/network/public/mojom/network_context.mojom.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
#include "third_party/blink/public/common/loader/url_loader_throttle.h"
#include "third_party/blink/public/common/web_preferences/web_preferences.h"
#include "ui/base/resource/resource_bundle.h"
Expand Down Expand Up @@ -609,56 +610,60 @@ AwContentBrowserClient::CreateDevToolsManagerDelegate() {
return std::make_unique<AwDevToolsManagerDelegate>();
}

bool AwContentBrowserClient::BindAssociatedReceiverFromFrame(
content::RenderFrameHost* render_frame_host,
const std::string& interface_name,
mojo::ScopedInterfaceEndpointHandle* handle) {
if (interface_name == autofill::mojom::AutofillDriver::Name_) {
autofill::ContentAutofillDriverFactory::BindAutofillDriver(
mojo::PendingAssociatedReceiver<autofill::mojom::AutofillDriver>(
std::move(*handle)),
render_frame_host);
return true;
}
if (interface_name == content_capture::mojom::ContentCaptureReceiver::Name_) {
content_capture::OnscreenContentProvider::BindContentCaptureReceiver(
mojo::PendingAssociatedReceiver<
content_capture::mojom::ContentCaptureReceiver>(std::move(*handle)),
render_frame_host);
return true;
}
if (interface_name == mojom::FrameHost::Name_) {
AwRenderViewHostExt::BindFrameHost(
mojo::PendingAssociatedReceiver<mojom::FrameHost>(std::move(*handle)),
render_frame_host);
return true;
}
if (interface_name == page_load_metrics::mojom::PageLoadMetrics::Name_) {
page_load_metrics::MetricsWebContentsObserver::BindPageLoadMetrics(
mojo::PendingAssociatedReceiver<
page_load_metrics::mojom::PageLoadMetrics>(std::move(*handle)),
render_frame_host);
return true;
}
if (interface_name == printing::mojom::PrintManagerHost::Name_) {
AwPrintManager::BindPrintManagerHost(
mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost>(
std::move(*handle)),
render_frame_host);
return true;
}
if (interface_name ==
security_interstitials::mojom::InterstitialCommands::Name_) {
security_interstitials::SecurityInterstitialTabHelper::
BindInterstitialCommands(
mojo::PendingAssociatedReceiver<
security_interstitials::mojom::InterstitialCommands>(
std::move(*handle)),
render_frame_host);
return true;
}

return false;
void AwContentBrowserClient::
RegisterAssociatedInterfaceBindersForRenderFrameHost(
content::RenderFrameHost& render_frame_host,
blink::AssociatedInterfaceRegistry& associated_registry) {
// TODO(https://crbug.com/1265864): Move the registry logic below to a
// dedicated file to ensure security review coverage.
// TODO(lingqi): Swap the parameters so that lambda functions are not needed.
associated_registry.AddInterface(base::BindRepeating(
[](content::RenderFrameHost* render_frame_host,
mojo::PendingAssociatedReceiver<autofill::mojom::AutofillDriver>
receiver) {
autofill::ContentAutofillDriverFactory::BindAutofillDriver(
std::move(receiver), render_frame_host);
},
&render_frame_host));
associated_registry.AddInterface(base::BindRepeating(
[](content::RenderFrameHost* render_frame_host,
mojo::PendingAssociatedReceiver<
content_capture::mojom::ContentCaptureReceiver> receiver) {
content_capture::OnscreenContentProvider::BindContentCaptureReceiver(
std::move(receiver), render_frame_host);
},
&render_frame_host));
associated_registry.AddInterface(base::BindRepeating(
[](content::RenderFrameHost* render_frame_host,
mojo::PendingAssociatedReceiver<mojom::FrameHost> receiver) {
AwRenderViewHostExt::BindFrameHost(std::move(receiver),
render_frame_host);
},
&render_frame_host));
associated_registry.AddInterface(base::BindRepeating(
[](content::RenderFrameHost* render_frame_host,
mojo::PendingAssociatedReceiver<
page_load_metrics::mojom::PageLoadMetrics> receiver) {
page_load_metrics::MetricsWebContentsObserver::BindPageLoadMetrics(
std::move(receiver), render_frame_host);
},
&render_frame_host));
associated_registry.AddInterface(base::BindRepeating(
[](content::RenderFrameHost* render_frame_host,
mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost>
receiver) {
AwPrintManager::BindPrintManagerHost(std::move(receiver),
render_frame_host);
},
&render_frame_host));
associated_registry.AddInterface(base::BindRepeating(
[](content::RenderFrameHost* render_frame_host,
mojo::PendingAssociatedReceiver<
security_interstitials::mojom::InterstitialCommands> receiver) {
security_interstitials::SecurityInterstitialTabHelper::
BindInterstitialCommands(std::move(receiver), render_frame_host);
},
&render_frame_host));
}

void AwContentBrowserClient::ExposeInterfacesToRenderer(
Expand Down
7 changes: 3 additions & 4 deletions android_webview/browser/aw_content_browser_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,9 @@ class AwContentBrowserClient : public content::ContentBrowserClient {
content::NavigationHandle* navigation_handle) override;
std::unique_ptr<content::DevToolsManagerDelegate>
CreateDevToolsManagerDelegate() override;
bool BindAssociatedReceiverFromFrame(
content::RenderFrameHost* render_frame_host,
const std::string& interface_name,
mojo::ScopedInterfaceEndpointHandle* handle) override;
void RegisterAssociatedInterfaceBindersForRenderFrameHost(
content::RenderFrameHost& render_frame_host,
blink::AssociatedInterfaceRegistry& associated_registry) override;
void ExposeInterfacesToRenderer(
service_manager::BinderRegistry* registry,
blink::AssociatedInterfaceRegistry* associated_registry,
Expand Down
7 changes: 3 additions & 4 deletions chrome/browser/chrome_content_browser_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -444,10 +444,9 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
void RegisterBrowserInterfaceBindersForServiceWorker(
mojo::BinderMapWithContext<const content::ServiceWorkerVersionBaseInfo&>*
map) override;
bool BindAssociatedReceiverFromFrame(
content::RenderFrameHost* render_frame_host,
const std::string& interface_name,
mojo::ScopedInterfaceEndpointHandle* handle) override;
void RegisterAssociatedInterfaceBindersForRenderFrameHost(
content::RenderFrameHost& render_frame_host,
blink::AssociatedInterfaceRegistry& associated_registry) override;
void BindGpuHostReceiver(mojo::GenericPendingReceiver receiver) override;
void BindUtilityHostReceiver(mojo::GenericPendingReceiver receiver) override;
void BindHostReceiverForRenderer(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ void RegisterPoliciesForNonAssociatedInterfaces(
}

// Registers policies for channel-associated interfaces registered in
// `BindAssociatedReceiverFromFrame()`.
// `RegisterAssociatedInterfaceBindersForRenderFrameHost()`.
void RegisterPoliciesForChannelAssociatedInterfaces(
content::MojoBinderPolicyMap& policy_map) {
policy_map.SetAssociatedPolicy<page_load_metrics::mojom::PageLoadMetrics>(
Expand Down
Loading

0 comments on commit cdaf0c0

Please sign in to comment.