Chromium Code Reviews| 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..23124be81e92eea7b2824633982653218530c1b8 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/V8StringResource.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, |
| + "There is no stored instrument")); |
| + return true; |
| + case payments::mojom::blink::PaymentHandlerStatus::STORAGE_OPERATION_FAILED: |
| + resolver->Reject(DOMException::Create(kInvalidStateError, |
| + "There is no stored instrument")); |
| + 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,92 @@ 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 = |
| + WTF::Vector<WTF::String>(details.enabledMethods()); |
|
haraken
2017/04/13 01:32:31
Why do we need the static cast?
zino
2017/04/15 03:30:10
Done.
|
| + } |
| + |
| + 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 = |
| + V8StringToWebCoreString<String>(value, kDoNotExternalize); |
|
haraken
2017/04/13 01:32:31
ToCoreString
zino
2017/04/15 03:30:10
Done.
|
| + } 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<WTF::String> enabled_methods; |
|
haraken
2017/04/13 01:32:31
Drop WTF::.
zino
2017/04/15 03:30:10
Done.
|
| + 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()) { |
| + resolver->Reject(exception_state.GetException()); |
|
haraken
2017/04/13 01:32:31
I guess you need to call exception_state.Clear().
zino
2017/04/15 03:30:10
Done.
I used exception_state.Reject instead.
The
|
| + 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 |