| Index: third_party/WebKit/Source/modules/payments/PaymentInstruments.cpp
|
| diff --git a/third_party/WebKit/Source/modules/payments/PaymentInstruments.cpp b/third_party/WebKit/Source/modules/payments/PaymentInstruments.cpp
|
| index f89da6af29755ffda611632c28cc39d7abeda4b9..0b686f23f9f40d6a9c6f384fb2f3be90c265c816 100644
|
| --- a/third_party/WebKit/Source/modules/payments/PaymentInstruments.cpp
|
| +++ b/third_party/WebKit/Source/modules/payments/PaymentInstruments.cpp
|
| @@ -4,12 +4,53 @@
|
|
|
| #include "modules/payments/PaymentInstruments.h"
|
|
|
| +#include <utility>
|
| +
|
| +#include "bindings/core/v8/ExceptionState.h"
|
| #include "bindings/core/v8/ScriptPromise.h"
|
| +#include "bindings/core/v8/ScriptPromiseResolver.h"
|
| +#include "bindings/core/v8/V8Binding.h"
|
| +#include "core/dom/DOMException.h"
|
| #include "modules/payments/PaymentInstrument.h"
|
| +#include "modules/payments/PaymentManager.h"
|
| +#include "platform/wtf/Vector.h"
|
|
|
| namespace blink {
|
| +namespace {
|
| +
|
| +static const char kPaymentManagerUnavailable[] = "Payment manager unavailable";
|
| +
|
| +bool rejectError(ScriptPromiseResolver* resolver,
|
| + payments::mojom::blink::PaymentHandlerStatus status) {
|
| + switch (status) {
|
| + case payments::mojom::blink::PaymentHandlerStatus::SUCCESS:
|
| + return false;
|
| + case payments::mojom::blink::PaymentHandlerStatus::NOT_IMPLEMENTED:
|
| + resolver->Reject(
|
| + DOMException::Create(kNotSupportedError, "Not implemented yet"));
|
| + return true;
|
| + case payments::mojom::blink::PaymentHandlerStatus::NOT_FOUND:
|
| + resolver->Reject(DOMException::Create(kNotFoundError,
|
| + "There is no stored instrument"));
|
| + return true;
|
| + case payments::mojom::blink::PaymentHandlerStatus::NO_ACTIVE_WORKER:
|
| + resolver->Reject(
|
| + DOMException::Create(kInvalidStateError, "No active service worker"));
|
| + return true;
|
| + case payments::mojom::blink::PaymentHandlerStatus::STORAGE_OPERATION_FAILED:
|
| + resolver->Reject(DOMException::Create(kInvalidStateError,
|
| + "Storage operation is failed"));
|
| + return true;
|
| + }
|
| + NOTREACHED();
|
| + return false;
|
| +}
|
| +
|
| +} // namespace
|
|
|
| -PaymentInstruments::PaymentInstruments() {}
|
| +PaymentInstruments::PaymentInstruments(
|
| + const payments::mojom::blink::PaymentManagerPtr& manager)
|
| + : manager_(manager) {}
|
|
|
| ScriptPromise PaymentInstruments::deleteInstrument(
|
| const String& instrument_key) {
|
| @@ -17,9 +58,22 @@ ScriptPromise PaymentInstruments::deleteInstrument(
|
| return ScriptPromise();
|
| }
|
|
|
| -ScriptPromise PaymentInstruments::get(const String& instrument_key) {
|
| - NOTIMPLEMENTED();
|
| - return ScriptPromise();
|
| +ScriptPromise PaymentInstruments::get(ScriptState* script_state,
|
| + const String& instrument_key) {
|
| + if (!manager_.is_bound()) {
|
| + return ScriptPromise::RejectWithDOMException(
|
| + script_state,
|
| + DOMException::Create(kInvalidStateError, kPaymentManagerUnavailable));
|
| + }
|
| +
|
| + ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
|
| + ScriptPromise promise = resolver->Promise();
|
| +
|
| + manager_->GetPaymentInstrument(
|
| + instrument_key, ConvertToBaseCallback(WTF::Bind(
|
| + &PaymentInstruments::onGetPaymentInstrument,
|
| + WrapPersistent(this), WrapPersistent(resolver))));
|
| + return promise;
|
| }
|
|
|
| ScriptPromise PaymentInstruments::keys() {
|
| @@ -32,12 +86,90 @@ ScriptPromise PaymentInstruments::has(const String& instrument_key) {
|
| return ScriptPromise();
|
| }
|
|
|
| -ScriptPromise PaymentInstruments::set(const String& instrument_key,
|
| - const PaymentInstrument& details) {
|
| - NOTIMPLEMENTED();
|
| - return ScriptPromise();
|
| +ScriptPromise PaymentInstruments::set(ScriptState* script_state,
|
| + const String& instrument_key,
|
| + const PaymentInstrument& details,
|
| + ExceptionState& exception_state) {
|
| + if (!manager_.is_bound()) {
|
| + return ScriptPromise::RejectWithDOMException(
|
| + script_state,
|
| + DOMException::Create(kInvalidStateError, kPaymentManagerUnavailable));
|
| + }
|
| +
|
| + ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
|
| + ScriptPromise promise = resolver->Promise();
|
| +
|
| + payments::mojom::blink::PaymentInstrumentPtr instrument =
|
| + payments::mojom::blink::PaymentInstrument::New();
|
| + instrument->name = details.hasName() ? details.name() : WTF::g_empty_string;
|
| + if (details.hasEnabledMethods()) {
|
| + instrument->enabled_methods = details.enabledMethods();
|
| + }
|
| +
|
| + if (details.hasCapabilities()) {
|
| + v8::Local<v8::String> value;
|
| + if (!v8::JSON::Stringify(script_state->GetContext(),
|
| + details.capabilities().V8Value().As<v8::Object>())
|
| + .ToLocal(&value)) {
|
| + exception_state.ThrowTypeError(
|
| + "Capabilities should be a JSON-serializable object");
|
| + return exception_state.Reject(script_state);
|
| + }
|
| + instrument->stringified_capabilities = ToCoreString(value);
|
| + } else {
|
| + instrument->stringified_capabilities = WTF::g_empty_string;
|
| + }
|
| +
|
| + manager_->SetPaymentInstrument(
|
| + instrument_key, std::move(instrument),
|
| + ConvertToBaseCallback(
|
| + WTF::Bind(&PaymentInstruments::onSetPaymentInstrument,
|
| + WrapPersistent(this), WrapPersistent(resolver))));
|
| + return promise;
|
| }
|
|
|
| DEFINE_TRACE(PaymentInstruments) {}
|
|
|
| +void PaymentInstruments::onGetPaymentInstrument(
|
| + ScriptPromiseResolver* resolver,
|
| + payments::mojom::blink::PaymentInstrumentPtr stored_instrument,
|
| + payments::mojom::blink::PaymentHandlerStatus status) {
|
| + DCHECK(resolver);
|
| + if (rejectError(resolver, status))
|
| + return;
|
| + PaymentInstrument instrument;
|
| + instrument.setName(stored_instrument->name);
|
| + Vector<String> enabled_methods;
|
| + for (const auto& method : stored_instrument->enabled_methods) {
|
| + enabled_methods.push_back(method);
|
| + }
|
| +
|
| + instrument.setEnabledMethods(enabled_methods);
|
| + if (!stored_instrument->stringified_capabilities.IsEmpty()) {
|
| + ScriptState::Scope scope(resolver->GetScriptState());
|
| + ExceptionState exception_state(resolver->GetScriptState()->GetIsolate(),
|
| + ExceptionState::kGetterContext,
|
| + "PaymentInstruments", "get");
|
| + instrument.setCapabilities(
|
| + ScriptValue(resolver->GetScriptState(),
|
| + FromJSONString(resolver->GetScriptState()->GetIsolate(),
|
| + stored_instrument->stringified_capabilities,
|
| + exception_state)));
|
| + if (exception_state.HadException()) {
|
| + exception_state.Reject(resolver);
|
| + return;
|
| + }
|
| + }
|
| + resolver->Resolve(instrument);
|
| +}
|
| +
|
| +void PaymentInstruments::onSetPaymentInstrument(
|
| + ScriptPromiseResolver* resolver,
|
| + payments::mojom::blink::PaymentHandlerStatus status) {
|
| + DCHECK(resolver);
|
| + if (rejectError(resolver, status))
|
| + return;
|
| + resolver->Resolve();
|
| +}
|
| +
|
| } // namespace blink
|
|
|