Use Channel-associated interfaces for autofill IPC
This converts autofill and password manager use Channel-assocaited
interfaces for the AutofillDriver and AutofillAgent mojom interfaces.
This is necessary due to subtle timing dependencies between autofill
IPC and frame IPC (e.g. FrameHostMsg_Detach) which were exposed when
attempting to make changes to mojom message dispatch scheduling.
Bug: 866616
Change-Id: I2b2f521673715b1a6aa7bbb59dad605306b175de
Reviewed-on: https://chromium-review.googlesource.com/1148587
Commit-Queue: Ken Rockot <[email protected]>
Reviewed-by: Evan Stade <[email protected]>
Reviewed-by: John Abd-El-Malek <[email protected]>
Reviewed-by: Daniel Cheng <[email protected]>
Cr-Commit-Position: refs/heads/master@{#579420}
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index 2cf10c04..ce2403f6 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -202,8 +202,6 @@
}
AwContentBrowserClient::AwContentBrowserClient() : net_log_(new net::NetLog()) {
- frame_interfaces_.AddInterface(base::BindRepeating(
- &autofill::ContentAutofillDriverFactory::BindAutofillDriver));
// Although WebView does not support password manager feature, renderer code
// could still request this interface, so we register a dummy binder which
// just drops the incoming request, to avoid the 'Failed to locate a binder
@@ -572,6 +570,20 @@
render_frame_host);
}
+bool AwContentBrowserClient::BindAssociatedInterfaceRequestFromFrame(
+ content::RenderFrameHost* render_frame_host,
+ const std::string& interface_name,
+ mojo::ScopedInterfaceEndpointHandle* handle) {
+ if (interface_name == autofill::mojom::AutofillDriver::Name_) {
+ autofill::ContentAutofillDriverFactory::BindAutofillDriver(
+ autofill::mojom::AutofillDriverAssociatedRequest(std::move(*handle)),
+ render_frame_host);
+ return true;
+ }
+
+ return false;
+}
+
void AwContentBrowserClient::ExposeInterfacesToRenderer(
service_manager::BinderRegistry* registry,
blink::AssociatedInterfaceRegistry* associated_registry,
diff --git a/android_webview/browser/aw_content_browser_client.h b/android_webview/browser/aw_content_browser_client.h
index 54446a7..cca2d26 100644
--- a/android_webview/browser/aw_content_browser_client.h
+++ b/android_webview/browser/aw_content_browser_client.h
@@ -148,6 +148,10 @@
content::RenderFrameHost* render_frame_host,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) override;
+ bool BindAssociatedInterfaceRequestFromFrame(
+ content::RenderFrameHost* render_frame_host,
+ const std::string& interface_name,
+ mojo::ScopedInterfaceEndpointHandle* handle) override;
void ExposeInterfacesToRenderer(
service_manager::BinderRegistry* registry,
blink::AssociatedInterfaceRegistry* associated_registry,
diff --git a/android_webview/renderer/DEPS b/android_webview/renderer/DEPS
index 0566009..d626ee80 100644
--- a/android_webview/renderer/DEPS
+++ b/android_webview/renderer/DEPS
@@ -25,6 +25,7 @@
"+services/network/public/cpp",
"+services/service_manager/public/cpp",
+ "+third_party/blink/public/common",
"+third_party/blink/public/platform",
"+third_party/blink/public/web",
diff --git a/android_webview/renderer/aw_render_frame_ext.cc b/android_webview/renderer/aw_render_frame_ext.cc
index 298aed63..8f23bb6 100644
--- a/android_webview/renderer/aw_render_frame_ext.cc
+++ b/android_webview/renderer/aw_render_frame_ext.cc
@@ -142,23 +142,21 @@
AwRenderFrameExt::AwRenderFrameExt(content::RenderFrame* render_frame)
: content::RenderFrameObserver(render_frame) {
- registry_ = std::make_unique<service_manager::BinderRegistry>();
-
// TODO(sgurun) do not create a password autofill agent (change
// autofill agent to store a weakptr).
autofill::PasswordAutofillAgent* password_autofill_agent =
- new autofill::PasswordAutofillAgent(render_frame, registry_.get());
+ new autofill::PasswordAutofillAgent(render_frame, ®istry_);
new autofill::AutofillAgent(render_frame, password_autofill_agent, nullptr,
- registry_.get());
+ ®istry_);
}
AwRenderFrameExt::~AwRenderFrameExt() {
}
-void AwRenderFrameExt::OnInterfaceRequestForFrame(
+bool AwRenderFrameExt::OnAssociatedInterfaceRequestForFrame(
const std::string& interface_name,
- mojo::ScopedMessagePipeHandle* interface_pipe) {
- registry_->TryBindInterface(interface_name, interface_pipe);
+ mojo::ScopedInterfaceEndpointHandle* handle) {
+ return registry_.TryBindInterface(interface_name, handle);
}
void AwRenderFrameExt::DidCommitProvisionalLoad(
diff --git a/android_webview/renderer/aw_render_frame_ext.h b/android_webview/renderer/aw_render_frame_ext.h
index 55d4b38..dfa6ec9 100644
--- a/android_webview/renderer/aw_render_frame_ext.h
+++ b/android_webview/renderer/aw_render_frame_ext.h
@@ -7,7 +7,7 @@
#include "base/macros.h"
#include "content/public/renderer/render_frame_observer.h"
-#include "services/service_manager/public/cpp/binder_registry.h"
+#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/size.h"
@@ -33,9 +33,9 @@
~AwRenderFrameExt() override;
// RenderFrameObserver:
- void OnInterfaceRequestForFrame(
+ bool OnAssociatedInterfaceRequestForFrame(
const std::string& interface_name,
- mojo::ScopedMessagePipeHandle* interface_pipe) override;
+ mojo::ScopedInterfaceEndpointHandle* handle) override;
void DidCommitProvisionalLoad(bool is_new_navigation,
bool is_same_document_navigation) override;
@@ -62,7 +62,7 @@
url::Origin last_origin_;
- std::unique_ptr<service_manager::BinderRegistry> registry_;
+ blink::AssociatedInterfaceRegistry registry_;
DISALLOW_COPY_AND_ASSIGN(AwRenderFrameExt);
};