Chromium Code Reviews| Index: third_party/WebKit/Source/modules/payments/PaymentRequest.cpp |
| diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp |
| index 6ce9aeb6f6529eb8772fc9e81a7a54c6b1885fca..cc687780a5727d05f16c3b05bdf8cfcf1e98fe58 100644 |
| --- a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp |
| +++ b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp |
| @@ -8,6 +8,7 @@ |
| #include "bindings/core/v8/ScriptPromiseResolver.h" |
| #include "bindings/core/v8/ScriptState.h" |
| #include "bindings/core/v8/V8StringResource.h" |
| +#include "bindings/modules/v8/V8AndroidPayMethodData.h" |
| #include "bindings/modules/v8/V8PaymentDetails.h" |
| #include "core/EventTypeNames.h" |
| #include "core/dom/DOMException.h" |
| @@ -17,6 +18,8 @@ |
| #include "core/frame/FrameOwner.h" |
| #include "core/html/HTMLIFrameElement.h" |
| #include "modules/EventTargetModulesNames.h" |
| +#include "modules/payments/AndroidPayMethodData.h" |
| +#include "modules/payments/AndroidPayTokenization.h" |
| #include "modules/payments/HTMLIFrameElementPayments.h" |
| #include "modules/payments/PaymentAddress.h" |
| #include "modules/payments/PaymentItem.h" |
| @@ -166,22 +169,6 @@ struct TypeConverter<PaymentOptionsPtr, blink::PaymentOptions> { |
| } |
| }; |
| -template <> |
| -struct TypeConverter<WTFArray<PaymentMethodDataPtr>, |
| - WTF::Vector<blink::PaymentRequest::MethodData>> { |
| - static WTFArray<PaymentMethodDataPtr> Convert( |
| - const WTF::Vector<blink::PaymentRequest::MethodData>& input) { |
| - WTFArray<PaymentMethodDataPtr> output(input.size()); |
| - for (size_t i = 0; i < input.size(); ++i) { |
| - output[i] = PaymentMethodData::New(); |
| - output[i]->supported_methods = |
| - WTF::Vector<WTF::String>(input[i].supportedMethods); |
| - output[i]->stringified_data = input[i].stringifiedData; |
| - } |
| - return output; |
| - } |
| -}; |
| - |
| } // namespace mojo |
| namespace blink { |
| @@ -349,17 +336,105 @@ bool validatePaymentDetails(const PaymentDetails& details, |
| return keepShippingOptions; |
| } |
| +void maybeSetAndroidPayMethodata( |
| + const ScriptValue& input, |
| + payments::mojom::blink::PaymentMethodDataPtr& output) { |
| + AndroidPayMethodData androidPay; |
| + TrackExceptionState exceptionState; |
| + V8AndroidPayMethodData::toImpl(input.isolate(), input.v8Value(), androidPay, |
| + exceptionState); |
| + if (exceptionState.hadException()) |
| + return; |
| + |
| + if (androidPay.hasEnvironment() && androidPay.environment() == "TEST") |
| + output->environment = payments::mojom::blink::AndroidPayEnvironment::TEST; |
| + |
| + output->merchant_name = androidPay.merchantName(); |
| + output->merchant_id = androidPay.merchantId(); |
| + |
| + if (androidPay.hasAllowedCardNetworks()) { |
| + output->allowed_card_networks.resize( |
| + androidPay.allowedCardNetworks().size()); |
| + for (size_t i = 0; i < androidPay.allowedCardNetworks().size(); ++i) { |
| + const String& network = androidPay.allowedCardNetworks()[i]; |
| + if (network == "AMEX") { |
| + output->allowed_card_networks[i] = |
| + payments::mojom::blink::AndroidPayCardNetwork::AMEX; |
| + } else if (network == "DISCOVER") { |
| + output->allowed_card_networks[i] = |
| + payments::mojom::blink::AndroidPayCardNetwork::DISCOVER; |
| + } else if (network == "MASTERCARD") { |
| + output->allowed_card_networks[i] = |
| + payments::mojom::blink::AndroidPayCardNetwork::MASTERCARD; |
| + } else if (network == "VISA") { |
| + output->allowed_card_networks[i] = |
| + payments::mojom::blink::AndroidPayCardNetwork::VISA; |
| + } else { |
| + output->allowed_card_networks[i] = |
| + payments::mojom::blink::AndroidPayCardNetwork::UNKNOWN; |
| + } |
| + } |
| + } |
| + |
| + if (androidPay.hasPaymentMethodTokenizationParameters()) { |
| + const AndroidPayTokenization& tokenization = |
| + androidPay.paymentMethodTokenizationParameters(); |
| + if (tokenization.hasTokenizationType()) { |
| + if (tokenization.tokenizationType() == "GATEWAY_TOKEN") { |
| + output->tokenization_type = |
| + payments::mojom::blink::AndroidPayTokenization::GATEWAY_TOKEN; |
| + } else if (tokenization.tokenizationType() == "NETWORK_TOKEN") { |
| + output->tokenization_type = |
| + payments::mojom::blink::AndroidPayTokenization::NETWORK_TOKEN; |
| + } else { |
| + output->tokenization_type = |
| + payments::mojom::blink::AndroidPayTokenization::UNSPECIFIED; |
| + } |
| + } |
| + |
| + if (tokenization.hasParameters() && |
| + tokenization.parameters().v8Value()->IsObject() && |
| + !tokenization.parameters().v8Value()->IsArray()) { |
| + const ScriptValue& parameters = tokenization.parameters(); |
|
Marijn Kruisselbrink
2016/11/16 19:09:13
I mentioned that record<DOMString, DOMString> or s
please use gerrit instead
2016/11/16 20:23:23
Thank you. Dictionary was exactly what I needed.
|
| + v8::Local<v8::Array> keys( |
| + parameters.v8Value().As<v8::Object>()->GetOwnPropertyNames()); |
| + output->parameters.resize(keys->Length()); |
| + for (uint32_t i = 0; i < keys->Length(); ++i) { |
| + v8::Local<v8::Value> key(keys->Get(i)); |
| + if (key->IsString()) { |
| + v8::TryCatch tryCatch(parameters.isolate()); |
| + v8::Local<v8::Value> value = |
| + parameters.v8Value().As<v8::Object>()->Get(key); |
| + if (!tryCatch.HasCaught() && value->IsString()) { |
| + output->parameters[i] = |
| + payments::mojom::blink::AndroidPayTokenizationParameter::New(); |
| + |
| + v8::String::Utf8Value utf8Key(key); |
| + output->parameters[i]->key = String(*utf8Key, utf8Key.length()); |
| + |
| + v8::String::Utf8Value utf8Value(value); |
| + output->parameters[i]->value = |
| + String(*utf8Value, utf8Value.length()); |
| + } |
| + } |
| + } |
| + } |
| + } |
| +} |
| + |
| void validateAndConvertPaymentMethodData( |
| - const HeapVector<PaymentMethodData>& paymentMethodDataVector, |
| - Vector<PaymentRequest::MethodData>* methodData, |
| + const HeapVector<PaymentMethodData>& input, |
| + Vector<payments::mojom::blink::PaymentMethodDataPtr>& output, |
| ExceptionState& exceptionState) { |
| - if (paymentMethodDataVector.isEmpty()) { |
| + if (input.isEmpty()) { |
| exceptionState.throwTypeError( |
| "Must specify at least one payment method identifier"); |
| return; |
| } |
| - for (const auto& paymentMethodData : paymentMethodDataVector) { |
| + output.resize(input.size()); |
| + for (size_t i = 0; i < input.size(); ++i) { |
| + const auto& paymentMethodData = input[i]; |
| if (paymentMethodData.supportedMethods().isEmpty()) { |
| exceptionState.throwTypeError( |
| "Must specify at least one payment method identifier"); |
| @@ -387,8 +462,11 @@ void validateAndConvertPaymentMethodData( |
| stringifiedData = |
| v8StringToWebCoreString<String>(value, DoNotExternalize); |
| } |
| - methodData->append(PaymentRequest::MethodData( |
| - paymentMethodData.supportedMethods(), stringifiedData)); |
| + |
| + output[i] = payments::mojom::blink::PaymentMethodData::New(); |
| + output[i]->supported_methods = paymentMethodData.supportedMethods(); |
| + output[i]->stringified_data = stringifiedData; |
| + maybeSetAndroidPayMethodata(paymentMethodData.data(), output[i]); |
| } |
| } |
| @@ -455,20 +533,6 @@ bool allowedToUsePaymentRequest(const Frame* frame) { |
| return false; |
| } |
| -WTF::Vector<payments::mojom::blink::PaymentMethodDataPtr> |
| -ConvertPaymentMethodData( |
| - const Vector<PaymentRequest::MethodData>& blinkMethods) { |
| - WTF::Vector<payments::mojom::blink::PaymentMethodDataPtr> mojoMethods( |
| - blinkMethods.size()); |
| - for (size_t i = 0; i < blinkMethods.size(); ++i) { |
| - mojoMethods[i] = payments::mojom::blink::PaymentMethodData::New(); |
| - mojoMethods[i]->supported_methods = |
| - WTF::Vector<WTF::String>(blinkMethods[i].supportedMethods); |
| - mojoMethods[i]->stringified_data = blinkMethods[i].stringifiedData; |
| - } |
| - return mojoMethods; |
| -} |
| - |
| } // namespace |
| PaymentRequest* PaymentRequest::create( |
| @@ -639,8 +703,8 @@ PaymentRequest::PaymentRequest(ScriptState* scriptState, |
| m_options(options), |
| m_clientBinding(this), |
| m_completeTimer(this, &PaymentRequest::onCompleteTimeout) { |
| - Vector<MethodData> validatedMethodData; |
| - validateAndConvertPaymentMethodData(methodData, &validatedMethodData, |
| + Vector<payments::mojom::blink::PaymentMethodDataPtr> validatedMethodData; |
| + validateAndConvertPaymentMethodData(methodData, validatedMethodData, |
| exceptionState); |
| if (exceptionState.hadException()) |
| return; |
| @@ -679,7 +743,7 @@ PaymentRequest::PaymentRequest(ScriptState* scriptState, |
| payments::mojom::blink::PaymentErrorReason::UNKNOWN))); |
| m_paymentProvider->Init( |
| m_clientBinding.CreateInterfacePtrAndBind(), |
| - ConvertPaymentMethodData(validatedMethodData), |
| + std::move(validatedMethodData), |
| maybeKeepShippingOptions( |
| payments::mojom::blink::PaymentDetails::From(details), |
| keepShippingOptions && m_options.requestShipping()), |