Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(311)

Unified Diff: third_party/WebKit/Source/modules/payments/PaymentRequest.cpp

Issue 2500183002: Do not parse JSON in the browser. (Closed)
Patch Set: Use a Dictionary type in IDL Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/modules/payments/PaymentRequest.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..21f0d4aac34440fe960b4ba6174e141e71fe129d 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,31 +169,33 @@ 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 {
namespace {
+using payments::mojom::blink::AndroidPayCardNetwork;
+using payments::mojom::blink::AndroidPayTokenization;
+
// If the website does not call complete() 60 seconds after show() has been
// resolved, then behave as if the website called complete("fail").
static const int completeTimeoutSeconds = 60;
+const struct {
+ const AndroidPayCardNetwork code;
+ const char* name;
+} kAndroidPayNetwork[] = {{AndroidPayCardNetwork::AMEX, "AMEX"},
+ {AndroidPayCardNetwork::DISCOVER, "DISCOVER"},
+ {AndroidPayCardNetwork::MASTERCARD, "MASTERCARD"},
+ {AndroidPayCardNetwork::VISA, "VISA"}};
+
+const struct {
+ const AndroidPayTokenization code;
+ const char* name;
+} kAndroidPayTokenization[] = {
+ {AndroidPayTokenization::GATEWAY_TOKEN, "GATEWAY_TOKEN"},
+ {AndroidPayTokenization::NETWORK_TOKEN, "NETWORK_TOKEN"}};
+
// Validates ShippingOption or PaymentItem, which happen to have identical
// fields, except for "id", which is present only in ShippingOption.
template <typename T>
@@ -349,17 +354,86 @@ 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());
+ size_t numberOfNetworks = 0;
+ for (size_t i = 0; i < androidPay.allowedCardNetworks().size(); ++i) {
+ for (size_t j = 0; j < arraysize(kAndroidPayNetwork); ++j) {
+ if (androidPay.allowedCardNetworks()[i] == kAndroidPayNetwork[j].name) {
+ output->allowed_card_networks[numberOfNetworks++] =
+ kAndroidPayNetwork[j].code;
+ break;
+ }
+ }
+ }
+ output->allowed_card_networks.resize(numberOfNetworks);
+ }
+
+ if (androidPay.hasPaymentMethodTokenizationParameters()) {
+ const blink::AndroidPayTokenization& tokenization =
+ androidPay.paymentMethodTokenizationParameters();
+ output->tokenization_type =
+ payments::mojom::blink::AndroidPayTokenization::UNSPECIFIED;
+ if (tokenization.hasTokenizationType()) {
+ for (size_t j = 0; j < arraysize(kAndroidPayTokenization); ++j) {
+ if (tokenization.tokenizationType() ==
+ kAndroidPayTokenization[j].name) {
+ output->tokenization_type = kAndroidPayTokenization[j].code;
+ break;
+ }
+ }
+ }
+
+ if (tokenization.hasParameters()) {
+ Vector<String> keys;
+ tokenization.parameters().getPropertyNames(keys);
+ output->parameters.resize(keys.size());
+ size_t numberOfParameters = 0;
+ String value;
+ for (size_t i = 0; i < keys.size(); ++i) {
+ if (!DictionaryHelper::get(tokenization.parameters(), keys[i], value))
+ continue;
+ output->parameters[numberOfParameters] =
+ payments::mojom::blink::AndroidPayTokenizationParameter::New();
+ output->parameters[numberOfParameters]->key = keys[i];
+ output->parameters[numberOfParameters]->value = value;
+ ++numberOfParameters;
+ }
+ output->parameters.resize(numberOfParameters);
+ }
+ }
+}
+
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 +461,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 +532,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 +702,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 +742,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()),
« no previous file with comments | « third_party/WebKit/Source/modules/payments/PaymentRequest.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698