Diff
Modified: trunk/LayoutTests/ChangeLog (273561 => 273562)
--- trunk/LayoutTests/ChangeLog 2021-02-26 17:49:49 UTC (rev 273561)
+++ trunk/LayoutTests/ChangeLog 2021-02-26 17:54:37 UTC (rev 273562)
@@ -1,3 +1,20 @@
+2021-02-26 Devin Rousso <[email protected]>
+
+ [Payment Request] log if `updateWith` is not called synchronously
+ https://bugs.webkit.org/show_bug.cgi?id=222436
+
+ Reviewed by Andy Estes.
+
+ * http/tests/paymentrequest/updateWith-log-error-if-not-synchronous.https.html: Added.
+ * http/tests/paymentrequest/updateWith-log-error-if-not-synchronous.https-expected.txt: Added.
+
+ * http/tests/paymentrequest/payment-request-change-shipping-address.https.html:
+ * http/tests/paymentrequest/payment-request-change-shipping-option.https.html:
+ * http/tests/paymentrequest/payment-request-show-method.https.html:
+ * http/tests/ssl/applepay/ApplePayBillingAddress.html:
+ * http/tests/ssl/applepay/ApplePayPaymentMethodChangeEvent.https.html:
+ Add `updateWith({})` calls to avoid the log.
+
2021-02-26 Robert Jenner <[email protected]>
[ macOS ] fast/text/mending-heart.html is a constant text failure
Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-address.https.html (273561 => 273562)
--- trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-address.https.html 2021-02-26 17:49:49 UTC (rev 273561)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-address.https.html 2021-02-26 17:54:37 UTC (rev 273562)
@@ -74,7 +74,8 @@
});
});
const handlerPromise = new Promise(resolve => {
- request._onshippingaddresschange_ = () => {
+ request._onshippingaddresschange_ = (event) => {
+ event.updateWith({});
resolve(request.shippingAddress);
};
});
Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-option.https.html (273561 => 273562)
--- trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-option.https.html 2021-02-26 17:49:49 UTC (rev 273561)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-option.https.html 2021-02-26 17:54:37 UTC (rev 273562)
@@ -72,7 +72,8 @@
});
});
const handlerPromise = new Promise(resolve => {
- request._onshippingoptionchange_ = () => {
+ request._onshippingoptionchange_ = (event) => {
+ event.updateWith({});
resolve(request.shippingOption);
};
});
Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-request-show-method.https.html (273561 => 273562)
--- trunk/LayoutTests/http/tests/paymentrequest/payment-request-show-method.https.html 2021-02-26 17:49:49 UTC (rev 273561)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-request-show-method.https.html 2021-02-26 17:54:37 UTC (rev 273562)
@@ -124,8 +124,9 @@
var shippingAddressChanged = false;
const shippingAddressChangedPromise = new Promise((resolve) => {
- request._onshippingaddresschange_ = () => {
+ request._onshippingaddresschange_ = (event) => {
shippingAddressChanged = true;
+ event.updateWith({});
resolve();
};
});
Added: trunk/LayoutTests/http/tests/paymentrequest/updateWith-log-error-if-not-synchronous.https-expected.txt (0 => 273562)
--- trunk/LayoutTests/http/tests/paymentrequest/updateWith-log-error-if-not-synchronous.https-expected.txt (rev 0)
+++ trunk/LayoutTests/http/tests/paymentrequest/updateWith-log-error-if-not-synchronous.https-expected.txt 2021-02-26 17:54:37 UTC (rev 273562)
@@ -0,0 +1,4 @@
+CONSOLE MESSAGE: updateWith() should be called synchronously when handling "shippingaddresschange".
+
+PASS Not calling `updateWith` inside `shippingaddresschange` should log an error.
+
Added: trunk/LayoutTests/http/tests/paymentrequest/updateWith-log-error-if-not-synchronous.https.html (0 => 273562)
--- trunk/LayoutTests/http/tests/paymentrequest/updateWith-log-error-if-not-synchronous.https.html (rev 0)
+++ trunk/LayoutTests/http/tests/paymentrequest/updateWith-log-error-if-not-synchronous.https.html 2021-02-26 17:54:37 UTC (rev 273562)
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Tests that `PaymentRequestUpdateEvent.prototype.updateWith` log an error if not called synchronously when handling the event.</title>
+<script src=""
+<script src=""
+<script src=""
+<script src=""
+<body>
+<script>
+setup({ explicit_done: true, explicit_timeout: true });
+
+user_activation_test((test) => new Promise((resolve, reject) => {
+ let request = new PaymentRequest([validPaymentMethod()], validPaymentDetails());
+ request.addEventListener("merchantvalidation", (event) => {
+ event.complete({ });
+ });
+ request.addEventListener("shippingaddresschange", (event) => {
+ setTimeout(() => {
+ request.abort().then(resolve, reject);
+ });
+ });
+ request.show().catch(() => { /* ignore abort */ });
+}), "Not calling `updateWith` inside `shippingaddresschange` should log an error.");
+
+done();
+</script>
+
Modified: trunk/LayoutTests/http/tests/ssl/applepay/ApplePayBillingAddress.html (273561 => 273562)
--- trunk/LayoutTests/http/tests/ssl/applepay/ApplePayBillingAddress.html 2021-02-26 17:49:49 UTC (rev 273561)
+++ trunk/LayoutTests/http/tests/ssl/applepay/ApplePayBillingAddress.html 2021-02-26 17:54:37 UTC (rev 273562)
@@ -105,6 +105,7 @@
shouldBe("event.methodDetails.billingContact.countryCode", "expectedCountryCode");
shouldBe("event.methodDetails.network","'visa'");
shouldBe("event.methodDetails.type","'credit'");
+ event.updateWith({});
resolve();
};
Modified: trunk/LayoutTests/http/tests/ssl/applepay/ApplePayPaymentMethodChangeEvent.https.html (273561 => 273562)
--- trunk/LayoutTests/http/tests/ssl/applepay/ApplePayPaymentMethodChangeEvent.https.html 2021-02-26 17:49:49 UTC (rev 273561)
+++ trunk/LayoutTests/http/tests/ssl/applepay/ApplePayPaymentMethodChangeEvent.https.html 2021-02-26 17:54:37 UTC (rev 273562)
@@ -55,6 +55,7 @@
paymentRequest._onpaymentmethodchange_ = (event) => {
shouldBe("event.methodName", "'https://apple.com/apple-pay'");
shouldBe("event.methodDetails.type", "'credit'");
+ event.updateWith({});
paymentRequest.abort();
resolve();
};
Modified: trunk/Source/WebCore/ChangeLog (273561 => 273562)
--- trunk/Source/WebCore/ChangeLog 2021-02-26 17:49:49 UTC (rev 273561)
+++ trunk/Source/WebCore/ChangeLog 2021-02-26 17:54:37 UTC (rev 273562)
@@ -1,3 +1,22 @@
+2021-02-26 Devin Rousso <[email protected]>
+
+ [Payment Request] log if `updateWith` is not called synchronously
+ https://bugs.webkit.org/show_bug.cgi?id=222436
+
+ Reviewed by Andy Estes.
+
+ Test: http/tests/paymentrequest/updateWith-log-error-if-not-synchronous.https.html
+
+ * Modules/paymentrequest/PaymentRequest.h:
+ * Modules/paymentrequest/PaymentRequest.cpp:
+ (WebCore::PaymentRequest::shippingAddressChanged):
+ (WebCore::PaymentRequest::shippingOptionChanged):
+ (WebCore::PaymentRequest::paymentMethodChanged):
+ (WebCore::PaymentRequest::dispatchAndCheckUpdateEvent): Added.
+
+ * Modules/paymentrequest/PaymentRequestUpdateEvent.h:
+ (WebCore::PaymentRequestUpdateEvent::didCallUpdateWith const): Added.
+
2021-02-26 Chris Dumez <[email protected]>
Unreviewed, address post-landing review feedback for r273542.
Modified: trunk/Source/WebCore/Modules/paymentrequest/PaymentRequest.cpp (273561 => 273562)
--- trunk/Source/WebCore/Modules/paymentrequest/PaymentRequest.cpp 2021-02-26 17:49:49 UTC (rev 273561)
+++ trunk/Source/WebCore/Modules/paymentrequest/PaymentRequest.cpp 2021-02-26 17:54:37 UTC (rev 273562)
@@ -630,7 +630,7 @@
{
whenDetailsSettled([this, protectedThis = makeRefPtr(this), shippingAddress = makeRefPtr(shippingAddress.get())]() mutable {
m_shippingAddress = WTFMove(shippingAddress);
- dispatchEvent(PaymentRequestUpdateEvent::create(eventNames().shippingaddresschangeEvent));
+ dispatchAndCheckUpdateEvent(PaymentRequestUpdateEvent::create(eventNames().shippingaddresschangeEvent));
});
}
@@ -638,7 +638,7 @@
{
whenDetailsSettled([this, protectedThis = makeRefPtr(this), shippingOption]() mutable {
m_shippingOption = shippingOption;
- dispatchEvent(PaymentRequestUpdateEvent::create(eventNames().shippingoptionchangeEvent));
+ dispatchAndCheckUpdateEvent(PaymentRequestUpdateEvent::create(eventNames().shippingoptionchangeEvent));
});
}
@@ -647,7 +647,7 @@
whenDetailsSettled([this, protectedThis = makeRefPtr(this), methodName, methodDetailsFunction = WTFMove(methodDetailsFunction)]() mutable {
auto& eventName = eventNames().paymentmethodchangeEvent;
if (hasEventListeners(eventName))
- dispatchEvent(PaymentMethodChangeEvent::create(eventName, methodName, WTFMove(methodDetailsFunction)));
+ dispatchAndCheckUpdateEvent(PaymentMethodChangeEvent::create(eventName, methodName, WTFMove(methodDetailsFunction)));
else
activePaymentHandler()->detailsUpdated(UpdateReason::PaymentMethodChanged, { }, { }, { }, { });
});
@@ -700,6 +700,16 @@
return { };
}
+void PaymentRequest::dispatchAndCheckUpdateEvent(Ref<PaymentRequestUpdateEvent>&& event)
+{
+ dispatchEvent(event);
+
+ if (event->didCallUpdateWith())
+ return;
+
+ scriptExecutionContext()->addConsoleMessage(JSC::MessageSource::PaymentRequest, JSC::MessageLevel::Warning, makeString("updateWith() should be called synchronously when handling \""_s, event->type(), "\"."_s));
+}
+
void PaymentRequest::settleDetailsPromise(UpdateReason reason)
{
auto scopeExit = makeScopeExit([&] {
Modified: trunk/Source/WebCore/Modules/paymentrequest/PaymentRequest.h (273561 => 273562)
--- trunk/Source/WebCore/Modules/paymentrequest/PaymentRequest.h 2021-02-26 17:49:49 UTC (rev 273561)
+++ trunk/Source/WebCore/Modules/paymentrequest/PaymentRequest.h 2021-02-26 17:54:37 UTC (rev 273562)
@@ -44,6 +44,7 @@
class Event;
class PaymentAddress;
class PaymentHandler;
+class PaymentRequestUpdateEvent;
class PaymentResponse;
enum class PaymentComplete;
enum class PaymentShippingType;
@@ -117,6 +118,7 @@
PaymentRequest(Document&, PaymentOptions&&, PaymentDetailsInit&&, Vector<String>&& serializedModifierData, Vector<Method>&& serializedMethodData, String&& selectedShippingOption);
+ void dispatchAndCheckUpdateEvent(Ref<PaymentRequestUpdateEvent>&&);
void settleDetailsPromise(UpdateReason);
void whenDetailsSettled(std::function<void()>&&);
void abortWithException(Exception&&);
Modified: trunk/Source/WebCore/Modules/paymentrequest/PaymentRequestUpdateEvent.h (273561 => 273562)
--- trunk/Source/WebCore/Modules/paymentrequest/PaymentRequestUpdateEvent.h 2021-02-26 17:49:49 UTC (rev 273561)
+++ trunk/Source/WebCore/Modules/paymentrequest/PaymentRequestUpdateEvent.h 2021-02-26 17:54:37 UTC (rev 273562)
@@ -45,6 +45,8 @@
~PaymentRequestUpdateEvent();
ExceptionOr<void> updateWith(Ref<DOMPromise>&&);
+ bool didCallUpdateWith() const { return m_waitForUpdate; }
+
protected:
explicit PaymentRequestUpdateEvent(const AtomString& type);
PaymentRequestUpdateEvent(const AtomString& type, const PaymentRequestUpdateEventInit&);