Title: [273562] trunk
Revision
273562
Author
[email protected]
Date
2021-02-26 09:54:37 -0800 (Fri, 26 Feb 2021)

Log Message

[Payment Request] log if `updateWith` is not called synchronously
https://bugs.webkit.org/show_bug.cgi?id=222436

Reviewed by Andy Estes.

Source/WebCore:

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.

LayoutTests:

* 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.

Modified Paths

Added Paths

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&);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to