| 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 53dea7a1dd1f7c63b960d7cc560414349432d1e5..526f74e012afc41f47604f1cb3a1970a470def45 100644
|
| --- a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
|
| +++ b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "modules/payments/PaymentRequest.h"
|
|
|
| +#include <stddef.h>
|
| +#include <utility>
|
| #include "bindings/core/v8/ConditionalFeatures.h"
|
| #include "bindings/core/v8/ExceptionState.h"
|
| #include "bindings/core/v8/ScriptPromiseResolver.h"
|
| @@ -41,8 +43,6 @@
|
| #include "public/platform/Platform.h"
|
| #include "public/platform/WebTraceLocation.h"
|
| #include "wtf/HashSet.h"
|
| -#include <stddef.h>
|
| -#include <utility>
|
|
|
| using payments::mojom::blink::CanMakePaymentQueryResult;
|
| using payments::mojom::blink::PaymentAddressPtr;
|
| @@ -316,8 +316,8 @@ void setAndroidPayMethodData(const ScriptValue& input,
|
|
|
| // Parses basic-card data to avoid parsing JSON in the browser.
|
| void setBasicCardMethodData(const ScriptValue& input,
|
| - Document& document,
|
| PaymentMethodDataPtr& output,
|
| + ExecutionContext& executionContext,
|
| ExceptionState& exceptionState) {
|
| BasicCardRequest basicCard;
|
| V8BasicCardRequest::toImpl(input.isolate(), input.v8Value(), basicCard,
|
| @@ -370,7 +370,7 @@ void setBasicCardMethodData(const ScriptValue& input,
|
| }
|
|
|
| if (output->supported_types.size() != arraysize(basicCardTypes)) {
|
| - document.addConsoleMessage(ConsoleMessage::create(
|
| + executionContext.addConsoleMessage(ConsoleMessage::create(
|
| JSMessageSource, WarningMessageLevel,
|
| "Cannot yet distinguish credit, debit, and prepaid cards."));
|
| }
|
| @@ -379,8 +379,8 @@ void setBasicCardMethodData(const ScriptValue& input,
|
|
|
| void stringifyAndParseMethodSpecificData(const Vector<String>& supportedMethods,
|
| const ScriptValue& input,
|
| - Document& document,
|
| PaymentMethodDataPtr& output,
|
| + ExecutionContext& executionContext,
|
| ExceptionState& exceptionState) {
|
| DCHECK(!input.isEmpty());
|
| if (!input.v8Value()->IsObject() || input.v8Value()->IsArray()) {
|
| @@ -409,7 +409,7 @@ void stringifyAndParseMethodSpecificData(const Vector<String>& supportedMethods,
|
| }
|
| if (RuntimeEnabledFeatures::paymentRequestBasicCardEnabled() &&
|
| supportedMethods.contains("basic-card")) {
|
| - setBasicCardMethodData(input, document, output, exceptionState);
|
| + setBasicCardMethodData(input, output, executionContext, exceptionState);
|
| if (exceptionState.hadException())
|
| exceptionState.clearException();
|
| }
|
| @@ -417,8 +417,8 @@ void stringifyAndParseMethodSpecificData(const Vector<String>& supportedMethods,
|
|
|
| void validateAndConvertPaymentDetailsModifiers(
|
| const HeapVector<PaymentDetailsModifier>& input,
|
| - Document& document,
|
| Vector<PaymentDetailsModifierPtr>& output,
|
| + ExecutionContext& executionContext,
|
| ExceptionState& exceptionState) {
|
| if (input.isEmpty()) {
|
| exceptionState.throwTypeError(
|
| @@ -455,8 +455,8 @@ void validateAndConvertPaymentDetailsModifiers(
|
|
|
| if (modifier.hasData() && !modifier.data().isEmpty()) {
|
| stringifyAndParseMethodSpecificData(
|
| - modifier.supportedMethods(), modifier.data(), document,
|
| - output.back()->method_data, exceptionState);
|
| + modifier.supportedMethods(), modifier.data(),
|
| + output.back()->method_data, executionContext, exceptionState);
|
| } else {
|
| output.back()->method_data->stringified_data = "";
|
| }
|
| @@ -475,9 +475,9 @@ String getSelectedShippingOption(
|
|
|
| void validateAndConvertPaymentDetails(const PaymentDetails& input,
|
| bool requestShipping,
|
| - Document& document,
|
| PaymentDetailsPtr& output,
|
| String& shippingOptionOutput,
|
| + ExecutionContext& executionContext,
|
| ExceptionState& exceptionState) {
|
| if (!input.hasTotal()) {
|
| exceptionState.throwTypeError("Must specify total");
|
| @@ -506,7 +506,7 @@ void validateAndConvertPaymentDetails(const PaymentDetails& input,
|
|
|
| if (input.hasModifiers()) {
|
| validateAndConvertPaymentDetailsModifiers(
|
| - input.modifiers(), document, output->modifiers, exceptionState);
|
| + input.modifiers(), output->modifiers, executionContext, exceptionState);
|
| if (exceptionState.hadException())
|
| return;
|
| }
|
| @@ -526,8 +526,8 @@ void validateAndConvertPaymentDetails(const PaymentDetails& input,
|
|
|
| void validateAndConvertPaymentMethodData(
|
| const HeapVector<PaymentMethodData>& input,
|
| - Document& document,
|
| Vector<payments::mojom::blink::PaymentMethodDataPtr>& output,
|
| + ExecutionContext& executionContext,
|
| ExceptionState& exceptionState) {
|
| if (input.isEmpty()) {
|
| exceptionState.throwTypeError(
|
| @@ -546,9 +546,9 @@ void validateAndConvertPaymentMethodData(
|
| output.back()->supported_methods = paymentMethodData.supportedMethods();
|
|
|
| if (paymentMethodData.hasData() && !paymentMethodData.data().isEmpty()) {
|
| - stringifyAndParseMethodSpecificData(paymentMethodData.supportedMethods(),
|
| - paymentMethodData.data(), document,
|
| - output.back(), exceptionState);
|
| + stringifyAndParseMethodSpecificData(
|
| + paymentMethodData.supportedMethods(), paymentMethodData.data(),
|
| + output.back(), executionContext, exceptionState);
|
| } else {
|
| output.back()->stringified_data = "";
|
| }
|
| @@ -628,36 +628,39 @@ bool allowedToUsePaymentRequest(const Frame* frame) {
|
| } // namespace
|
|
|
| PaymentRequest* PaymentRequest::create(
|
| - Document& document,
|
| + ExecutionContext* executionContext,
|
| const HeapVector<PaymentMethodData>& methodData,
|
| const PaymentDetails& details,
|
| ExceptionState& exceptionState) {
|
| - return new PaymentRequest(document, methodData, details, PaymentOptions(),
|
| - exceptionState);
|
| + return new PaymentRequest(executionContext, methodData, details,
|
| + PaymentOptions(), exceptionState);
|
| }
|
|
|
| PaymentRequest* PaymentRequest::create(
|
| - Document& document,
|
| + ExecutionContext* executionContext,
|
| const HeapVector<PaymentMethodData>& methodData,
|
| const PaymentDetails& details,
|
| const PaymentOptions& options,
|
| ExceptionState& exceptionState) {
|
| - return new PaymentRequest(document, methodData, details, options,
|
| + return new PaymentRequest(executionContext, methodData, details, options,
|
| exceptionState);
|
| }
|
|
|
| PaymentRequest::~PaymentRequest() {}
|
|
|
| ScriptPromise PaymentRequest::show(ScriptState* scriptState) {
|
| - if (!m_paymentProvider.is_bound() || m_showResolver)
|
| + if (!m_paymentProvider.is_bound() || m_showResolver) {
|
| return ScriptPromise::rejectWithDOMException(
|
| scriptState,
|
| DOMException::create(InvalidStateError, "Already called show() once"));
|
| + }
|
|
|
| - if (!scriptState->domWindow() || !scriptState->domWindow()->frame())
|
| + if (!scriptState->contextIsValid() || !scriptState->domWindow() ||
|
| + !scriptState->domWindow()->frame()) {
|
| return ScriptPromise::rejectWithDOMException(
|
| scriptState, DOMException::create(InvalidStateError,
|
| "Cannot show the payment request"));
|
| + }
|
|
|
| m_paymentProvider->Show();
|
|
|
| @@ -666,18 +669,26 @@ ScriptPromise PaymentRequest::show(ScriptState* scriptState) {
|
| }
|
|
|
| ScriptPromise PaymentRequest::abort(ScriptState* scriptState) {
|
| - if (m_abortResolver)
|
| + if (!scriptState->contextIsValid()) {
|
| + return ScriptPromise::rejectWithDOMException(
|
| + scriptState,
|
| + DOMException::create(InvalidStateError, "Cannot abort payment"));
|
| + }
|
| +
|
| + if (m_abortResolver) {
|
| return ScriptPromise::rejectWithDOMException(
|
| scriptState,
|
| DOMException::create(InvalidStateError,
|
| "Cannot abort() again until the previous abort() "
|
| "has resolved or rejected"));
|
| + }
|
|
|
| - if (!m_showResolver)
|
| + if (!m_showResolver) {
|
| return ScriptPromise::rejectWithDOMException(
|
| scriptState,
|
| DOMException::create(InvalidStateError,
|
| "Never called show(), so nothing to abort"));
|
| + }
|
|
|
| m_abortResolver = ScriptPromiseResolver::create(scriptState);
|
| m_paymentProvider->Abort();
|
| @@ -712,23 +723,32 @@ ExecutionContext* PaymentRequest::getExecutionContext() const {
|
|
|
| ScriptPromise PaymentRequest::complete(ScriptState* scriptState,
|
| PaymentComplete result) {
|
| - if (m_completeResolver)
|
| + if (!scriptState->contextIsValid()) {
|
| + return ScriptPromise::rejectWithDOMException(
|
| + scriptState,
|
| + DOMException::create(InvalidStateError, "Cannot complete payment"));
|
| + }
|
| +
|
| + if (m_completeResolver) {
|
| return ScriptPromise::rejectWithDOMException(
|
| scriptState, DOMException::create(InvalidStateError,
|
| "Already called complete() once"));
|
| + }
|
|
|
| - if (!m_completeTimer.isActive())
|
| + if (!m_completeTimer.isActive()) {
|
| return ScriptPromise::rejectWithDOMException(
|
| scriptState,
|
| DOMException::create(
|
| InvalidStateError,
|
| "Timed out after 60 seconds, complete() called too late"));
|
| + }
|
|
|
| // User has cancelled the transaction while the website was processing it.
|
| - if (!m_paymentProvider)
|
| + if (!m_paymentProvider) {
|
| return ScriptPromise::rejectWithDOMException(
|
| scriptState,
|
| DOMException::create(InvalidStateError, "Request cancelled"));
|
| + }
|
|
|
| m_completeTimer.stop();
|
|
|
| @@ -760,10 +780,9 @@ void PaymentRequest::onUpdatePaymentDetails(
|
|
|
| PaymentDetailsPtr validatedDetails =
|
| payments::mojom::blink::PaymentDetails::New();
|
| - validateAndConvertPaymentDetails(
|
| - details, m_options.requestShipping(),
|
| - *detailsScriptValue.getScriptState()->domWindow()->document(),
|
| - validatedDetails, m_shippingOption, exceptionState);
|
| + validateAndConvertPaymentDetails(details, m_options.requestShipping(),
|
| + validatedDetails, m_shippingOption,
|
| + *getExecutionContext(), exceptionState);
|
| if (exceptionState.hadException()) {
|
| m_showResolver->reject(
|
| DOMException::create(SyntaxError, exceptionState.message()));
|
| @@ -798,30 +817,29 @@ void PaymentRequest::onCompleteTimeoutForTesting() {
|
| onCompleteTimeout(0);
|
| }
|
|
|
| -PaymentRequest::PaymentRequest(Document& document,
|
| +PaymentRequest::PaymentRequest(ExecutionContext* executionContext,
|
| const HeapVector<PaymentMethodData>& methodData,
|
| const PaymentDetails& details,
|
| const PaymentOptions& options,
|
| ExceptionState& exceptionState)
|
| - : ContextLifecycleObserver(&document),
|
| + : ContextLifecycleObserver(executionContext),
|
| m_options(options),
|
| m_clientBinding(this),
|
| - m_completeTimer(
|
| - TaskRunnerHelper::get(TaskType::MiscPlatformAPI, document.frame()),
|
| - this,
|
| - &PaymentRequest::onCompleteTimeout) {
|
| + m_completeTimer(TaskRunnerHelper::get(TaskType::MiscPlatformAPI, frame()),
|
| + this,
|
| + &PaymentRequest::onCompleteTimeout) {
|
| Vector<payments::mojom::blink::PaymentMethodDataPtr> validatedMethodData;
|
| - validateAndConvertPaymentMethodData(methodData, document, validatedMethodData,
|
| - exceptionState);
|
| + validateAndConvertPaymentMethodData(methodData, validatedMethodData,
|
| + *getExecutionContext(), exceptionState);
|
| if (exceptionState.hadException())
|
| return;
|
|
|
| - if (!document.isSecureContext()) {
|
| + if (!getExecutionContext()->isSecureContext()) {
|
| exceptionState.throwSecurityError("Must be in a secure context");
|
| return;
|
| }
|
|
|
| - if (!allowedToUsePaymentRequest(document.frame())) {
|
| + if (!allowedToUsePaymentRequest(frame())) {
|
| exceptionState.throwSecurityError(
|
| "Must be in a top-level browsing context or an iframe needs to specify "
|
| "'allowpaymentrequest' explicitly");
|
| @@ -831,8 +849,8 @@ PaymentRequest::PaymentRequest(Document& document,
|
| PaymentDetailsPtr validatedDetails =
|
| payments::mojom::blink::PaymentDetails::New();
|
| validateAndConvertPaymentDetails(details, m_options.requestShipping(),
|
| - document, validatedDetails, m_shippingOption,
|
| - exceptionState);
|
| + validatedDetails, m_shippingOption,
|
| + *getExecutionContext(), exceptionState);
|
| if (exceptionState.hadException())
|
| return;
|
|
|
| @@ -844,7 +862,7 @@ PaymentRequest::PaymentRequest(Document& document,
|
| if (m_options.requestShipping())
|
| m_shippingType = getValidShippingType(m_options.shippingType());
|
|
|
| - document.frame()->interfaceProvider()->getInterface(
|
| + frame()->interfaceProvider()->getInterface(
|
| mojo::MakeRequest(&m_paymentProvider));
|
| m_paymentProvider.set_connection_error_handler(convertToBaseCallback(
|
| WTF::bind(&PaymentRequest::OnError, wrapWeakPersistent(this),
|
|
|