Make payment manifest download/parse cross-platform

Reason for the refactor is an upcoming change to download/parse the
payment manifest on desktop in addition to Android.

1) This patch moves downloader and parser utility into cross-platform
   directory //components/payments/content.

2) The cross-platform PaymentManifestParserHost has been separated from
   its Android wrapper PaymentManifestParserAndroid.

3) GN build target renames:
   a) Payments mojom targets have been renamed to include the string
      "mojom" for clarity.
   b) The main target of "//components/payments/content" has been
      renamed to "content" for brevity.
   c) The "//components/payments/content:payment_validators" target has
      been renamed to "//components/payments/content:utils", because it
      now contains manifest downloader and parser.

Manifest download is currently used only on Android after enabling the
chrome://flags/#android-payment-apps flag.

BUG=683329

Review-Url: https://codereview.chromium.org/2759283002
Cr-Commit-Position: refs/heads/master@{#460141}
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index e1d3bbb..0b67e34 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -184,9 +184,9 @@
     "//components/navigation_interception/android:navigation_interception_java",
     "//components/ntp_tiles/android:ntp_tiles_java",
     "//components/offline_items_collection/core:core_java",
-    "//components/payments/content:payment_request_java",
+    "//components/payments/content:mojom_java",
+    "//components/payments/content:mojom_parser_java",
     "//components/payments/content/android:java",
-    "//components/payments/content/android:mojom_java",
     "//components/policy/android:policy_java",
     "//components/precache/android:precache_java",
     "//components/safe_browsing_db/android:safe_browsing_java",
@@ -345,9 +345,9 @@
     "//chrome/test/android:chrome_java_test_support",
     "//components/bookmarks/common/android:bookmarks_java",
     "//components/invalidation/impl:java",
-    "//components/payments/content:payment_request_java",
+    "//components/payments/content:mojom_java",
+    "//components/payments/content:mojom_parser_java",
     "//components/payments/content/android:java",
-    "//components/payments/content/android:mojom_java",
     "//components/signin/core/browser/android:java",
     "//components/signin/core/browser/android:signin_java_test_support",
     "//components/sync:sync_java_test_support",
@@ -427,9 +427,9 @@
     "//components/minidump_uploader:minidump_uploader_java",
     "//components/minidump_uploader:minidump_uploader_javatests",
     "//components/navigation_interception/android:navigation_interception_java",
-    "//components/payments/content:payment_request_java",
+    "//components/payments/content:mojom_java",
+    "//components/payments/content:mojom_parser_java",
     "//components/payments/content/android:java",
-    "//components/payments/content/android:mojom_java",
     "//components/policy/android:policy_java",
     "//components/precache/android:precache_java",
     "//components/precache/android:precache_javatests",
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 733cd44b..6bee5f7a 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1497,8 +1497,8 @@
     "//components/password_manager/core/browser",
     "//components/password_manager/core/common",
     "//components/password_manager/sync/browser",
-    "//components/payments/content:payment_app",
-    "//components/payments/content:payment_request",
+    "//components/payments/content:mojom",
+    "//components/payments/content:mojom_payment_app",
     "//components/physical_web/eddystone",
     "//components/policy:generated",
     "//components/policy/core/browser",
@@ -3692,7 +3692,7 @@
       "payments/payment_request_factory.cc",
       "payments/payment_request_factory.h",
     ]
-    deps += [ "//components/payments/content:payment_request_impl" ]
+    deps += [ "//components/payments/content" ]
   }
 
   if (is_linux || is_win) {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 9dca6e97..a33d66e 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1573,8 +1573,7 @@
     deps += [
       "//chrome/browser/ui/views",
       "//components/constrained_window",
-      "//components/payments/content:payment_request_impl",
-      "//components/payments/content:payment_validation",
+      "//components/payments/content",
       "//components/payments/core",
       "//services/ui/public/cpp/input_devices",
     ]
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn
index 7da4a0f..2f48b54 100644
--- a/chrome/utility/BUILD.gn
+++ b/chrome/utility/BUILD.gn
@@ -38,6 +38,7 @@
     "//chrome:strings",
     "//chrome/common",
     "//chrome/common:mojo_bindings",
+    "//components/payments/content/utility",
     "//components/safe_json/utility",
     "//components/search_engines",
     "//components/strings",
@@ -98,10 +99,6 @@
     ]
   }
 
-  if (is_android) {
-    deps += [ "//components/payments/content/android/utility" ]
-  }
-
   if (enable_extensions) {
     sources += [
       "extensions/extensions_handler.cc",
diff --git a/chrome/utility/DEPS b/chrome/utility/DEPS
index b75a35d..17f0adb 100644
--- a/chrome/utility/DEPS
+++ b/chrome/utility/DEPS
@@ -1,7 +1,7 @@
 include_rules = [
   "+chrome/grit",
   "+chrome/installer/util",
-  "+components/payments/content/android/utility",
+  "+components/payments/content/utility",
   "+components/safe_json",
   "+components/wifi",
   "+content/public/child",
diff --git a/chrome/utility/chrome_content_utility_client.cc b/chrome/utility/chrome_content_utility_client.cc
index b143788..15e0ea66 100644
--- a/chrome/utility/chrome_content_utility_client.cc
+++ b/chrome/utility/chrome_content_utility_client.cc
@@ -16,6 +16,7 @@
 #include "chrome/common/file_patcher.mojom.h"
 #include "chrome/utility/media_router/dial_device_description_parser_impl.h"
 #include "chrome/utility/utility_message_handler.h"
+#include "components/payments/content/utility/payment_manifest_parser.h"
 #include "components/safe_json/utility/safe_json_parser_mojo_impl.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/service_info.h"
@@ -34,8 +35,6 @@
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "net/proxy/mojo_proxy_resolver_factory_impl.h"
 #include "net/proxy/proxy_resolver_v8.h"
-#else
-#include "components/payments/content/android/utility/payment_manifest_parser.h"
 #endif
 
 #if defined(OS_CHROMEOS)
@@ -280,9 +279,8 @@
       base::Bind(CreateProxyResolverFactory));
   registry->AddInterface(base::Bind(CreateResourceUsageReporter));
   registry->AddInterface(base::Bind(&ProfileImportHandler::Create));
-#else
-  registry->AddInterface(base::Bind(&payments::PaymentManifestParser::Create));
 #endif
+  registry->AddInterface(base::Bind(&payments::PaymentManifestParser::Create));
   registry->AddInterface(
       base::Bind(&safe_json::SafeJsonParserMojoImpl::Create));
 #if defined(OS_WIN)
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 71306c3..8caafb9 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -205,6 +205,7 @@
       "//components/packed_ct_ev_whitelist:unit_tests",
       "//components/password_manager/content/browser:unit_tests",
       "//components/payments/content:unit_tests",
+      "//components/payments/content/utility:unit_tests",
       "//components/policy/core/browser:unit_tests",
       "//components/policy/core/common:unit_tests",
       "//components/precache/content:unit_tests",
@@ -247,8 +248,6 @@
       "//components/gcm_driver/instance_id/android:instance_id_driver_test_support_java",
       "//components/invalidation/impl",
       "//components/invalidation/impl:java",
-      "//components/payments/content/android:unit_tests",
-      "//components/payments/content/android/utility:unit_tests",
       "//components/policy/android:policy_java",
       "//components/safe_json",
       "//components/safe_json/android:safe_json_java",
diff --git a/components/payments/content/BUILD.gn b/components/payments/content/BUILD.gn
index bc33a0f..7fd84def 100644
--- a/components/payments/content/BUILD.gn
+++ b/components/payments/content/BUILD.gn
@@ -4,24 +4,7 @@
 
 import("//mojo/public/tools/bindings/mojom.gni")
 
-mojom("payment_request") {
-  sources = [
-    "payment_request.mojom",
-  ]
-}
-
-mojom("payment_app") {
-  sources = [
-    "payment_app.mojom",
-  ]
-
-  public_deps = [
-    ":payment_request",
-    "//url/mojo:url_mojom_gurl",
-  ]
-}
-
-static_library("payment_request_impl") {
+static_library("content") {
   sources = [
     "payment_request.cc",
     "payment_request.h",
@@ -36,8 +19,8 @@
   ]
 
   deps = [
-    ":payment_request",
-    ":payment_validation",
+    ":mojom",
+    ":utils",
     "//components/autofill/core/browser",
     "//components/payments/core",
     "//content/public/browser",
@@ -45,20 +28,54 @@
   ]
 }
 
-static_library("payment_validation") {
+mojom("mojom") {
+  sources = [
+    "payment_request.mojom",
+  ]
+}
+
+mojom("mojom_parser") {
+  sources = [
+    "payment_manifest_parser.mojom",
+  ]
+}
+
+mojom("mojom_payment_app") {
+  sources = [
+    "payment_app.mojom",
+  ]
+
+  public_deps = [
+    ":mojom",
+    "//url/mojo:url_mojom_gurl",
+  ]
+}
+
+static_library("utils") {
   sources = [
     "payment_details_validation.cc",
     "payment_details_validation.h",
+    "payment_manifest_downloader.cc",
+    "payment_manifest_downloader.h",
+    "payment_manifest_parser_host.cc",
+    "payment_manifest_parser_host.h",
     "payments_validators.cc",
     "payments_validators.h",
   ]
 
   deps = [
-    ":payment_request",
+    ":mojom",
+    ":mojom_parser",
     "//base",
     "//components/autofill/core/browser",
+    "//components/data_use_measurement/core",
+    "//components/link_header_util",
     "//components/payments/core",
+    "//components/strings",
+    "//content/public/browser",
+    "//net",
     "//third_party/re2",
+    "//ui/base",
     "//url",
   ]
 
@@ -71,19 +88,22 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "payment_manifest_downloader_unittest.cc",
     "payment_request_spec_unittest.cc",
     "payment_request_state_unittest.cc",
     "payments_validators_unittest.cc",
   ]
 
   deps = [
-    ":payment_request",
-    ":payment_request_impl",
-    ":payment_validation",
+    ":content",
+    ":mojom",
+    ":utils",
     "//base",
     "//base/test:test_support",
     "//components/autofill/core/browser",
     "//components/autofill/core/browser:test_support",
+    "//content/test:test_support",
+    "//net:test_support",
     "//testing/gtest",
     "//third_party/icu",
     "//third_party/libaddressinput:test_support",
diff --git a/components/payments/content/DEPS b/components/payments/content/DEPS
index a3fc48c..c72416a 100644
--- a/components/payments/content/DEPS
+++ b/components/payments/content/DEPS
@@ -1,7 +1,13 @@
 include_rules = [
   "-components/payments/content/android",
+  "-components/payments/content/utility",
   "+components/autofill",
+  "+components/data_use_measurement",
+  "+components/link_header_util",
+  "+components/strings",
   "+content/public",
   "+mojo/public/cpp",
+  "+net",
   "+third_party/re2",
+  "+ui/base",
 ]
diff --git a/components/payments/content/android/BUILD.gn b/components/payments/content/android/BUILD.gn
index c03930d..1978d227 100644
--- a/components/payments/content/android/BUILD.gn
+++ b/components/payments/content/android/BUILD.gn
@@ -22,30 +22,13 @@
     "payment_manifest_parser_android.h",
   ]
   deps = [
-    ":downloader",
     ":jni_headers",
-    ":mojom",
     "//base",
-    "//components/payments/content:payment_request",
-    "//components/payments/content:payment_validation",
+    "//components/payments/content:mojom",
+    "//components/payments/content:utils",
     "//components/payments/core",
-    "//components/strings",
     "//content/public/browser",
     "//net",
-    "//ui/base",
-  ]
-}
-
-static_library("downloader") {
-  sources = [
-    "payment_manifest_downloader.cc",
-    "payment_manifest_downloader.h",
-  ]
-  deps = [
-    "//base",
-    "//components/data_use_measurement/core",
-    "//components/link_header_util",
-    "//net",
   ]
 }
 
@@ -69,30 +52,10 @@
     "java/src/org/chromium/components/payments/PaymentValidator.java",
   ]
   deps = [
-    ":mojom_java",
     "//base:base_java",
-    "//components/payments/content:payment_request_java",
+    "//components/payments/content:mojom_java",
+    "//components/payments/content:mojom_parser_java",
     "//content/public/android:content_java",
     "//mojo/public/java:bindings_java",
   ]
 }
-
-mojom("mojom") {
-  sources = [
-    "payment_manifest_parser.mojom",
-  ]
-}
-
-source_set("unit_tests") {
-  testonly = true
-  sources = [
-    "payment_manifest_downloader_unittest.cc",
-  ]
-  deps = [
-    ":downloader",
-    "//base",
-    "//content/test:test_support",
-    "//net:test_support",
-    "//testing/gtest",
-  ]
-}
diff --git a/components/payments/content/android/DEPS b/components/payments/content/android/DEPS
index b05ee8b..c80012b5 100644
--- a/components/payments/content/android/DEPS
+++ b/components/payments/content/android/DEPS
@@ -1,9 +1,3 @@
 include_rules = [
-  "-components/payments/content/android/utility",
-  "+components/data_use_measurement",
-  "+components/link_header_util",
-  "+components/strings",
   "+jni",
-  "+net",
-  "+ui/base",
 ]
diff --git a/components/payments/content/android/payment_manifest_downloader_android.cc b/components/payments/content/android/payment_manifest_downloader_android.cc
index 1e3ae804..da777cd 100644
--- a/components/payments/content/android/payment_manifest_downloader_android.cc
+++ b/components/payments/content/android/payment_manifest_downloader_android.cc
@@ -11,7 +11,7 @@
 #include "base/android/scoped_java_ref.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
-#include "components/payments/content/android/payment_manifest_downloader.h"
+#include "components/payments/content/payment_manifest_downloader.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
diff --git a/components/payments/content/android/payment_manifest_parser_android.cc b/components/payments/content/android/payment_manifest_parser_android.cc
index fbc1056..012d9ea 100644
--- a/components/payments/content/android/payment_manifest_parser_android.cc
+++ b/components/payments/content/android/payment_manifest_parser_android.cc
@@ -11,29 +11,30 @@
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
 #include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/numerics/safe_conversions.h"
-#include "components/strings/grit/components_strings.h"
-#include "content/public/browser/utility_process_mojo_client.h"
 #include "jni/PaymentManifestParser_jni.h"
-#include "ui/base/l10n/l10n_util.h"
 
 namespace payments {
+namespace {
 
-class PaymentManifestParserAndroid::ParseCallback {
+class ParseCallback {
  public:
   explicit ParseCallback(const base::android::JavaParamRef<jobject>& jcallback)
       : jcallback_(jcallback) {}
 
   ~ParseCallback() {}
 
-  void OnManifestParseSuccess(
+  void OnManifestParsed(
       std::vector<mojom::PaymentManifestSectionPtr> manifest) {
-    DCHECK(!manifest.empty());
-
     JNIEnv* env = base::android::AttachCurrentThread();
+
+    if (manifest.empty()) {
+      // Can trigger synchronous deletion of PaymentManifestParserAndroid.
+      Java_ManifestParseCallback_onManifestParseFailure(env, jcallback_);
+      return;
+    }
+
     base::android::ScopedJavaLocalRef<jobjectArray> jmanifest =
         Java_PaymentManifestParser_createManifest(env, manifest.size());
 
@@ -69,18 +70,14 @@
                                                       jmanifest.obj());
   }
 
-  void OnManifestParseFailure() {
-    // Can trigger synchronous deletion of PaymentManifestParserAndroid.
-    Java_ManifestParseCallback_onManifestParseFailure(
-        base::android::AttachCurrentThread(), jcallback_);
-  }
-
  private:
   base::android::ScopedJavaGlobalRef<jobject> jcallback_;
 
   DISALLOW_COPY_AND_ASSIGN(ParseCallback);
 };
 
+}  // namespace
+
 PaymentManifestParserAndroid::PaymentManifestParserAndroid() {}
 
 PaymentManifestParserAndroid::~PaymentManifestParserAndroid() {}
@@ -88,13 +85,7 @@
 void PaymentManifestParserAndroid::StartUtilityProcess(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& jcaller) {
-  mojo_client_ = base::MakeUnique<
-      content::UtilityProcessMojoClient<mojom::PaymentManifestParser>>(
-      l10n_util::GetStringUTF16(IDS_UTILITY_PROCESS_MANIFEST_PARSER_NAME));
-  mojo_client_->set_error_callback(
-      base::Bind(&PaymentManifestParserAndroid::OnUtilityProcessStopped,
-                 base::Unretained(this)));
-  mojo_client_->Start();
+  host_.StartUtilityProcess();
 }
 
 void PaymentManifestParserAndroid::ParsePaymentManifest(
@@ -102,22 +93,10 @@
     const base::android::JavaParamRef<jobject>& jcaller,
     const base::android::JavaParamRef<jstring>& jcontent,
     const base::android::JavaParamRef<jobject>& jcallback) {
-  std::unique_ptr<ParseCallback> pending_callback =
-      base::MakeUnique<ParseCallback>(jcallback);
-
-  if (!mojo_client_) {
-    pending_callback->OnManifestParseFailure();
-    return;
-  }
-
-  ParseCallback* callback_identifier = pending_callback.get();
-  pending_callbacks_.push_back(std::move(pending_callback));
-  DCHECK_GE(10U, pending_callbacks_.size());
-
-  mojo_client_->service()->Parse(
+  host_.ParsePaymentManifest(
       base::android::ConvertJavaStringToUTF8(env, jcontent),
-      base::Bind(&PaymentManifestParserAndroid::OnParse, base::Unretained(this),
-                 callback_identifier));
+      base::BindOnce(&ParseCallback::OnManifestParsed,
+                     base::MakeUnique<ParseCallback>(jcallback)));
 }
 
 void PaymentManifestParserAndroid::StopUtilityProcess(
@@ -126,42 +105,6 @@
   delete this;
 }
 
-void PaymentManifestParserAndroid::OnParse(
-    ParseCallback* callback_identifier,
-    std::vector<mojom::PaymentManifestSectionPtr> manifest) {
-  // At most 10 manifests to parse, so iterating a vector is not too slow.
-  for (auto it = pending_callbacks_.begin(); it != pending_callbacks_.end();
-       ++it) {
-    if (it->get() == callback_identifier) {
-      std::unique_ptr<ParseCallback> pending_callback = std::move(*it);
-      pending_callbacks_.erase(it);
-
-      // Can trigger synchronous deletion of this object, so can't access any of
-      // the member variables after this block.
-      if (manifest.empty())
-        pending_callback->OnManifestParseFailure();
-      else
-        pending_callback->OnManifestParseSuccess(std::move(manifest));
-      return;
-    }
-  }
-
-  // If unable to find the pending callback, then something went wrong in the
-  // utility process. Stop the utility process and notify all callbacks.
-  OnUtilityProcessStopped();
-}
-
-void PaymentManifestParserAndroid::OnUtilityProcessStopped() {
-  mojo_client_.reset();
-  std::vector<std::unique_ptr<ParseCallback>> callbacks =
-      std::move(pending_callbacks_);
-  for (const auto& callback : callbacks) {
-    // Can trigger synchronous deletion of this object, so can't access any of
-    // the member variables after this line.
-    callback->OnManifestParseFailure();
-  }
-}
-
 bool RegisterPaymentManifestParser(JNIEnv* env) {
   return RegisterNativesImpl(env);
 }
diff --git a/components/payments/content/android/payment_manifest_parser_android.h b/components/payments/content/android/payment_manifest_parser_android.h
index 0b6250a..3dc312a 100644
--- a/components/payments/content/android/payment_manifest_parser_android.h
+++ b/components/payments/content/android/payment_manifest_parser_android.h
@@ -13,16 +13,12 @@
 #include "base/android/jni_android.h"
 #include "base/android/scoped_java_ref.h"
 #include "base/macros.h"
-#include "components/payments/content/android/payment_manifest_parser.mojom.h"
-
-namespace content {
-template <class MojoInterface>
-class UtilityProcessMojoClient;
-}
+#include "components/payments/content/payment_manifest_parser_host.h"
 
 namespace payments {
 
-// Host of the utility process that parses manifest contents.
+// Android wrapper for the host of the utility process that parses manifest
+// contents.
 class PaymentManifestParserAndroid {
  public:
   PaymentManifestParserAndroid();
@@ -42,19 +38,7 @@
                           const base::android::JavaParamRef<jobject>& jcaller);
 
  private:
-  class ParseCallback;
-
-  // The |callback_identifier| parameter is a pointer to one of the owned
-  // elements in the |pending_callbacks_| list.
-  void OnParse(ParseCallback* callback_identifier,
-               std::vector<mojom::PaymentManifestSectionPtr> manifest);
-
-  void OnUtilityProcessStopped();
-
-  std::unique_ptr<
-      content::UtilityProcessMojoClient<mojom::PaymentManifestParser>>
-      mojo_client_;
-  std::vector<std::unique_ptr<ParseCallback>> pending_callbacks_;
+  PaymentManifestParserHost host_;
 
   DISALLOW_COPY_AND_ASSIGN(PaymentManifestParserAndroid);
 };
diff --git a/components/payments/content/android/payment_manifest_downloader.cc b/components/payments/content/payment_manifest_downloader.cc
similarity index 97%
rename from components/payments/content/android/payment_manifest_downloader.cc
rename to components/payments/content/payment_manifest_downloader.cc
index 052f32e8..799769f5 100644
--- a/components/payments/content/android/payment_manifest_downloader.cc
+++ b/components/payments/content/payment_manifest_downloader.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/payments/content/android/payment_manifest_downloader.h"
+#include "components/payments/content/payment_manifest_downloader.h"
 
 #include <algorithm>
 #include <unordered_map>
diff --git a/components/payments/content/android/payment_manifest_downloader.h b/components/payments/content/payment_manifest_downloader.h
similarity index 92%
rename from components/payments/content/android/payment_manifest_downloader.h
rename to components/payments/content/payment_manifest_downloader.h
index eb02b61..7ef171d 100644
--- a/components/payments/content/android/payment_manifest_downloader.h
+++ b/components/payments/content/payment_manifest_downloader.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_PAYMENTS_CONTENT_ANDROID_PAYMENT_MANIFEST_DOWNLOADER_H_
-#define COMPONENTS_PAYMENTS_CONTENT_ANDROID_PAYMENT_MANIFEST_DOWNLOADER_H_
+#ifndef COMPONENTS_PAYMENTS_CONTENT_PAYMENT_MANIFEST_DOWNLOADER_H_
+#define COMPONENTS_PAYMENTS_CONTENT_PAYMENT_MANIFEST_DOWNLOADER_H_
 
 #include <memory>
 #include <string>
@@ -95,4 +95,4 @@
 
 }  // namespace payments
 
-#endif  // COMPONENTS_PAYMENTS_CONTENT_ANDROID_PAYMENT_MANIFEST_DOWNLOADER_H_
+#endif  // COMPONENTS_PAYMENTS_CONTENT_PAYMENT_MANIFEST_DOWNLOADER_H_
diff --git a/components/payments/content/android/payment_manifest_downloader_unittest.cc b/components/payments/content/payment_manifest_downloader_unittest.cc
similarity index 98%
rename from components/payments/content/android/payment_manifest_downloader_unittest.cc
rename to components/payments/content/payment_manifest_downloader_unittest.cc
index e69c60b..b9f39c72 100644
--- a/components/payments/content/android/payment_manifest_downloader_unittest.cc
+++ b/components/payments/content/payment_manifest_downloader_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/payments/content/android/payment_manifest_downloader.h"
+#include "components/payments/content/payment_manifest_downloader.h"
 
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/public/test/test_browser_thread_bundle.h"
diff --git a/components/payments/content/android/payment_manifest_parser.mojom b/components/payments/content/payment_manifest_parser.mojom
similarity index 100%
rename from components/payments/content/android/payment_manifest_parser.mojom
rename to components/payments/content/payment_manifest_parser.mojom
diff --git a/components/payments/content/payment_manifest_parser_host.cc b/components/payments/content/payment_manifest_parser_host.cc
new file mode 100644
index 0000000..04c13d25
--- /dev/null
+++ b/components/payments/content/payment_manifest_parser_host.cc
@@ -0,0 +1,85 @@
+// Copyright 2017 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 "components/payments/content/payment_manifest_parser_host.h"
+
+#include <algorithm>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#include "components/strings/grit/components_strings.h"
+#include "content/public/browser/utility_process_mojo_client.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace payments {
+
+PaymentManifestParserHost::PaymentManifestParserHost() {}
+
+PaymentManifestParserHost::~PaymentManifestParserHost() {}
+
+void PaymentManifestParserHost::StartUtilityProcess() {
+  mojo_client_ = base::MakeUnique<
+      content::UtilityProcessMojoClient<mojom::PaymentManifestParser>>(
+      l10n_util::GetStringUTF16(
+          IDS_UTILITY_PROCESS_PAYMENT_MANIFEST_PARSER_NAME));
+  mojo_client_->set_error_callback(
+      base::Bind(&PaymentManifestParserHost::OnUtilityProcessStopped,
+                 base::Unretained(this)));
+  mojo_client_->Start();
+}
+
+void PaymentManifestParserHost::ParsePaymentManifest(const std::string& content,
+                                                     Callback callback) {
+  if (!mojo_client_) {
+    std::move(callback).Run(std::vector<mojom::PaymentManifestSectionPtr>());
+    return;
+  }
+
+  pending_callbacks_.push_back(std::move(callback));
+  DCHECK_GE(10U, pending_callbacks_.size());
+  Callback* callback_identifier = &pending_callbacks_.back();
+
+  mojo_client_->service()->Parse(
+      content, base::Bind(&PaymentManifestParserHost::OnParse,
+                          base::Unretained(this), callback_identifier));
+}
+
+void PaymentManifestParserHost::OnParse(
+    const Callback* callback_identifier,
+    std::vector<mojom::PaymentManifestSectionPtr> manifest) {
+  // At most 10 manifests to parse, so iterating a vector is not too slow.
+  const auto& pending_callback_it =
+      std::find_if(pending_callbacks_.begin(), pending_callbacks_.end(),
+                   [callback_identifier](const Callback& pending_callback) {
+                     return &pending_callback == callback_identifier;
+                   });
+  if (pending_callback_it == pending_callbacks_.end()) {
+    // If unable to find the pending callback, then something went wrong in the
+    // utility process. Stop the utility process and notify all callbacks.
+    OnUtilityProcessStopped();
+    return;
+  }
+
+  Callback callback = std::move(*pending_callback_it);
+  pending_callbacks_.erase(pending_callback_it);
+
+  // Can trigger synchronous deletion of this object, so can't access any of
+  // the member variables after this block.
+  std::move(callback).Run(std::move(manifest));
+}
+
+void PaymentManifestParserHost::OnUtilityProcessStopped() {
+  mojo_client_.reset();
+  std::vector<Callback> callbacks = std::move(pending_callbacks_);
+  for (Callback& callback : callbacks) {
+    // Can trigger synchronous deletion of this object, so can't access any of
+    // the member variables after this line.
+    std::move(callback).Run(std::vector<mojom::PaymentManifestSectionPtr>());
+  }
+}
+
+}  // namespace payments
diff --git a/components/payments/content/payment_manifest_parser_host.h b/components/payments/content/payment_manifest_parser_host.h
new file mode 100644
index 0000000..be95d8e
--- /dev/null
+++ b/components/payments/content/payment_manifest_parser_host.h
@@ -0,0 +1,60 @@
+// Copyright 2017 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 COMPONENTS_PAYMENTS_CONTENT_PAYMENT_MANIFEST_PARSER_HOST_H_
+#define COMPONENTS_PAYMENTS_CONTENT_PAYMENT_MANIFEST_PARSER_HOST_H_
+
+#include <memory>
+#include <vector>
+
+#include "base/callback_forward.h"
+#include "base/macros.h"
+#include "components/payments/content/payment_manifest_parser.mojom.h"
+
+namespace content {
+template <class MojoInterface>
+class UtilityProcessMojoClient;
+}
+
+namespace payments {
+
+// Host of the utility process that parses manifest contents.
+class PaymentManifestParserHost {
+ public:
+  // Called on successful parsing. The result is a move-only vector, which is
+  // empty on parse failure.
+  using Callback =
+      base::OnceCallback<void(std::vector<mojom::PaymentManifestSectionPtr>)>;
+
+  PaymentManifestParserHost();
+
+  // Stops the utility process.
+  ~PaymentManifestParserHost();
+
+  // Starts the utility process. This can take up to 2 seconds and should be
+  // done as soon as it is known that the parser will be needed.
+  void StartUtilityProcess();
+
+  void ParsePaymentManifest(const std::string& content, Callback callback);
+
+ private:
+  // The |callback_identifier| parameter is a pointer to one of the items in the
+  // |pending_callbacks_| list.
+  void OnParse(const Callback* callback_identifier,
+               std::vector<mojom::PaymentManifestSectionPtr> manifest);
+
+  void OnUtilityProcessStopped();
+
+  std::unique_ptr<
+      content::UtilityProcessMojoClient<mojom::PaymentManifestParser>>
+      mojo_client_;
+
+  std::vector<Callback> pending_callbacks_;
+
+  DISALLOW_COPY_AND_ASSIGN(PaymentManifestParserHost);
+};
+
+}  // namespace payments
+
+#endif  // COMPONENTS_PAYMENTS_CONTENT_PAYMENT_MANIFEST_PARSER_HOST_H_
diff --git a/components/payments/content/android/utility/BUILD.gn b/components/payments/content/utility/BUILD.gn
similarity index 91%
rename from components/payments/content/android/utility/BUILD.gn
rename to components/payments/content/utility/BUILD.gn
index 7b0aead..0db5d20 100644
--- a/components/payments/content/android/utility/BUILD.gn
+++ b/components/payments/content/utility/BUILD.gn
@@ -11,7 +11,7 @@
   ]
   deps = [
     "//base",
-    "//components/payments/content/android:mojom",
+    "//components/payments/content:mojom_parser",
   ]
 }
 
diff --git a/components/payments/content/android/utility/DEPS b/components/payments/content/utility/DEPS
similarity index 100%
rename from components/payments/content/android/utility/DEPS
rename to components/payments/content/utility/DEPS
diff --git a/components/payments/content/android/utility/fingerprint_parser.cc b/components/payments/content/utility/fingerprint_parser.cc
similarity index 94%
rename from components/payments/content/android/utility/fingerprint_parser.cc
rename to components/payments/content/utility/fingerprint_parser.cc
index 1dff204e..594d589 100644
--- a/components/payments/content/android/utility/fingerprint_parser.cc
+++ b/components/payments/content/utility/fingerprint_parser.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/payments/content/android/utility/fingerprint_parser.h"
+#include "components/payments/content/utility/fingerprint_parser.h"
 
 #include "base/logging.h"
 #include "base/numerics/safe_conversions.h"
diff --git a/components/payments/content/android/utility/fingerprint_parser.h b/components/payments/content/utility/fingerprint_parser.h
similarity index 69%
rename from components/payments/content/android/utility/fingerprint_parser.h
rename to components/payments/content/utility/fingerprint_parser.h
index a6f9ac7..c4115ff 100644
--- a/components/payments/content/android/utility/fingerprint_parser.h
+++ b/components/payments/content/utility/fingerprint_parser.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_PAYMENTS_CONTENT_ANDROID_UTILITY_FINGERPRINT_PARSER_H_
-#define COMPONENTS_PAYMENTS_CONTENT_ANDROID_UTILITY_FINGERPRINT_PARSER_H_
+#ifndef COMPONENTS_PAYMENTS_CONTENT_UTILITY_FINGERPRINT_PARSER_H_
+#define COMPONENTS_PAYMENTS_CONTENT_UTILITY_FINGERPRINT_PARSER_H_
 
 #include <stddef.h>
 
@@ -18,4 +18,4 @@
 
 }  // namespace payments
 
-#endif  // COMPONENTS_PAYMENTS_CONTENT_ANDROID_UTILITY_FINGERPRINT_PARSER_H_
+#endif  // COMPONENTS_PAYMENTS_CONTENT_UTILITY_FINGERPRINT_PARSER_H_
diff --git a/components/payments/content/android/utility/fingerprint_parser_unittest.cc b/components/payments/content/utility/fingerprint_parser_unittest.cc
similarity index 97%
rename from components/payments/content/android/utility/fingerprint_parser_unittest.cc
rename to components/payments/content/utility/fingerprint_parser_unittest.cc
index 11d3e2a..2c79635 100644
--- a/components/payments/content/android/utility/fingerprint_parser_unittest.cc
+++ b/components/payments/content/utility/fingerprint_parser_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/payments/content/android/utility/fingerprint_parser.h"
+#include "components/payments/content/utility/fingerprint_parser.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/components/payments/content/android/utility/payment_manifest_parser.cc b/components/payments/content/utility/payment_manifest_parser.cc
similarity index 95%
rename from components/payments/content/android/utility/payment_manifest_parser.cc
rename to components/payments/content/utility/payment_manifest_parser.cc
index 8b2158b..c3094e5 100644
--- a/components/payments/content/android/utility/payment_manifest_parser.cc
+++ b/components/payments/content/utility/payment_manifest_parser.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/payments/content/android/utility/payment_manifest_parser.h"
+#include "components/payments/content/utility/payment_manifest_parser.h"
 
 #include <stddef.h>
 
@@ -13,7 +13,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
 #include "base/values.h"
-#include "components/payments/content/android/utility/fingerprint_parser.h"
+#include "components/payments/content/utility/fingerprint_parser.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 
 namespace payments {
diff --git a/components/payments/content/android/utility/payment_manifest_parser.h b/components/payments/content/utility/payment_manifest_parser.h
similarity index 79%
rename from components/payments/content/android/utility/payment_manifest_parser.h
rename to components/payments/content/utility/payment_manifest_parser.h
index 6b06798..494f305 100644
--- a/components/payments/content/android/utility/payment_manifest_parser.h
+++ b/components/payments/content/utility/payment_manifest_parser.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_PAYMENTS_CONTENT_ANDROID_UTILITY_PAYMENT_MANIFEST_PARSER_H_
-#define COMPONENTS_PAYMENTS_CONTENT_ANDROID_UTILITY_PAYMENT_MANIFEST_PARSER_H_
+#ifndef COMPONENTS_PAYMENTS_CONTENT_UTILITY_PAYMENT_MANIFEST_PARSER_H_
+#define COMPONENTS_PAYMENTS_CONTENT_UTILITY_PAYMENT_MANIFEST_PARSER_H_
 
 #include <string>
 #include <vector>
 
 #include "base/macros.h"
-#include "components/payments/content/android/payment_manifest_parser.mojom.h"
+#include "components/payments/content/payment_manifest_parser.mojom.h"
 
 namespace payments {
 
@@ -48,4 +48,4 @@
 
 }  // namespace payments
 
-#endif  // COMPONENTS_PAYMENTS_CONTENT_ANDROID_UTILITY_PAYMENT_MANIFEST_PARSER_H_
+#endif  // COMPONENTS_PAYMENTS_CONTENT_UTILITY_PAYMENT_MANIFEST_PARSER_H_
diff --git a/components/payments/content/android/utility/payment_manifest_parser_unittest.cc b/components/payments/content/utility/payment_manifest_parser_unittest.cc
similarity index 96%
rename from components/payments/content/android/utility/payment_manifest_parser_unittest.cc
rename to components/payments/content/utility/payment_manifest_parser_unittest.cc
index 7523edc1..cd52aa1 100644
--- a/components/payments/content/android/utility/payment_manifest_parser_unittest.cc
+++ b/components/payments/content/utility/payment_manifest_parser_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/payments/content/android/utility/payment_manifest_parser.h"
+#include "components/payments/content/utility/payment_manifest_parser.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -19,7 +19,7 @@
     const std::string& input,
     const std::string& expected_package_name,
     int expected_version,
-    const std::vector<std::vector<uint8_t>>& expected_fingerprints = {}) {
+    const std::vector<std::vector<uint8_t>>& expected_fingerprints) {
   std::vector<mojom::PaymentManifestSectionPtr> actual_output =
       PaymentManifestParser::ParseIntoVector(input);
   ASSERT_EQ(1U, actual_output.size());
@@ -67,7 +67,8 @@
 }
 
 TEST(PaymentManifestParserTest, OnlyPackageNameIsWellFormed) {
-  ExpectParsed("{\"android\": [{\"package\": \"*\"}]}", "*", 0);
+  ExpectParsed("{\"android\": [{\"package\": \"*\"}]}", "*", 0,
+               std::vector<std::vector<uint8_t>>());
 }
 
 TEST(PaymentManifestParserTest, WellFormed) {
diff --git a/components/payments_strings.grdp b/components/payments_strings.grdp
index 671e5c9..48c34cf 100644
--- a/components/payments_strings.grdp
+++ b/components/payments_strings.grdp
@@ -249,11 +249,11 @@
     Unable to launch payment app.
   </message>
 
-  <if expr="is_android">
-    <message name="IDS_UTILITY_PROCESS_MANIFEST_PARSER_NAME" desc="The name of the utility process used for parsing manifest files.">
-      Manifest Parser
+  <message name="IDS_UTILITY_PROCESS_PAYMENT_MANIFEST_PARSER_NAME" desc="The name of the utility process used for parsing manifest files.">
+    Payment Manifest Parser
   </message>
-    <message name="IDS_EXTERNAL_PAYMENT_APP_LEAVE_INCOGNITO_WARNING" desc="Alert dialog text warning the user that incognito mode does not conitnue into external payment apps." formatter_data="android_java">
+  <if expr="is_android">
+    <message name="IDS_EXTERNAL_PAYMENT_APP_LEAVE_INCOGNITO_WARNING" desc="Alert dialog text warning the user that incognito mode does not continue into external payment apps." formatter_data="android_java">
       Leaving incognito mode to pay via an external application. Continue?
     </message>
   </if>
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 69007306..34cede5d 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -44,7 +44,7 @@
     "//components/leveldb:lib",
     "//components/link_header_util",
     "//components/mime_util",
-    "//components/payments/content:payment_app",
+    "//components/payments/content:mojom_payment_app",
     "//components/rappor",
     "//components/tracing",
     "//components/tracing:startup_tracing",
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 8ac545e9..bae71582 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -619,7 +619,7 @@
 
   public_deps = [
     "//components/leveldb/public/interfaces",
-    "//components/payments/content:payment_app",
+    "//components/payments/content:mojom_payment_app",
     "//content/public/common:interfaces",
 
     # TODO(mcasas): remove the following dep after https://crbug.com/653994
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index ffacc9d..36694f7 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -429,7 +429,7 @@
     "//cc/surfaces:surface_id",
     "//cc/surfaces:surfaces",
     "//components/discardable_memory/client",
-    "//components/payments/content:payment_app",
+    "//components/payments/content:mojom_payment_app",
     "//components/url_formatter",
     "//components/variations",
     "//content:resources",
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index ce996c67..f032a029 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -248,7 +248,7 @@
     "//cc/surfaces",
     "//components/display_compositor",
     "//components/leveldb/public/interfaces",
-    "//components/payments/content:payment_app",
+    "//components/payments/content:mojom_payment_app",
     "//content/app:both_for_content_tests",
     "//content/browser:for_content_tests",
     "//content/browser/speech/proto",
@@ -731,7 +731,7 @@
     "//components/discardable_memory/client",
     "//components/discardable_memory/common",
     "//components/discardable_memory/service",
-    "//components/payments/content:payment_app",
+    "//components/payments/content:mojom_payment_app",
     "//content:resources",
     "//content/app:both_for_content_tests",
     "//content/browser:for_content_tests",
@@ -1465,8 +1465,8 @@
     "//cc/surfaces",
     "//components/display_compositor",
     "//components/leveldb/public/cpp",
-    "//components/payments/content:payment_app",
-    "//components/payments/content:payment_request",
+    "//components/payments/content:mojom",
+    "//components/payments/content:mojom_payment_app",
     "//components/rappor:test_support",
     "//content:resources",
     "//content/app:both_for_content_tests",
diff --git a/third_party/WebKit/Source/modules/BUILD.gn b/third_party/WebKit/Source/modules/BUILD.gn
index 57758b0..8431a89 100644
--- a/third_party/WebKit/Source/modules/BUILD.gn
+++ b/third_party/WebKit/Source/modules/BUILD.gn
@@ -319,7 +319,7 @@
   deps = [
     ":modules",
     ":modules_testing",
-    "//components/payments/content:payment_request_blink",
+    "//components/payments/content:mojom_blink",
     "//skia",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/third_party/WebKit/Source/modules/payments/BUILD.gn b/third_party/WebKit/Source/modules/payments/BUILD.gn
index 394e709..0fea10d 100644
--- a/third_party/WebKit/Source/modules/payments/BUILD.gn
+++ b/third_party/WebKit/Source/modules/payments/BUILD.gn
@@ -33,7 +33,7 @@
     "PaymentsValidators.h",
   ]
   deps = [
-    "//components/payments/content:payment_app_blink",
-    "//components/payments/content:payment_request_blink",
+    "//components/payments/content:mojom_blink",
+    "//components/payments/content:mojom_payment_app_blink",
   ]
 }
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn
index 7627a7f..c6d22fe 100644
--- a/third_party/WebKit/public/BUILD.gn
+++ b/third_party/WebKit/public/BUILD.gn
@@ -750,7 +750,7 @@
     "platform/modules/webshare/webshare.mojom",
   ]
   public_deps = [
-    "//components/payments/content:payment_request",
+    "//components/payments/content:mojom",
     "//url/mojo:url_mojom_gurl",
   ]