Convert Android WebView manifest overlays to C++

Removes JSON manifest overlays from android_webview/browser and
replaces them with C++ Manifest object definitions.

TBR: estade@chromium.org
Bug: 895616
Change-Id: I7fb46141f9c43349cf4b98011014eaea7b717eab
Reviewed-on: https://chromium-review.googlesource.com/c/1404750
Commit-Queue: Ken Rockot <rockot@google.com>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: Bo <boliu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#623766}
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 8bbf041..efd1397 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -477,6 +477,12 @@
     "browser/aw_browser_terminator.h",
     "browser/aw_content_browser_client.cc",
     "browser/aw_content_browser_client.h",
+    "browser/aw_content_browser_overlay_manifest.cc",
+    "browser/aw_content_browser_overlay_manifest.h",
+    "browser/aw_content_renderer_overlay_manifest.cc",
+    "browser/aw_content_renderer_overlay_manifest.h",
+    "browser/aw_content_utility_overlay_manifest.cc",
+    "browser/aw_content_utility_overlay_manifest.h",
     "browser/aw_contents.cc",
     "browser/aw_contents.h",
     "browser/aw_contents_client_bridge.cc",
@@ -735,6 +741,7 @@
     "//base/third_party/dynamic_annotations:dynamic_annotations",
     "//components/autofill/android:provider",
     "//components/autofill/content/browser",
+    "//components/autofill/content/common:mojo_interfaces",
     "//components/autofill/content/renderer",
     "//components/cdm/browser",
     "//components/cdm/renderer",
@@ -774,6 +781,7 @@
     "//components/services/heap_profiling/public/cpp",
     "//components/services/heap_profiling/public/mojom",
     "//components/spellcheck:buildflags",
+    "//components/spellcheck/common:interfaces",
     "//components/supervised_user_error_page",
     "//components/supervised_user_error_page:gin",
     "//components/url_matcher",
@@ -784,6 +792,7 @@
     "//components/visitedlink/renderer",
     "//components/viz/service",
     "//components/web_restrictions:browser",
+    "//components/web_restrictions:interfaces",
     "//content",
     "//content/public/app:both",
     "//content/public/browser",
@@ -811,6 +820,7 @@
     "//storage/browser",
     "//storage/common",
     "//third_party/blink/public:blink",
+    "//third_party/blink/public/common",
     "//third_party/crashpad/crashpad/client",
     "//ui/base",
     "//ui/events:gesture_detection",
diff --git a/android_webview/browser/DEPS b/android_webview/browser/DEPS
index 7310d64..b5e30d9 100644
--- a/android_webview/browser/DEPS
+++ b/android_webview/browser/DEPS
@@ -8,6 +8,7 @@
   "+cc",
   "+components/autofill/android",
   "+components/autofill/content/browser",
+  "+components/autofill/content/common",
   "+components/autofill/core/browser",
   "+components/autofill/core/common",
   "+components/cdm/browser",
@@ -83,5 +84,7 @@
   # For find-in-page
   "+third_party/blink/public/mojom/frame",
   # Required for the Web Speech API.
-  "+third_party/blink/public/mojom/speech"
+  "+third_party/blink/public/mojom/speech",
+  # For the content_browser overlay manifest
+  "+third_party/blink/public/platform",
 ]
diff --git a/android_webview/browser/OWNERS b/android_webview/browser/OWNERS
index 14ba18b..0aa62a2 100644
--- a/android_webview/browser/OWNERS
+++ b/android_webview/browser/OWNERS
@@ -1,10 +1,14 @@
-per-file aw_browser_manifest_overlay.json=set noparent
-per-file aw_browser_manifest_overlay.json=file://ipc/SECURITY_OWNERS
-
-per-file aw_renderer_manifest_overlay.json=set noparent
-per-file aw_renderer_manifest_overlay.json=file://ipc/SECURITY_OWNERS
-
-per-file aw_utility_manifest_overlay.json=set noparent
-per-file aw_utility_manifest_overlay.json=file://ipc/SECURITY_OWNERS
-
 per-file aw_safe_browsing*=ntfschr@chromium.org
+
+per-file aw_content_utility_overlay_manifest.cc=set noparent
+per-file aw_content_utility_overlay_manifest.cc=file://ipc/SECURITY_OWNERS
+per-file aw_content_renderer_overlay_manifest.cc=set noparent
+per-file aw_content_renderer_overlay_manifest.cc=file://ipc/SECURITY_OWNERS
+per-file aw_content_browser_overlay_manifest.h=set noparent
+per-file aw_content_browser_overlay_manifest.h=file://ipc/SECURITY_OWNERS
+per-file aw_content_renderer_overlay_manifest.h=set noparent
+per-file aw_content_renderer_overlay_manifest.h=file://ipc/SECURITY_OWNERS
+per-file aw_content_browser_overlay_manifest.cc=set noparent
+per-file aw_content_browser_overlay_manifest.cc=file://ipc/SECURITY_OWNERS
+per-file aw_content_utility_overlay_manifest.h=set noparent
+per-file aw_content_utility_overlay_manifest.h=file://ipc/SECURITY_OWNERS
diff --git a/android_webview/browser/aw_browser_manifest_overlay.json b/android_webview/browser/aw_browser_manifest_overlay.json
deleted file mode 100644
index ae928e1..0000000
--- a/android_webview/browser/aw_browser_manifest_overlay.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "name": "content_browser",
-  "interface_provider_specs": {
-    "service_manager:connector": {
-      "provides": {
-        "renderer": [
-          "safe_browsing.mojom.SafeBrowsing",
-          "spellcheck.mojom.SpellCheckHost"
-        ],
-        "profiling_client": [
-          "heap_profiling.mojom.ProfilingClient"
-        ]
-      },
-      "requires": {
-        "content_browser": [ "profiling_client" ],
-        "heap_profiling": [ "profiling", "heap_profiler" ]
-      }
-    },
-    "navigation:frame": {
-      "provides": {
-        "renderer": [
-          "autofill.mojom.AutofillDriver",
-          "autofill.mojom.PasswordManagerDriver",
-          "blink.mojom.TextSuggestionHost",
-          "web_restrictions.mojom.WebRestrictions"
-        ]
-      }
-    }
-  }
-}
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index aa532fc..f762a0b 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -10,6 +10,9 @@
 
 #include "android_webview/browser/aw_browser_context.h"
 #include "android_webview/browser/aw_browser_main_parts.h"
+#include "android_webview/browser/aw_content_browser_overlay_manifest.h"
+#include "android_webview/browser/aw_content_renderer_overlay_manifest.h"
+#include "android_webview/browser/aw_content_utility_overlay_manifest.h"
 #include "android_webview/browser/aw_contents.h"
 #include "android_webview/browser/aw_contents_client_bridge.h"
 #include "android_webview/browser/aw_contents_io_thread_client.h"
@@ -42,7 +45,6 @@
 #include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/files/scoped_file.h"
-#include "base/json/json_reader.h"
 #include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "base/stl_util.h"
@@ -671,21 +673,13 @@
 
 base::Optional<service_manager::Manifest>
 AwContentBrowserClient::GetServiceManifestOverlay(base::StringPiece name) {
-  int id = -1;
   if (name == content::mojom::kBrowserServiceName)
-    id = IDR_AW_BROWSER_MANIFEST_OVERLAY;
+    return GetAWContentBrowserOverlayManifest();
   else if (name == content::mojom::kRendererServiceName)
-    id = IDR_AW_RENDERER_MANIFEST_OVERLAY;
+    return GetAWContentRendererOverlayManifest();
   else if (name == content::mojom::kUtilityServiceName)
-    id = IDR_AW_UTILITY_MANIFEST_OVERLAY;
-  if (id == -1)
-    return base::nullopt;
-
-  base::StringPiece manifest_contents =
-      ui::ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
-          id, ui::ScaleFactor::SCALE_FACTOR_NONE);
-  return service_manager::Manifest::FromValueDeprecated(
-      base::JSONReader::Read(manifest_contents));
+    return GetAWContentUtilityOverlayManifest();
+  return base::nullopt;
 }
 
 void AwContentBrowserClient::BindInterfaceRequestFromFrame(
diff --git a/android_webview/browser/aw_content_browser_overlay_manifest.cc b/android_webview/browser/aw_content_browser_overlay_manifest.cc
new file mode 100644
index 0000000..50987664
--- /dev/null
+++ b/android_webview/browser/aw_content_browser_overlay_manifest.cc
@@ -0,0 +1,42 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "android_webview/browser/aw_content_browser_overlay_manifest.h"
+
+#include "base/no_destructor.h"
+#include "components/autofill/content/common/autofill_driver.mojom.h"
+#include "components/safe_browsing/common/safe_browsing.mojom.h"
+#include "components/services/heap_profiling/public/mojom/heap_profiling_client.mojom.h"
+#include "components/spellcheck/common/spellcheck.mojom.h"
+#include "components/web_restrictions/interfaces/web_restrictions.mojom.h"
+#include "services/service_manager/public/cpp/manifest_builder.h"
+#include "third_party/blink/public/platform/input_host.mojom.h"
+
+namespace android_webview {
+
+const service_manager::Manifest& GetAWContentBrowserOverlayManifest() {
+  static base::NoDestructor<service_manager::Manifest> manifest{
+      service_manager::ManifestBuilder()
+          .ExposeCapability("renderer",
+                            service_manager::Manifest::InterfaceList<
+                                safe_browsing::mojom::SafeBrowsing,
+                                spellcheck::mojom::SpellCheckHost>())
+          .ExposeCapability("profiling_client",
+                            service_manager::Manifest::InterfaceList<
+                                heap_profiling::mojom::ProfilingClient>())
+          .RequireCapability("content_browser", "profiling_client")
+          .RequireCapability("heap_profiling", "profiling")
+          .RequireCapability("heap_profiling", "heap_profiler")
+          .ExposeInterfaceFilterCapability_Deprecated(
+              "navigation:frame", "renderer",
+              service_manager::Manifest::InterfaceList<
+                  autofill::mojom::AutofillDriver,
+                  autofill::mojom::PasswordManagerDriver,
+                  blink::mojom::TextSuggestionHost,
+                  web_restrictions::mojom::WebRestrictions>())
+          .Build()};
+  return *manifest;
+}
+
+}  // namespace android_webview
diff --git a/android_webview/browser/aw_content_browser_overlay_manifest.h b/android_webview/browser/aw_content_browser_overlay_manifest.h
new file mode 100644
index 0000000..5e94fa2
--- /dev/null
+++ b/android_webview/browser/aw_content_browser_overlay_manifest.h
@@ -0,0 +1,20 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ANDROID_WEBVIEW_BROWSER_AW_CONTENT_BROWSER_OVERLAY_MANIFEST_H_
+#define ANDROID_WEBVIEW_BROWSER_AW_CONTENT_BROWSER_OVERLAY_MANIFEST_H_
+
+#include "services/service_manager/public/cpp/manifest.h"
+
+namespace android_webview {
+
+// Returns the manifest Android WebView amends to Content's content_browser
+// service manifest. This allows WebView to extend the capabilities exposed
+// and/or required by content_browser service instances, as well as declaring
+// any additional in- and out-of-process per-profile packaged services.
+const service_manager::Manifest& GetAWContentBrowserOverlayManifest();
+
+}  // namespace android_webview
+
+#endif  // ANDROID_WEBVIEW_BROWSER_AW_CONTENT_BROWSER_OVERLAY_MANIFEST_H_
diff --git a/android_webview/browser/aw_content_renderer_overlay_manifest.cc b/android_webview/browser/aw_content_renderer_overlay_manifest.cc
new file mode 100644
index 0000000..e80f785
--- /dev/null
+++ b/android_webview/browser/aw_content_renderer_overlay_manifest.cc
@@ -0,0 +1,28 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "android_webview/browser/aw_content_renderer_overlay_manifest.h"
+
+#include "base/no_destructor.h"
+#include "components/autofill/content/common/autofill_agent.mojom.h"
+#include "components/safe_browsing/common/safe_browsing.mojom.h"
+#include "services/service_manager/public/cpp/manifest_builder.h"
+
+namespace android_webview {
+
+const service_manager::Manifest& GetAWContentRendererOverlayManifest() {
+  static base::NoDestructor<service_manager::Manifest> manifest{
+      service_manager::ManifestBuilder()
+          .ExposeInterfaceFilterCapability_Deprecated(
+              "navigation:frame", "browser",
+              service_manager::Manifest::InterfaceList<
+                  autofill::mojom::AutofillAgent,
+                  autofill::mojom::PasswordAutofillAgent,
+                  autofill::mojom::PasswordGenerationAgent,
+                  safe_browsing::mojom::ThreatReporter>())
+          .Build()};
+  return *manifest;
+}
+
+}  // namespace android_webview
diff --git a/android_webview/browser/aw_content_renderer_overlay_manifest.h b/android_webview/browser/aw_content_renderer_overlay_manifest.h
new file mode 100644
index 0000000..a4202dc
--- /dev/null
+++ b/android_webview/browser/aw_content_renderer_overlay_manifest.h
@@ -0,0 +1,19 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ANDROID_WEBVIEW_BROWSER_AW_CONTENT_RENDERER_OVERLAY_MANIFEST_H_
+#define ANDROID_WEBVIEW_BROWSER_AW_CONTENT_RENDERER_OVERLAY_MANIFEST_H_
+
+#include "services/service_manager/public/cpp/manifest.h"
+
+namespace android_webview {
+
+// Returns the manifest Android WebView amends to Content's content_renderer
+// service manifest. This allows WebView to extend the capabilities exposed
+// and/or required by content_renderer service instances.
+const service_manager::Manifest& GetAWContentRendererOverlayManifest();
+
+}  // namespace android_webview
+
+#endif  // ANDROID_WEBVIEW_BROWSER_AW_CONTENT_RENDERER_OVERLAY_MANIFEST_H_
diff --git a/android_webview/browser/aw_content_utility_overlay_manifest.cc b/android_webview/browser/aw_content_utility_overlay_manifest.cc
new file mode 100644
index 0000000..ff61e90
--- /dev/null
+++ b/android_webview/browser/aw_content_utility_overlay_manifest.cc
@@ -0,0 +1,19 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "android_webview/browser/aw_content_utility_overlay_manifest.h"
+
+#include "base/no_destructor.h"
+#include "components/services/heap_profiling/public/mojom/heap_profiling_client.mojom.h"
+#include "services/service_manager/public/cpp/manifest_builder.h"
+
+const service_manager::Manifest& GetAWContentUtilityOverlayManifest() {
+  static base::NoDestructor<service_manager::Manifest> manifest{
+      service_manager::ManifestBuilder()
+          .ExposeCapability("browser",
+                            service_manager::Manifest::InterfaceList<
+                                heap_profiling::mojom::ProfilingClient>())
+          .Build()};
+  return *manifest;
+}
diff --git a/android_webview/browser/aw_content_utility_overlay_manifest.h b/android_webview/browser/aw_content_utility_overlay_manifest.h
new file mode 100644
index 0000000..12a54b0
--- /dev/null
+++ b/android_webview/browser/aw_content_utility_overlay_manifest.h
@@ -0,0 +1,15 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ANDROID_WEBVIEW_BROWSER_AW_CONTENT_UTILITY_OVERLAY_MANIFEST_H_
+#define ANDROID_WEBVIEW_BROWSER_AW_CONTENT_UTILITY_OVERLAY_MANIFEST_H_
+
+#include "services/service_manager/public/cpp/manifest.h"
+
+// Returns the Manifest Android WebView amends to Contents's content_utility
+// service manifest. This allows WebView to extend the capabilities exposed
+// and/or // required by content_utility service instances
+const service_manager::Manifest& GetAWContentUtilityOverlayManifest();
+
+#endif  // ANDROID_WEBVIEW_BROWSER_AW_CONTENT_UTILITY_OVERLAY_MANIFEST_H_
diff --git a/android_webview/browser/aw_renderer_manifest_overlay.json b/android_webview/browser/aw_renderer_manifest_overlay.json
deleted file mode 100644
index ef3340e7..0000000
--- a/android_webview/browser/aw_renderer_manifest_overlay.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "name": "content_renderer",
-  "interface_provider_specs": {
-    "navigation:frame": {
-      "provides": {
-        "browser": [
-          "autofill.mojom.AutofillAgent",
-          "autofill.mojom.PasswordAutofillAgent",
-          "autofill.mojom.PasswordGenerationAgent",
-          // TODO(crbug.com/811567): Remove this once AwSafeBrowsingBlockingPage
-          // no longer sends a GetThreatDOMDetails IPC.
-          "safe_browsing.mojom.ThreatReporter"
-        ]
-      }
-    }
-  }
-}
diff --git a/android_webview/browser/aw_utility_manifest_overlay.json b/android_webview/browser/aw_utility_manifest_overlay.json
deleted file mode 100644
index 24a09c7..0000000
--- a/android_webview/browser/aw_utility_manifest_overlay.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "name": "content_utility",
-  "interface_provider_specs": {
-    "service_manager:connector": {
-      "provides": {
-        "browser": [
-          "heap_profiling.mojom.ProfilingClient"
-        ]
-      }
-    }
-  }
-}
diff --git a/android_webview/ui/aw_resources.grd b/android_webview/ui/aw_resources.grd
index ffe0f2f..35f5e180 100644
--- a/android_webview/ui/aw_resources.grd
+++ b/android_webview/ui/aw_resources.grd
@@ -9,9 +9,6 @@
   <release seq="1">
     <includes>
       <include name="IDR_AW_LOAD_ERROR_HTML" file="resources\load_error.html" flattenhtml="true" type="BINDATA" />
-      <include name="IDR_AW_BROWSER_MANIFEST_OVERLAY" file="../browser/aw_browser_manifest_overlay.json" type="BINDATA" />
-      <include name="IDR_AW_RENDERER_MANIFEST_OVERLAY" file="../browser/aw_renderer_manifest_overlay.json" type="BINDATA" />
-      <include name="IDR_AW_UTILITY_MANIFEST_OVERLAY" file="../browser/aw_utility_manifest_overlay.json" type="BINDATA" />
     </includes>
   </release>
 </grit>