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

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

Issue 2697123003: Use ExecutionContext instead of Document in PaymentRequest constructor. (Closed)
Patch Set: ExecutionContext in constructor only Created 3 years, 10 months 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 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),

Powered by Google App Engine
This is Rietveld 408576698