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, &registry_);
   new autofill::AutofillAgent(render_frame, password_autofill_agent, nullptr,
-                              registry_.get());
+                              &registry_);
 }
 
 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);
 };