summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/modules/payments/goods
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/payments/goods')
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/BUILD.gn16
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/OWNERS7
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.cc45
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.h35
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.idl20
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters.cc57
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters.h35
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters_unittest.cc58
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.cc71
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h43
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.idl13
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/idls.gni9
-rw-r--r--chromium/third_party/blink/renderer/modules/payments/goods/item_details.idl13
13 files changed, 422 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/BUILD.gn b/chromium/third_party/blink/renderer/modules/payments/goods/BUILD.gn
new file mode 100644
index 00000000000..e7c9f39fab4
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/BUILD.gn
@@ -0,0 +1,16 @@
+# Copyright 2020 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.
+
+import("//third_party/blink/renderer/modules/modules.gni")
+
+blink_modules_sources("goods") {
+ sources = [
+ "digital_goods_service.cc",
+ "digital_goods_service.h",
+ "digital_goods_type_converters.cc",
+ "digital_goods_type_converters.h",
+ "dom_window_digital_goods.cc",
+ "dom_window_digital_goods.h",
+ ]
+}
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/OWNERS b/chromium/third_party/blink/renderer/modules/payments/goods/OWNERS
new file mode 100644
index 00000000000..b4b867f7536
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/OWNERS
@@ -0,0 +1,7 @@
+glenrob@chromium.org
+mgiuca@chromium.org
+
+per-file *_type_converter*.*=set noparent
+per-file *_type_converter*.*=file://ipc/SECURITY_OWNERS
+
+# COMPONENT: UI>Browser>WebAppInstalls>ChromeOS
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.cc b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.cc
new file mode 100644
index 00000000000..03dbd69a650
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.cc
@@ -0,0 +1,45 @@
+// Copyright 2020 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 "third_party/blink/renderer/modules/payments/goods/digital_goods_service.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
+
+namespace blink {
+
+DigitalGoodsService::DigitalGoodsService(ExecutionContext* context) {}
+
+DigitalGoodsService::~DigitalGoodsService() = default;
+
+ScriptPromise DigitalGoodsService::getDetails(ScriptState* script_state,
+ const Vector<String>& item_ids) {
+ auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+ ScriptPromise promise = resolver->Promise();
+
+ // TODO(crbug.com/1061503): This should call out to a mojo service. However,
+ // we can't land the mojo service until a browser side implementation is
+ // available (for security review). Until then, use this stub which never
+ // resolves.
+
+ return promise;
+}
+
+ScriptPromise DigitalGoodsService::acknowledge(ScriptState* script_state,
+ const String& purchase_token,
+ const String& purchase_type) {
+ auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+ ScriptPromise promise = resolver->Promise();
+
+ // TODO(crbug.com/1061503): This should call out to a mojo service. However,
+ // we can't land the mojo service until a browser side implementation is
+ // available (for security review). Until then, use this stub which never
+ // resolves.
+
+ return promise;
+}
+
+void DigitalGoodsService::Trace(Visitor* visitor) const {
+ ScriptWrappable::Trace(visitor);
+}
+
+} // namespace blink
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.h b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.h
new file mode 100644
index 00000000000..0e80c43a585
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.h
@@ -0,0 +1,35 @@
+// Copyright 2020 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 THIRD_PARTY_BLINK_RENDERER_MODULES_PAYMENTS_GOODS_DIGITAL_GOODS_SERVICE_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_PAYMENTS_GOODS_DIGITAL_GOODS_SERVICE_H_
+
+#include "mojo/public/cpp/bindings/remote.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+
+namespace blink {
+
+class ExecutionContext;
+class ScriptState;
+class Visitor;
+
+class DigitalGoodsService final : public ScriptWrappable {
+ DEFINE_WRAPPERTYPEINFO();
+
+ public:
+ explicit DigitalGoodsService(ExecutionContext* context);
+ ~DigitalGoodsService() override;
+
+ // IDL Interface:
+ ScriptPromise getDetails(ScriptState*, const Vector<String>& item_ids);
+ ScriptPromise acknowledge(ScriptState*,
+ const String& purchase_token,
+ const String& purchase_type);
+
+ void Trace(Visitor* visitor) const override;
+};
+
+} // namespace blink
+
+#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PAYMENTS_GOODS_DIGITAL_GOODS_SERVICE_H_
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.idl b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.idl
new file mode 100644
index 00000000000..48991860b58
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_service.idl
@@ -0,0 +1,20 @@
+// Copyright 2020 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.
+
+// https://github.com/WICG/digital-goods/blob/master/explainer.md
+[
+ SecureContext,
+ RuntimeEnabled=DigitalGoods
+] interface DigitalGoodsService {
+ [CallWith=ScriptState]
+ Promise<sequence<ItemDetails>> getDetails(sequence<DOMString> itemIds);
+
+ [CallWith=ScriptState]
+ Promise<void> acknowledge(DOMString purchaseToken, PurchaseType purchaseType);
+};
+
+enum PurchaseType {
+ "repeatable",
+ "onetime",
+};
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters.cc b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters.cc
new file mode 100644
index 00000000000..e9325de915f
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters.cc
@@ -0,0 +1,57 @@
+// Copyright 2020 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 "third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters.h"
+
+#include "third_party/blink/public/mojom/digital_goods/digital_goods.mojom-blink.h"
+#include "third_party/blink/renderer/modules/payments/payment_event_data_conversion.h"
+
+namespace mojo {
+
+blink::ItemDetails*
+TypeConverter<blink::ItemDetails*, payments::mojom::blink::ItemDetailsPtr>::
+ Convert(const payments::mojom::blink::ItemDetailsPtr& input) {
+ if (!input)
+ return nullptr;
+ blink::ItemDetails* output = blink::ItemDetails::Create();
+ output->setItemId(input->item_id);
+ output->setTitle(input->title);
+ output->setDescription(input->description);
+ output->setPrice(
+ blink::PaymentEventDataConversion::ToPaymentCurrencyAmount(input->price));
+ return output;
+}
+
+WTF::String
+TypeConverter<WTF::String, payments::mojom::blink::BillingResponseCode>::
+ Convert(const payments::mojom::blink::BillingResponseCode& input) {
+ switch (input) {
+ case payments::mojom::blink::BillingResponseCode::kOk:
+ return "ok";
+ case payments::mojom::blink::BillingResponseCode::kError:
+ return "error";
+ case payments::mojom::blink::BillingResponseCode::kBillingUnavailable:
+ return "billingUnavailable";
+ case payments::mojom::blink::BillingResponseCode::kDeveloperError:
+ return "developerError";
+ case payments::mojom::blink::BillingResponseCode::kFeatureNotSupported:
+ return "featureNotSupported";
+ case payments::mojom::blink::BillingResponseCode::kItemAlreadyOwned:
+ return "itemAlreadyOwned";
+ case payments::mojom::blink::BillingResponseCode::kItemNotOwned:
+ return "itemNotOwned";
+ case payments::mojom::blink::BillingResponseCode::kItemUnavailable:
+ return "itemUnavailable";
+ case payments::mojom::blink::BillingResponseCode::kServiceDisconnected:
+ return "serviceDisconnected";
+ case payments::mojom::blink::BillingResponseCode::kServiceUnavailable:
+ return "serviceUnavailable";
+ case payments::mojom::blink::BillingResponseCode::kUserCancelled:
+ return "userCancelled";
+ }
+
+ NOTREACHED();
+}
+
+} // namespace mojo
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters.h b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters.h
new file mode 100644
index 00000000000..cf0cdc18e34
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters.h
@@ -0,0 +1,35 @@
+// Copyright 2020 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 THIRD_PARTY_BLINK_RENDERER_MODULES_PAYMENTS_GOODS_DIGITAL_GOODS_TYPE_CONVERTERS_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_PAYMENTS_GOODS_DIGITAL_GOODS_TYPE_CONVERTERS_H_
+
+#include <string>
+
+#include "mojo/public/cpp/bindings/type_converter.h"
+#include "third_party/blink/public/mojom/digital_goods/digital_goods.mojom-blink-forward.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_item_details.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
+
+namespace mojo {
+
+// Converts a mojo ItemDetails into a WebIDL ItemDetails.
+// Returns a null IDL struct when a null mojo struct is given as input.
+template <>
+struct MODULES_EXPORT
+ TypeConverter<blink::ItemDetails*, payments::mojom::blink::ItemDetailsPtr> {
+ static blink::ItemDetails* Convert(
+ const payments::mojom::blink::ItemDetailsPtr& input);
+};
+
+template <>
+struct MODULES_EXPORT
+ TypeConverter<WTF::String, payments::mojom::blink::BillingResponseCode> {
+ static WTF::String Convert(
+ const payments::mojom::blink::BillingResponseCode& input);
+};
+
+} // namespace mojo
+
+#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PAYMENTS_GOODS_DIGITAL_GOODS_TYPE_CONVERTERS_H_
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters_unittest.cc b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters_unittest.cc
new file mode 100644
index 00000000000..fca041df108
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters_unittest.cc
@@ -0,0 +1,58 @@
+// Copyright 2020 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 <string>
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/mojom/digital_goods/digital_goods.mojom-blink.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_item_details.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_payment_currency_amount.h"
+#include "third_party/blink/renderer/modules/payments/goods/digital_goods_type_converters.h"
+
+namespace blink {
+
+using payments::mojom::blink::BillingResponseCode;
+
+TEST(DigitalGoodsTypeConvertersTest, MojoBillingResponseOkToIdl) {
+ auto response_code = BillingResponseCode::kOk;
+ EXPECT_EQ(mojo::ConvertTo<String>(response_code), "ok");
+}
+
+TEST(DigitalGoodsTypeConvertersTest, MojoBillingResponseErrorToIdl) {
+ auto response_code = BillingResponseCode::kError;
+ EXPECT_EQ(mojo::ConvertTo<String>(response_code), "error");
+}
+
+TEST(DigitalGoodsTypeConvertersTest, MojoItemDetailsToIdl) {
+ auto mojo_item_details = payments::mojom::blink::ItemDetails::New();
+ const String item_id = "shiny-sword-id";
+ const String title = "Shiny Sword";
+ const String description = "A sword that is shiny";
+ const String currency = "AUD";
+ const String value = "100.00";
+
+ mojo_item_details->item_id = item_id;
+ mojo_item_details->title = title;
+ mojo_item_details->description = description;
+ auto price = payments::mojom::blink::PaymentCurrencyAmount::New();
+ price->currency = currency;
+ price->value = value;
+ mojo_item_details->price = std::move(price);
+
+ auto* idl_item_details = mojo_item_details.To<ItemDetails*>();
+ EXPECT_EQ(idl_item_details->itemId(), item_id);
+ EXPECT_EQ(idl_item_details->title(), title);
+ EXPECT_EQ(idl_item_details->description(), description);
+ EXPECT_EQ(idl_item_details->price()->currency(), currency);
+ EXPECT_EQ(idl_item_details->price()->value(), value);
+}
+
+TEST(DigitalGoodsTypeConvertersTest, NullMojoItemDetailsToIdl) {
+ payments::mojom::blink::ItemDetailsPtr mojo_item_details;
+
+ auto* idl_item_details = mojo_item_details.To<ItemDetails*>();
+ EXPECT_EQ(idl_item_details, nullptr);
+}
+
+} // namespace blink
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.cc b/chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.cc
new file mode 100644
index 00000000000..aea7dc00bfc
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.cc
@@ -0,0 +1,71 @@
+// Copyright 2020 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 "third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h"
+
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
+#include "third_party/blink/renderer/modules/payments/goods/digital_goods_service.h"
+
+namespace {
+
+// TODO (crbug.com/1061503): Point URL to Play payment request API once known.
+const char known_payment_method_[] = "https://some.url/for/payment/request/api";
+
+} // namespace
+
+namespace blink {
+
+const char DOMWindowDigitalGoods::kSupplementName[] = "DOMWindowDigitalGoods";
+
+ScriptPromise DOMWindowDigitalGoods::getDigitalGoodsService(
+ ScriptState* script_state,
+ LocalDOMWindow& window,
+ const String& payment_method) {
+ return FromState(&window)->GetDigitalGoodsService(script_state,
+ payment_method);
+}
+
+ScriptPromise DOMWindowDigitalGoods::GetDigitalGoodsService(
+ ScriptState* script_state,
+ const String& payment_method) {
+ auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+ auto promise = resolver->Promise();
+
+ // TODO (crbug.com/1061503): Enable JS to connect to various payment method
+ // backends. For now, just connect to one known backend and check the URL is
+ // correct for that payment method.
+ if (payment_method != known_payment_method_) {
+ resolver->Resolve();
+ return promise;
+ }
+
+ if (!digital_goods_service_) {
+ digital_goods_service_ = MakeGarbageCollected<DigitalGoodsService>(
+ ExecutionContext::From(script_state));
+ }
+
+ resolver->Resolve(digital_goods_service_);
+ return promise;
+}
+
+void DOMWindowDigitalGoods::Trace(Visitor* visitor) const {
+ Supplement<LocalDOMWindow>::Trace(visitor);
+ visitor->Trace(digital_goods_service_);
+}
+
+// static
+DOMWindowDigitalGoods* DOMWindowDigitalGoods::FromState(
+ LocalDOMWindow* window) {
+ DOMWindowDigitalGoods* supplement =
+ Supplement<LocalDOMWindow>::From<DOMWindowDigitalGoods>(window);
+ if (!supplement) {
+ supplement = MakeGarbageCollected<DOMWindowDigitalGoods>();
+ ProvideTo(*window, supplement);
+ }
+
+ return supplement;
+}
+
+} // namespace blink
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h b/chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h
new file mode 100644
index 00000000000..e32b8e3e863
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h
@@ -0,0 +1,43 @@
+// Copyright 2020 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 THIRD_PARTY_BLINK_RENDERER_MODULES_PAYMENTS_GOODS_DOM_WINDOW_DIGITAL_GOODS_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_PAYMENTS_GOODS_DOM_WINDOW_DIGITAL_GOODS_H_
+
+#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/platform/supplementable.h"
+
+namespace blink {
+
+class DigitalGoodsService;
+class LocalDOMWindow;
+class ScriptState;
+class Visitor;
+
+class DOMWindowDigitalGoods final
+ : public GarbageCollected<DOMWindowDigitalGoods>,
+ public Supplement<LocalDOMWindow> {
+ USING_GARBAGE_COLLECTED_MIXIN(DOMWindowDigitalGoods);
+
+ public:
+ static const char kSupplementName[];
+
+ // IDL Interface:
+ static ScriptPromise getDigitalGoodsService(ScriptState*,
+ LocalDOMWindow&,
+ const String& payment_method);
+
+ ScriptPromise GetDigitalGoodsService(ScriptState*,
+ const String& payment_method);
+ void Trace(Visitor* visitor) const override;
+
+ private:
+ Member<DigitalGoodsService> digital_goods_service_;
+
+ static DOMWindowDigitalGoods* FromState(LocalDOMWindow*);
+};
+
+} // namespace blink
+
+#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PAYMENTS_GOODS_DOM_WINDOW_DIGITAL_GOODS_H_
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.idl b/chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.idl
new file mode 100644
index 00000000000..edc8fac867a
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.idl
@@ -0,0 +1,13 @@
+// Copyright 2020 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.
+
+// https://github.com/WICG/digital-goods/blob/master/explainer.md
+[
+ SecureContext,
+ ImplementedAs=DOMWindowDigitalGoods,
+ RuntimeEnabled=DigitalGoods
+] partial interface Window {
+ [CallWith=ScriptState]
+ Promise<DigitalGoodsService?> getDigitalGoodsService(DOMString paymentMethod);
+};
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/idls.gni b/chromium/third_party/blink/renderer/modules/payments/goods/idls.gni
new file mode 100644
index 00000000000..f35497f186d
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/idls.gni
@@ -0,0 +1,9 @@
+# Copyright 2020 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.
+
+modules_idl_files = [ "digital_goods_service.idl" ]
+
+modules_dictionary_idl_files = [ "item_details.idl" ]
+
+modules_dependency_idl_files = [ "dom_window_digital_goods.idl" ]
diff --git a/chromium/third_party/blink/renderer/modules/payments/goods/item_details.idl b/chromium/third_party/blink/renderer/modules/payments/goods/item_details.idl
new file mode 100644
index 00000000000..4393374ebaa
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/payments/goods/item_details.idl
@@ -0,0 +1,13 @@
+// Copyright 2020 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.
+
+// TODO(crbug.com/1061503): Add more fields from
+// https://github.com/WICG/digital-goods/blob/master/explainer.md
+// as the discussions settle.
+dictionary ItemDetails {
+ DOMString itemId;
+ DOMString title;
+ DOMString description;
+ PaymentCurrencyAmount price;
+};