Title: [224402] trunk
Revision
224402
Author
aes...@apple.com
Date
2017-11-03 09:35:59 -0700 (Fri, 03 Nov 2017)

Log Message

[Payment Request] show() should only be called with user activation
https://bugs.webkit.org/show_bug.cgi?id=179056

Reviewed by Sam Weinig.

Source/WebCore:

Updated existing tests to call PaymentRequest.show() with user activation.

* Modules/paymentrequest/PaymentRequest.cpp:
(WebCore::PaymentRequest::show):

LayoutTests:

* http/tests/paymentrequest/payment-address-attributes-and-toJSON-method.https.html:
* http/tests/paymentrequest/payment-request-canmakepayment-method.https.html:
* 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/paymentrequest/payment-response-complete-method.https.html:
* http/tests/paymentrequest/payment-response-methodName-attribute.https.html:
* http/tests/paymentrequest/payment-response-payerEmail-attribute.https.html:
* http/tests/paymentrequest/payment-response-payerName-attribute.https.html:
* http/tests/paymentrequest/payment-response-payerPhone-attribute.https.html:
* http/tests/paymentrequest/resources/helpers.js:
(async.getPaymentRequestResponse):
* http/tests/paymentrequest/updateWith-method-pmi-handling.https.html:
* http/tests/resources/payment-request.js: Added.
(activateThen):
* http/tests/ssl/applepay/ApplePayMerchantValidationEvent.https.html:
* http/tests/ssl/applepay/ApplePayPaymentMethodUpdateEvent.https.html:
* http/tests/ssl/applepay/PaymentRequest.https.html:
* resources/ui-helper.js:
(window.UIHelper.activateElement):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (224401 => 224402)


--- trunk/LayoutTests/ChangeLog	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/ChangeLog	2017-11-03 16:35:59 UTC (rev 224402)
@@ -1,3 +1,31 @@
+2017-11-02  Andy Estes  <aes...@apple.com>
+
+        [Payment Request] show() should only be called with user activation
+        https://bugs.webkit.org/show_bug.cgi?id=179056
+
+        Reviewed by Sam Weinig.
+
+        * http/tests/paymentrequest/payment-address-attributes-and-toJSON-method.https.html:
+        * http/tests/paymentrequest/payment-request-canmakepayment-method.https.html:
+        * 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/paymentrequest/payment-response-complete-method.https.html:
+        * http/tests/paymentrequest/payment-response-methodName-attribute.https.html:
+        * http/tests/paymentrequest/payment-response-payerEmail-attribute.https.html:
+        * http/tests/paymentrequest/payment-response-payerName-attribute.https.html:
+        * http/tests/paymentrequest/payment-response-payerPhone-attribute.https.html:
+        * http/tests/paymentrequest/resources/helpers.js:
+        (async.getPaymentRequestResponse):
+        * http/tests/paymentrequest/updateWith-method-pmi-handling.https.html:
+        * http/tests/resources/payment-request.js: Added.
+        (activateThen):
+        * http/tests/ssl/applepay/ApplePayMerchantValidationEvent.https.html:
+        * http/tests/ssl/applepay/ApplePayPaymentMethodUpdateEvent.https.html:
+        * http/tests/ssl/applepay/PaymentRequest.https.html:
+        * resources/ui-helper.js:
+        (window.UIHelper.activateElement):
+
 2017-11-03  Ms2ger  <ms2...@igalia.com>
 
         [WPE] Update Event-timestamp-high-resolution.html expectations.

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-address-attributes-and-toJSON-method.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-address-attributes-and-toJSON-method.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-address-attributes-and-toJSON-method.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -4,6 +4,8 @@
 <title>
   PaymentResponse.prototype.shippingAddress
 </title>
+<script src=""
+<script src=""
 <script src=""
 <script src=""
 <script src=""

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-request-canmakepayment-method.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-request-canmakepayment-method.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-request-canmakepayment-method.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -5,6 +5,8 @@
 <meta charset="utf-8">
 <title>Tests for PaymentRequest.canMakePayment() method</title>
 <link rel="help" href=""
+<script src=""
+<script src=""
 <script src=""
 <script src=""
 <script>
@@ -49,7 +51,7 @@
   }
 }, `If request.[[state]] is "created", then return a promise that resolves to true for known method.`);
 
-promise_test(async t => {
+user_activation_test(async t => {
   const request = new PaymentRequest(defaultMethods, defaultDetails);
   const acceptPromise = request.show(); // Sets state to "interactive"
   const canMakePaymentPromise = request.canMakePayment();
@@ -69,7 +71,7 @@
   await promise_rejects(t, "InvalidStateError", request.canMakePayment());
 }, `If request.[[state]] is "interactive", then return a promise rejected with an "InvalidStateError" DOMException.`);
 
-promise_test(async t => {
+user_activation_test(async t => {
   const request = new PaymentRequest(defaultMethods, defaultDetails);
   const acceptPromise = request.show(); // The state is now "interactive"
   acceptPromise.catch(() => {}); // no-op, just to silence unhandled rejection in devtools.

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-address.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-address.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-address.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -4,8 +4,11 @@
 <title>Test for PaymentRequest shippingAddress attribute</title>
 <link rel="help" href=""
 <link rel="help" href=""
+<script src=""
+<script src=""
 <script src=""
 <script src=""
+<body>
 <script>
 setup({ explicit_done: true, explicit_timeout: true });
 const applePay = Object.freeze({
@@ -51,7 +54,7 @@
       emailAddress: '',
   };
   internals.mockPaymentCoordinator.setShippingAddress(shippingAddress);
-  promise_test(async t => {
+  user_activation_test(async t => {
     const request = new PaymentRequest(
       validMethods,
       validDetails,

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-option.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-option.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-request-change-shipping-option.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -6,8 +6,11 @@
 <title>Test for PaymentRequest shippingOption attribute</title>
 <link rel="help" href=""
 <link rel="help" href=""
+<script src=""
+<script src=""
 <script src=""
 <script src=""
+<body>
 <script>
 setup({ explicit_done: true, explicit_timeout: true });
 const applePay = Object.freeze({
@@ -47,7 +50,7 @@
 });
 
 function testShippingOptionChanged() {
-  promise_test(async t => {
+  user_activation_test(async t => {
     const detailsWithShippingOptions = Object.assign({}, validDetails, {
       shippingOptions: [validShippingOption1, validShippingOption2],
     });

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-request-show-method.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-request-show-method.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-request-show-method.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -5,8 +5,11 @@
 <meta charset="utf-8">
 <title>Test for PaymentRequest.show() method</title>
 <link rel="help" href=""
+<script src=""
+<script src=""
 <script src=""
 <script src=""
+<body>
 <script>
 'use strict';
 const applePay = Object.freeze({
@@ -40,7 +43,7 @@
 }, "Must be possible to construct a payment request");
 
 
-promise_test(async t => {
+user_activation_test(async t => {
   const request = new PaymentRequest(defaultMethods, defaultDetails);
   const acceptPromise = request.show(); // Sets state to "interactive"
   await promise_rejects(t, "InvalidStateError", request.show());
@@ -48,7 +51,7 @@
   await promise_rejects(t, "AbortError", acceptPromise);
 }, `Throws if the promise [[state]] is not "created"`);
 
-promise_test(async t => {
+user_activation_test(async t => {
   const request1 = new PaymentRequest(defaultMethods, defaultDetails);
   const request2 = new PaymentRequest(defaultMethods, defaultDetails);
   const acceptPromise1 = request1.show();
@@ -58,7 +61,7 @@
   await promise_rejects(t, "AbortError", acceptPromise1);
 }, `If the user agent's "payment request is showing" boolean is true, then return a promise rejected with an "AbortError" DOMException.`);
 
-promise_test(async t => {
+user_activation_test(async t => {
   const request = new PaymentRequest(
     [{ supportedMethods: "this-is-not-supported" }],
     defaultDetails);
@@ -66,7 +69,7 @@
   await promise_rejects(t, "NotSupportedError", acceptPromise);
 }, `If payment method consultation produces no supported method of payment, then return a promise rejected with a "NotSupportedError" DOMException.`);
 
-promise_test(async t => {
+user_activation_test(async t => {
   const request = new PaymentRequest(defaultMethods, defaultDetails);
   const acceptPromise = request.show(); // Sets state to "interactive"
   internals.mockPaymentCoordinator.cancelPayment();

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-response-complete-method.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-response-complete-method.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-response-complete-method.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -4,6 +4,8 @@
 <title>
   PaymentResponse.prototype.complete() method
 </title>
+<script src=""
+<script src=""
 <script src=""
 <script src=""
 <script src=""

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-response-methodName-attribute.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-response-methodName-attribute.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-response-methodName-attribute.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -4,6 +4,8 @@
 <title>
   PaymentResponse.prototype.methodName attribute
 </title>
+<script src=""
+<script src=""
 <script src=""
 <script src=""
 <script src=""

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-response-payerEmail-attribute.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-response-payerEmail-attribute.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-response-payerEmail-attribute.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -4,6 +4,8 @@
 <title>
   PaymentResponse.prototype.payerEmail attribute
 </title>
+<script src=""
+<script src=""
 <script src=""
 <script src=""
 <script src=""

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-response-payerName-attribute.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-response-payerName-attribute.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-response-payerName-attribute.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -4,6 +4,8 @@
 <title>
   PaymentResponse.prototype.payerName attribute
 </title>
+<script src=""
+<script src=""
 <script src=""
 <script src=""
 <script src=""

Modified: trunk/LayoutTests/http/tests/paymentrequest/payment-response-payerPhone-attribute.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/payment-response-payerPhone-attribute.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/payment-response-payerPhone-attribute.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -4,6 +4,8 @@
 <title>
   PaymentResponse.prototype.payerPhone attribute
 </title>
+<script src=""
+<script src=""
 <script src=""
 <script src=""
 <script src=""

Modified: trunk/LayoutTests/http/tests/paymentrequest/resources/helpers.js (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/resources/helpers.js	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/resources/helpers.js	2017-11-03 16:35:59 UTC (rev 224402)
@@ -98,7 +98,7 @@
       ev.complete({});
       internals.mockPaymentCoordinator.acceptPayment();
   };
-  const response = await request.show();
+  const response = await activateThen(() => request.show());
   return { request, response };
 }
 

Modified: trunk/LayoutTests/http/tests/paymentrequest/updateWith-method-pmi-handling.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/paymentrequest/updateWith-method-pmi-handling.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/paymentrequest/updateWith-method-pmi-handling.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -3,6 +3,8 @@
 <meta charset="utf-8">
 <title>Test for validity of payment method identifiers when calling updateWith() method</title>
 <link rel="help" href=""
+<script src=""
+<script src=""
 <script src=""
 <script src=""
 <script>
@@ -62,7 +64,7 @@
           countryCode: 'US',
       },
   });
-  promise_test(async t => {
+  user_activation_test(async t => {
     const request = new PaymentRequest(
       [applePay],
       validDetails,

Added: trunk/LayoutTests/http/tests/resources/payment-request.js (0 => 224402)


--- trunk/LayoutTests/http/tests/resources/payment-request.js	                        (rev 0)
+++ trunk/LayoutTests/http/tests/resources/payment-request.js	2017-11-03 16:35:59 UTC (rev 224402)
@@ -0,0 +1,20 @@
+function activateThen(completion)
+{
+    return new Promise(resolve => {
+        var button = document.createElement("button");
+        button.style["position"] = "absolute";
+        button._onclick_ = () => {
+            document.body.removeChild(button);
+            resolve(completion());
+        };
+        document.body.insertBefore(button, document.body.firstChild);
+        UIHelper.activateElement(button);
+    });
+}
+
+function user_activation_test(func, name)
+{
+    promise_test(async t => {
+        await activateThen(() => func(t));
+    }, name);
+}

Modified: trunk/LayoutTests/http/tests/ssl/applepay/ApplePayMerchantValidationEvent.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/ssl/applepay/ApplePayMerchantValidationEvent.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/ssl/applepay/ApplePayMerchantValidationEvent.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -4,6 +4,7 @@
 <meta charset="utf-8">
 <script src=""
 <script src=""
+<script src=""
 </head>
 <body>
 <script>
@@ -36,10 +37,10 @@
         var paymentRequest = new PaymentRequest([validPaymentMethod()], validPaymentDetails());
         paymentRequest._onapplepayvalidatemerchant_ = (event) => {
             test(event, paymentRequest);
-            paymentRequest.abort();
+            paymentRequest.abort().catch(() => {});
             resolve();
         };
-        paymentRequest.show().catch(() => {});
+        activateThen(() => paymentRequest.show().catch(() => {}));
     });
 }
 

Modified: trunk/LayoutTests/http/tests/ssl/applepay/ApplePayPaymentMethodUpdateEvent.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/ssl/applepay/ApplePayPaymentMethodUpdateEvent.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/ssl/applepay/ApplePayPaymentMethodUpdateEvent.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -4,6 +4,7 @@
 <meta charset="utf-8">
 <script src=""
 <script src=""
+<script src=""
 </head>
 <body>
 <script>
@@ -62,9 +63,11 @@
         document.querySelector("button").remove();
         finishJSTest();
     };
-    
-    paymentRequest.show();
-    internals.mockPaymentCoordinator.changePaymentMethod(expectedPaymentMethod);
+
+    activateThen(() => {
+        paymentRequest.show();
+        internals.mockPaymentCoordinator.changePaymentMethod(expectedPaymentMethod);
+    });
 }
 
 window._onload_ = function() {

Modified: trunk/LayoutTests/http/tests/ssl/applepay/PaymentRequest.https.html (224401 => 224402)


--- trunk/LayoutTests/http/tests/ssl/applepay/PaymentRequest.https.html	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/http/tests/ssl/applepay/PaymentRequest.https.html	2017-11-03 16:35:59 UTC (rev 224402)
@@ -2,7 +2,9 @@
 <html>
 <head>
 <meta charset="utf-8">
-<script src=""
+<script src=""
+<script src=""
+<script src=""
 </head>
 <body>
 <script>
@@ -31,23 +33,20 @@
 }
 
 function logAndShouldThrow(setup, test) {
-    debug("SETUP: " + setup)
-    eval(setup)
-    shouldThrow(test)
-    debug("")
+    return activateThen(() => {
+        debug("SETUP: " + setup);
+        eval(setup);
+        shouldThrow(test);
+        debug("");
+    });
 }
 
-function logAndShouldNotThrow(setup, test) {
-    debug("SETUP: " + setup)
-    eval(setup)
-    shouldNotThrow(test)
-    debug("")
-}
-
 function logAndShouldReject(setup, test) {
-    debug("SETUP: " + setup)
-    eval(setup)
-    return shouldReject(test)
+    return activateThen(() => {
+        debug("SETUP: " + setup)
+        eval(setup)
+        return shouldReject(test)
+    });
 }
 
 async function go() {
@@ -145,59 +144,59 @@
 
     debug("Testing PaymentDetails.total")
     debug("")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); delete paymentDetails.total;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = '';", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = null;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = undefined;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = 7;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = [];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = { };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = { label: 'label' };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = { label: 'label', amount: 'amount' };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = { label: 'label', amount: { currency: '', value: '0' } };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); delete paymentDetails.total;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = '';", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = null;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = undefined;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = 7;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = [];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = { };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = { label: 'label' };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = { label: 'label', amount: 'amount' };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = { label: 'label', amount: { currency: '', value: '0' } };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
     await logAndShouldReject("paymentDetails = validPaymentDetails(); paymentDetails.total = { label: 'label', amount: { currency: 'USD', value: '0' } };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
     debug("")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = { label: 'label', amount: { currency: 'USD', value:'-10.00'} };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.total = { label: 'label', amount: { currency: 'USD', value:'-10.00'} };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
     await logAndShouldReject("paymentDetails = validPaymentDetails(); paymentDetails.total = { label: 'label', amount: { currency: 'USD', value: '10000000000.00' } };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
     debug("")
 
     debug("Testing PaymentDetails.displayItems")
     debug("");
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = '';", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = null;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = 7;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = { };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [''];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [null];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [undefined];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{}];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label', amount: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label', amount: '10.00', type: 'invalid' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = '';", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = null;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = 7;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = { };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [''];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [null];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [undefined];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{}];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label', amount: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label', amount: '10.00', type: 'invalid' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
     await logAndShouldReject("paymentDetails = validPaymentDetails(); paymentDetails.displayItems = [{ label: 'label', amount: { currency: 'EUR', value: '10.00' } }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
 
     debug("Testing PaymentDetails.shippingOptions")
     debug("");
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = '';", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = 'invalid';", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = null;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = 7;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = { };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '', }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '', detail: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '', detail: '', identifier: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '', detail: '', identifier: '', label: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
-    logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '-1', detail: '', identifier: '', label: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = '';", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = 'invalid';", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = null;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = 7;", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = { };", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '', }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '', detail: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '', detail: '', identifier: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '', detail: '', identifier: '', label: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
+    await logAndShouldThrow("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: '-1', detail: '', identifier: '', label: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
     await logAndShouldReject("paymentDetails = validPaymentDetails(); paymentDetails.shippingOptions = [{ amount: { currency: 'EUR', value: '10.00' }, id: '', label: '' }];", "request = new PaymentRequest([validPaymentMethod()], paymentDetails); request.show()")
 
     debug("Testing PaymentOptions")
     debug("");
-    logAndShouldThrow("paymentOptions = {}; paymentOptions.shippingType = '';", "new PaymentRequest([validPaymentMethod()], validPaymentDetails(), paymentOptions); request.show()")
-    logAndShouldThrow("paymentOptions = {}; paymentOptions.shippingType = 'invalid';", "new PaymentRequest([validPaymentMethod()], validPaymentDetails(), paymentOptions); request.show()")
-    logAndShouldThrow("paymentOptions = {}; paymentOptions.shippingType = null;", "new PaymentRequest([validPaymentMethod()], validPaymentDetails(), paymentOptions); request.show()")
-    logAndShouldThrow("paymentOptions = {}; paymentOptions.shippingType = 7;", "new PaymentRequest([validPaymentMethod()], validPaymentDetails(), paymentOptions); request.show()")
-    logAndShouldThrow("paymentOptions = {}; paymentOptions.shippingType = { };", "new PaymentRequest([validPaymentMethod()], validPaymentDetails(), paymentOptions); request.show()")
+    await logAndShouldThrow("paymentOptions = {}; paymentOptions.shippingType = '';", "new PaymentRequest([validPaymentMethod()], validPaymentDetails(), paymentOptions); request.show()")
+    await logAndShouldThrow("paymentOptions = {}; paymentOptions.shippingType = 'invalid';", "new PaymentRequest([validPaymentMethod()], validPaymentDetails(), paymentOptions); request.show()")
+    await logAndShouldThrow("paymentOptions = {}; paymentOptions.shippingType = null;", "new PaymentRequest([validPaymentMethod()], validPaymentDetails(), paymentOptions); request.show()")
+    await logAndShouldThrow("paymentOptions = {}; paymentOptions.shippingType = 7;", "new PaymentRequest([validPaymentMethod()], validPaymentDetails(), paymentOptions); request.show()")
+    await logAndShouldThrow("paymentOptions = {}; paymentOptions.shippingType = { };", "new PaymentRequest([validPaymentMethod()], validPaymentDetails(), paymentOptions); request.show()")
 
     document.querySelector("button").remove();
 

Modified: trunk/LayoutTests/resources/ui-helper.js (224401 => 224402)


--- trunk/LayoutTests/resources/ui-helper.js	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/LayoutTests/resources/ui-helper.js	2017-11-03 16:35:59 UTC (rev 224402)
@@ -47,6 +47,13 @@
         });
     }
 
+    static activateElement(element)
+    {
+        const x = element.offsetLeft + element.offsetWidth / 2;
+        const y = element.offsetTop + element.offsetHeight / 2;
+        return UIHelper.activateAt(x, y);
+    }
+
     static keyDown(key)
     {
         if (!this.isWebKit2() || !this.isIOS()) {

Modified: trunk/Source/WebCore/ChangeLog (224401 => 224402)


--- trunk/Source/WebCore/ChangeLog	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/Source/WebCore/ChangeLog	2017-11-03 16:35:59 UTC (rev 224402)
@@ -1,3 +1,15 @@
+2017-11-02  Andy Estes  <aes...@apple.com>
+
+        [Payment Request] show() should only be called with user activation
+        https://bugs.webkit.org/show_bug.cgi?id=179056
+
+        Reviewed by Sam Weinig.
+
+        Updated existing tests to call PaymentRequest.show() with user activation.
+
+        * Modules/paymentrequest/PaymentRequest.cpp:
+        (WebCore::PaymentRequest::show):
+
 2017-11-03  Daniel Bates  <daba...@apple.com>
 
         Invalidate node list when associated form control element is removed

Modified: trunk/Source/WebCore/Modules/paymentrequest/PaymentRequest.cpp (224401 => 224402)


--- trunk/Source/WebCore/Modules/paymentrequest/PaymentRequest.cpp	2017-11-03 16:33:58 UTC (rev 224401)
+++ trunk/Source/WebCore/Modules/paymentrequest/PaymentRequest.cpp	2017-11-03 16:35:59 UTC (rev 224402)
@@ -382,8 +382,10 @@
 // https://www.w3.org/TR/payment-request/#show()-method
 void PaymentRequest::show(Document& document, ShowPromise&& promise)
 {
-    // FIXME: Reject promise with SecurityError if show() was not triggered by a user gesture.
-    // Find a way to do this without breaking the payment-request web platform tests.
+    if (!UserGestureIndicator::processingUserGesture()) {
+        promise.reject(Exception { SecurityError, "show() must be triggered by user activation." });
+        return;
+    }
 
     if (m_state != State::Created) {
         promise.reject(Exception { InvalidStateError });
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to