diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/payments/goods')
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; +}; |