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

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

Issue 2470463002: Add data parameter to payment details modifier. (Closed)
Patch Set: Rebase Created 4 years 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
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 f57a1ee58339ee2c88666ced8b4e9838984b957a..239a7a141f3943039499fae90d7a3a1cc29a8151 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
@@ -35,26 +35,20 @@
#include "public/platform/Platform.h"
#include "public/platform/WebTraceLocation.h"
#include "wtf/HashSet.h"
+#include <stddef.h>
#include <utility>
using payments::mojom::blink::ActivePaymentQueryResult;
using payments::mojom::blink::PaymentAddressPtr;
using payments::mojom::blink::PaymentCurrencyAmount;
using payments::mojom::blink::PaymentCurrencyAmountPtr;
-using payments::mojom::blink::PaymentDetails;
-using payments::mojom::blink::PaymentDetailsModifier;
using payments::mojom::blink::PaymentDetailsModifierPtr;
using payments::mojom::blink::PaymentDetailsPtr;
-using payments::mojom::blink::PaymentDetailsPtr;
using payments::mojom::blink::PaymentErrorReason;
-using payments::mojom::blink::PaymentItem;
using payments::mojom::blink::PaymentItemPtr;
-using payments::mojom::blink::PaymentMethodData;
using payments::mojom::blink::PaymentMethodDataPtr;
-using payments::mojom::blink::PaymentOptions;
using payments::mojom::blink::PaymentOptionsPtr;
using payments::mojom::blink::PaymentResponsePtr;
-using payments::mojom::blink::PaymentShippingOption;
using payments::mojom::blink::PaymentShippingOptionPtr;
using payments::mojom::blink::PaymentShippingType;
@@ -76,7 +70,7 @@ struct TypeConverter<PaymentCurrencyAmountPtr, blink::PaymentCurrencyAmount> {
template <>
struct TypeConverter<PaymentItemPtr, blink::PaymentItem> {
static PaymentItemPtr Convert(const blink::PaymentItem& input) {
- PaymentItemPtr output = PaymentItem::New();
+ PaymentItemPtr output = payments::mojom::blink::PaymentItem::New();
output->label = input.label();
output->amount = PaymentCurrencyAmount::From(input.amount());
output->pending = input.pending();
@@ -88,7 +82,8 @@ template <>
struct TypeConverter<PaymentShippingOptionPtr, blink::PaymentShippingOption> {
static PaymentShippingOptionPtr Convert(
const blink::PaymentShippingOption& input) {
- PaymentShippingOptionPtr output = PaymentShippingOption::New();
+ PaymentShippingOptionPtr output =
+ payments::mojom::blink::PaymentShippingOption::New();
output->id = input.id();
output->label = input.label();
output->amount = PaymentCurrencyAmount::From(input.amount());
@@ -98,65 +93,9 @@ struct TypeConverter<PaymentShippingOptionPtr, blink::PaymentShippingOption> {
};
template <>
-struct TypeConverter<PaymentDetailsModifierPtr, blink::PaymentDetailsModifier> {
- static PaymentDetailsModifierPtr Convert(
- const blink::PaymentDetailsModifier& input) {
- PaymentDetailsModifierPtr output = PaymentDetailsModifier::New();
- output->supported_methods = input.supportedMethods();
-
- if (input.hasTotal())
- output->total = PaymentItem::From(input.total());
-
- if (input.hasAdditionalDisplayItems()) {
- for (size_t i = 0; i < input.additionalDisplayItems().size(); ++i) {
- output->additional_display_items.append(
- PaymentItem::From(input.additionalDisplayItems()[i]));
- }
- }
- return output;
- }
-};
-
-template <>
-struct TypeConverter<PaymentDetailsPtr, blink::PaymentDetails> {
- static PaymentDetailsPtr Convert(const blink::PaymentDetails& input) {
- PaymentDetailsPtr output = PaymentDetails::New();
- output->total = PaymentItem::From(input.total());
-
- if (input.hasDisplayItems()) {
- for (size_t i = 0; i < input.displayItems().size(); ++i) {
- output->display_items.append(
- PaymentItem::From(input.displayItems()[i]));
- }
- }
-
- if (input.hasShippingOptions()) {
- for (size_t i = 0; i < input.shippingOptions().size(); ++i) {
- output->shipping_options.append(
- PaymentShippingOption::From(input.shippingOptions()[i]));
- }
- }
-
- if (input.hasModifiers()) {
- for (size_t i = 0; i < input.modifiers().size(); ++i) {
- output->modifiers.append(
- PaymentDetailsModifier::From(input.modifiers()[i]));
- }
- }
-
- if (input.hasError())
- output->error = input.error();
- else
- output->error = emptyString();
-
- return output;
- }
-};
-
-template <>
struct TypeConverter<PaymentOptionsPtr, blink::PaymentOptions> {
static PaymentOptionsPtr Convert(const blink::PaymentOptions& input) {
- PaymentOptionsPtr output = PaymentOptions::New();
+ PaymentOptionsPtr output = payments::mojom::blink::PaymentOptions::New();
output->request_payer_name = input.requestPayerName();
output->request_payer_email = input.requestPayerEmail();
output->request_payer_phone = input.requestPayerPhone();
@@ -240,128 +179,67 @@ void validateShippingOptionOrPaymentItem(const T& item,
}
}
-void validateDisplayItems(const HeapVector<PaymentItem>& items,
- ExceptionState& exceptionState) {
- for (const auto& item : items) {
+void validateAndConvertDisplayItems(const HeapVector<PaymentItem>& input,
+ Vector<PaymentItemPtr>& output,
+ ExceptionState& exceptionState) {
+ for (const PaymentItem& item : input) {
validateShippingOptionOrPaymentItem(item, exceptionState);
if (exceptionState.hadException())
return;
+ output.append(payments::mojom::blink::PaymentItem::From(item));
}
}
-// Returns false if |options| should be ignored, even if an exception was not
-// thrown. TODO(rouslan): Clear shipping options instead of ignoring them when
-// http://crbug.com/601193 is fixed.
-bool validateShippingOptions(const HeapVector<PaymentShippingOption>& options,
- ExceptionState& exceptionState) {
+// Validates and converts |input| shipping options into |output|. Throws an
+// exception if the data is not valid, except for duplicate identifiers, which
+// returns an empty |output| instead of throwing an exception. There's no need
+// to clear |output| when an exception is thrown, because the caller takes care
+// of deleting |output|.
+void validateAndConvertShippingOptions(
+ const HeapVector<PaymentShippingOption>& input,
+ Vector<PaymentShippingOptionPtr>& output,
+ ExceptionState& exceptionState) {
HashSet<String> uniqueIds;
- for (const auto& option : options) {
+ for (const PaymentShippingOption& option : input) {
if (!option.hasId() || option.id().isEmpty()) {
exceptionState.throwTypeError("ShippingOption id required");
- return false;
+ return;
}
- if (uniqueIds.contains(option.id()))
- return false;
+ if (uniqueIds.contains(option.id())) {
+ // Clear |output| instead of throwing an exception.
+ output.clear();
+ return;
+ }
uniqueIds.add(option.id());
validateShippingOptionOrPaymentItem(option, exceptionState);
if (exceptionState.hadException())
- return false;
- }
-
- return true;
-}
-
-void validatePaymentDetailsModifiers(
- const HeapVector<PaymentDetailsModifier>& modifiers,
- ExceptionState& exceptionState) {
- if (modifiers.isEmpty()) {
- exceptionState.throwTypeError(
- "Must specify at least one payment details modifier");
- return;
- }
-
- for (const auto& modifier : modifiers) {
- if (modifier.supportedMethods().isEmpty()) {
- exceptionState.throwTypeError(
- "Must specify at least one payment method identifier");
return;
- }
-
- if (modifier.hasTotal()) {
- validateShippingOptionOrPaymentItem(modifier.total(), exceptionState);
- if (exceptionState.hadException())
- return;
- if (modifier.total().amount().value()[0] == '-') {
- exceptionState.throwTypeError(
- "Total amount value should be non-negative");
- return;
- }
- }
-
- if (modifier.hasAdditionalDisplayItems()) {
- validateDisplayItems(modifier.additionalDisplayItems(), exceptionState);
- if (exceptionState.hadException())
- return;
- }
+ output.append(payments::mojom::blink::PaymentShippingOption::From(option));
}
}
-// Returns false if the shipping options should be ignored without throwing an
-// exception.
-bool validatePaymentDetails(const PaymentDetails& details,
- ExceptionState& exceptionState) {
- bool keepShippingOptions = true;
- if (!details.hasTotal()) {
- exceptionState.throwTypeError("Must specify total");
- return keepShippingOptions;
- }
-
- validateShippingOptionOrPaymentItem(details.total(), exceptionState);
+void validateAndConvertTotal(const PaymentItem& input,
+ PaymentItemPtr& output,
+ ExceptionState& exceptionState) {
+ validateShippingOptionOrPaymentItem(input, exceptionState);
if (exceptionState.hadException())
- return keepShippingOptions;
+ return;
- if (details.total().amount().value()[0] == '-') {
+ if (input.amount().value()[0] == '-') {
exceptionState.throwTypeError("Total amount value should be non-negative");
- return keepShippingOptions;
- }
-
- if (details.hasDisplayItems()) {
- validateDisplayItems(details.displayItems(), exceptionState);
- if (exceptionState.hadException())
- return keepShippingOptions;
- }
-
- if (details.hasShippingOptions()) {
- keepShippingOptions =
- validateShippingOptions(details.shippingOptions(), exceptionState);
-
- if (exceptionState.hadException())
- return keepShippingOptions;
- }
-
- if (details.hasModifiers()) {
- validatePaymentDetailsModifiers(details.modifiers(), exceptionState);
- if (exceptionState.hadException())
- return keepShippingOptions;
- }
-
- String errorMessage;
- if (!PaymentsValidators::isValidErrorMsgFormat(details.error(),
- &errorMessage)) {
- exceptionState.throwTypeError(errorMessage);
+ return;
}
- return keepShippingOptions;
+ output = payments::mojom::blink::PaymentItem::From(input);
}
-void maybeSetAndroidPayMethodData(
- const ScriptValue& input,
- payments::mojom::blink::PaymentMethodDataPtr& output,
- ExceptionState& exceptionState) {
+void maybeSetAndroidPayMethodData(const ScriptValue& input,
+ PaymentMethodDataPtr& output,
+ ExceptionState& exceptionState) {
AndroidPayMethodData androidPay;
DummyExceptionStateForTesting dummyExceptionState;
V8AndroidPayMethodData::toImpl(input.isolate(), input.v8Value(), androidPay,
@@ -376,19 +254,14 @@ void maybeSetAndroidPayMethodData(
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;
+ for (const String& allowedCardNetwork : androidPay.allowedCardNetworks()) {
+ for (size_t i = 0; i < arraysize(kAndroidPayNetwork); ++i) {
+ if (allowedCardNetwork == kAndroidPayNetwork[i].name) {
+ output->allowed_card_networks.append(kAndroidPayNetwork[i].code);
break;
}
}
}
- output->allowed_card_networks.resize(numberOfNetworks);
}
if (androidPay.hasPaymentMethodTokenizationParameters()) {
@@ -397,10 +270,10 @@ void maybeSetAndroidPayMethodData(
output->tokenization_type =
payments::mojom::blink::AndroidPayTokenization::UNSPECIFIED;
if (tokenization.hasTokenizationType()) {
- for (size_t j = 0; j < arraysize(kAndroidPayTokenization); ++j) {
+ for (size_t i = 0; i < arraysize(kAndroidPayTokenization); ++i) {
if (tokenization.tokenizationType() ==
- kAndroidPayTokenization[j].name) {
- output->tokenization_type = kAndroidPayTokenization[j].code;
+ kAndroidPayTokenization[i].name) {
+ output->tokenization_type = kAndroidPayTokenization[i].code;
break;
}
}
@@ -411,108 +284,187 @@ void maybeSetAndroidPayMethodData(
tokenization.parameters().getPropertyNames(exceptionState);
if (exceptionState.hadException())
return;
- 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))
+ for (const String& key : keys) {
+ if (!DictionaryHelper::get(tokenization.parameters(), key, value))
continue;
- output->parameters[numberOfParameters] =
- payments::mojom::blink::AndroidPayTokenizationParameter::New();
- output->parameters[numberOfParameters]->key = keys[i];
- output->parameters[numberOfParameters]->value = value;
- ++numberOfParameters;
+ output->parameters.append(
+ payments::mojom::blink::AndroidPayTokenizationParameter::New());
+ output->parameters.back()->key = key;
+ output->parameters.back()->value = value;
}
- output->parameters.resize(numberOfParameters);
}
}
}
-void validateAndConvertPaymentMethodData(
- const HeapVector<PaymentMethodData>& input,
- Vector<payments::mojom::blink::PaymentMethodDataPtr>& output,
+void stringifyAndParseMethodSpecificData(const ScriptValue& input,
+ PaymentMethodDataPtr& output,
+ ExceptionState& exceptionState) {
+ DCHECK(!input.isEmpty());
+ if (!input.v8Value()->IsObject() || input.v8Value()->IsArray()) {
+ exceptionState.throwTypeError("Data should be a JSON-serializable object");
+ return;
+ }
+
+ v8::Local<v8::String> value;
+ if (!v8::JSON::Stringify(input.context(), input.v8Value().As<v8::Object>())
+ .ToLocal(&value)) {
+ exceptionState.throwTypeError(
+ "Unable to parse payment method specific data");
+ return;
+ }
+
+ output->stringified_data =
+ v8StringToWebCoreString<String>(value, DoNotExternalize);
+ maybeSetAndroidPayMethodData(input, output, exceptionState);
+}
+
+void validateAndConvertPaymentDetailsModifiers(
+ const HeapVector<PaymentDetailsModifier>& input,
+ Vector<PaymentDetailsModifierPtr>& output,
ExceptionState& exceptionState) {
if (input.isEmpty()) {
exceptionState.throwTypeError(
- "Must specify at least one payment method identifier");
+ "Must specify at least one payment details modifier");
return;
}
- output.resize(input.size());
- for (size_t i = 0; i < input.size(); ++i) {
- const auto& paymentMethodData = input[i];
- if (paymentMethodData.supportedMethods().isEmpty()) {
+ for (const PaymentDetailsModifier& modifier : input) {
+ output.append(payments::mojom::blink::PaymentDetailsModifier::New());
+ if (modifier.hasTotal()) {
+ validateAndConvertTotal(modifier.total(), output.back()->total,
+ exceptionState);
+ if (exceptionState.hadException())
+ return;
+ }
+
+ if (modifier.hasAdditionalDisplayItems()) {
+ validateAndConvertDisplayItems(modifier.additionalDisplayItems(),
+ output.back()->additional_display_items,
+ exceptionState);
+ if (exceptionState.hadException())
+ return;
+ }
+
+ if (modifier.supportedMethods().isEmpty()) {
exceptionState.throwTypeError(
"Must specify at least one payment method identifier");
return;
}
- String stringifiedData = "";
- if (paymentMethodData.hasData() && !paymentMethodData.data().isEmpty()) {
- if (!paymentMethodData.data().v8Value()->IsObject() ||
- paymentMethodData.data().v8Value()->IsArray()) {
- exceptionState.throwTypeError(
- "Data should be a JSON-serializable object");
- return;
- }
+ output.back()->method_data =
+ payments::mojom::blink::PaymentMethodData::New();
+ output.back()->method_data->supported_methods = modifier.supportedMethods();
- v8::Local<v8::String> value;
- if (!v8::JSON::Stringify(
- paymentMethodData.data().context(),
- paymentMethodData.data().v8Value().As<v8::Object>())
- .ToLocal(&value)) {
- exceptionState.throwTypeError(
- "Unable to parse payment method specific data");
- return;
- }
- stringifiedData =
- v8StringToWebCoreString<String>(value, DoNotExternalize);
+ if (modifier.hasData() && !modifier.data().isEmpty()) {
+ stringifyAndParseMethodSpecificData(
+ modifier.data(), output.back()->method_data, exceptionState);
+ } else {
+ output.back()->method_data->stringified_data = "";
}
+ }
+}
+
+String getSelectedShippingOption(
+ const Vector<PaymentShippingOptionPtr>& shippingOptions) {
+ String result;
+ for (const PaymentShippingOptionPtr& shippingOption : shippingOptions) {
+ if (shippingOption->selected)
+ result = shippingOption->id;
+ }
+ return result;
+}
- output[i] = payments::mojom::blink::PaymentMethodData::New();
- output[i]->supported_methods = paymentMethodData.supportedMethods();
- output[i]->stringified_data = stringifiedData;
- maybeSetAndroidPayMethodData(paymentMethodData.data(), output[i],
- exceptionState);
+void validateAndConvertPaymentDetails(const PaymentDetails& input,
+ bool requestShipping,
+ PaymentDetailsPtr& output,
+ String& shippingOptionOutput,
+ ExceptionState& exceptionState) {
+ if (!input.hasTotal()) {
+ exceptionState.throwTypeError("Must specify total");
+ return;
+ }
+
+ validateAndConvertTotal(input.total(), output->total, exceptionState);
+ if (exceptionState.hadException())
+ return;
+
+ if (input.hasDisplayItems()) {
+ validateAndConvertDisplayItems(input.displayItems(), output->display_items,
+ exceptionState);
if (exceptionState.hadException())
return;
}
-}
-String getSelectedShippingOption(const PaymentDetails& details) {
- String result;
- if (!details.hasShippingOptions())
- return result;
+ if (input.hasShippingOptions() && requestShipping) {
+ validateAndConvertShippingOptions(input.shippingOptions(),
+ output->shipping_options, exceptionState);
+ if (exceptionState.hadException())
+ return;
+ }
+
+ shippingOptionOutput = getSelectedShippingOption(output->shipping_options);
- for (int i = details.shippingOptions().size() - 1; i >= 0; --i) {
- if (details.shippingOptions()[i].hasSelected() &&
- details.shippingOptions()[i].selected()) {
- return details.shippingOptions()[i].id();
+ if (input.hasModifiers()) {
+ validateAndConvertPaymentDetailsModifiers(
+ input.modifiers(), output->modifiers, exceptionState);
+ if (exceptionState.hadException())
+ return;
+ }
+
+ if (input.hasError() && !input.error().isNull()) {
+ String errorMessage;
+ if (!PaymentsValidators::isValidErrorMsgFormat(input.error(),
+ &errorMessage)) {
+ exceptionState.throwTypeError(errorMessage);
+ return;
}
+ output->error = input.error();
+ } else {
+ output->error = "";
}
+}
- return result;
+void validateAndConvertPaymentMethodData(
+ const HeapVector<PaymentMethodData>& input,
+ Vector<payments::mojom::blink::PaymentMethodDataPtr>& output,
+ ExceptionState& exceptionState) {
+ if (input.isEmpty()) {
+ exceptionState.throwTypeError(
+ "Must specify at least one payment method identifier");
+ return;
+ }
+
+ for (const PaymentMethodData paymentMethodData : input) {
+ if (paymentMethodData.supportedMethods().isEmpty()) {
+ exceptionState.throwTypeError(
+ "Must specify at least one payment method identifier");
+ return;
+ }
+
+ output.append(payments::mojom::blink::PaymentMethodData::New());
+ output.back()->supported_methods = paymentMethodData.supportedMethods();
+
+ if (paymentMethodData.hasData() && !paymentMethodData.data().isEmpty()) {
+ stringifyAndParseMethodSpecificData(paymentMethodData.data(),
+ output.back(), exceptionState);
+ } else {
+ output.back()->stringified_data = "";
+ }
+ }
}
String getValidShippingType(const String& shippingType) {
static const char* const validValues[] = {
"shipping", "delivery", "pickup",
};
- for (size_t i = 0; i < WTF_ARRAY_LENGTH(validValues); i++) {
+ for (size_t i = 0; i < arraysize(validValues); i++) {
if (shippingType == validValues[i])
return shippingType;
}
return validValues[0];
}
-PaymentDetailsPtr maybeKeepShippingOptions(PaymentDetailsPtr details,
- bool keep) {
- if (!keep)
- details->shipping_options.resize(0);
-
- return details;
-}
-
bool allowedToUsePaymentRequest(const Frame* frame) {
// To determine whether a Document object |document| is allowed to use the
// feature indicated by attribute name |allowpaymentrequest|, run these steps:
@@ -672,7 +624,11 @@ void PaymentRequest::onUpdatePaymentDetails(
return;
}
- bool keepShippingOptions = validatePaymentDetails(details, exceptionState);
+ PaymentDetailsPtr validatedDetails =
+ payments::mojom::blink::PaymentDetails::New();
+ validateAndConvertPaymentDetails(details, m_options.requestShipping(),
+ validatedDetails, m_shippingOption,
+ exceptionState);
if (exceptionState.hadException()) {
m_showResolver->reject(
DOMException::create(SyntaxError, exceptionState.message()));
@@ -680,16 +636,7 @@ void PaymentRequest::onUpdatePaymentDetails(
return;
}
- if (m_options.requestShipping()) {
- if (keepShippingOptions)
- m_shippingOption = getSelectedShippingOption(details);
- else
- m_shippingOption = String();
- }
-
- m_paymentProvider->UpdateWith(maybeKeepShippingOptions(
- payments::mojom::blink::PaymentDetails::From(details),
- keepShippingOptions));
+ m_paymentProvider->UpdateWith(std::move(validatedDetails));
}
void PaymentRequest::onUpdatePaymentDetailsFailure(const String& error) {
@@ -746,7 +693,11 @@ PaymentRequest::PaymentRequest(ScriptState* scriptState,
return;
}
- bool keepShippingOptions = validatePaymentDetails(details, exceptionState);
+ PaymentDetailsPtr validatedDetails =
+ payments::mojom::blink::PaymentDetails::New();
+ validateAndConvertPaymentDetails(details, m_options.requestShipping(),
+ validatedDetails, m_shippingOption,
+ exceptionState);
if (exceptionState.hadException())
return;
@@ -755,11 +706,8 @@ PaymentRequest::PaymentRequest(ScriptState* scriptState,
return;
}
- if (m_options.requestShipping()) {
- if (keepShippingOptions)
- m_shippingOption = getSelectedShippingOption(details);
+ if (m_options.requestShipping())
m_shippingType = getValidShippingType(m_options.shippingType());
- }
scriptState->domWindow()->frame()->interfaceProvider()->getInterface(
mojo::GetProxy(&m_paymentProvider));
@@ -768,10 +716,7 @@ PaymentRequest::PaymentRequest(ScriptState* scriptState,
PaymentErrorReason::UNKNOWN)));
m_paymentProvider->Init(
m_clientBinding.CreateInterfacePtrAndBind(),
- std::move(validatedMethodData),
- maybeKeepShippingOptions(
- payments::mojom::blink::PaymentDetails::From(details),
- keepShippingOptions && m_options.requestShipping()),
+ std::move(validatedMethodData), std::move(validatedDetails),
payments::mojom::blink::PaymentOptions::From(m_options));
}
@@ -813,8 +758,7 @@ void PaymentRequest::OnShippingOptionChange(const String& shippingOptionId) {
ALLOW_UNUSED_LOCAL(success);
}
-void PaymentRequest::OnPaymentResponse(
- payments::mojom::blink::PaymentResponsePtr response) {
+void PaymentRequest::OnPaymentResponse(PaymentResponsePtr response) {
DCHECK(m_showResolver);
DCHECK(!m_completeResolver);
DCHECK(!m_completeTimer.isActive());

Powered by Google App Engine
This is Rietveld 408576698