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",
]