<!DOCTYPE html> <meta charset="utf-8" /> <title>Test for PaymentRequest.show() method</title> <link rel="help" href="https://w3c.github.io/payment-request/#show-method" /> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> <script> "use strict"; setup({ allow_uncaught_exception: true }); const defaultMethods = Object.freeze([ { supportedMethods: "basic-card" }, { supportedMethods: "https://apple.com/apple-pay", data: { version: 3, merchantIdentifier: "merchant.com.example", countryCode: "US", merchantCapabilities: ["supports3DS"], supportedNetworks: ["visa"], }, }, ]); const defaultDetails = Object.freeze({ total: { label: "Total", amount: { currency: "USD", value: "1.00", }, }, }); promise_test(async (t) => { const request = new PaymentRequest(defaultMethods, defaultDetails); const acceptPromise = request.show(); await promise_rejects_dom(t, "SecurityError", acceptPromise); }, `Calling show() without being triggered by user interaction throws`); promise_test(async (t) => { const request = new PaymentRequest(defaultMethods, defaultDetails); await promise_rejects_dom(t, "SecurityError", request.show()); await test_driver.bless(); // Sets state to "interactive", but consumes user interaction. const acceptPromise = request.show(); await promise_rejects_dom(t, "SecurityError", request.show()); // With user activation, but already showing the sheet... await test_driver.bless(); await promise_rejects_dom(t, "InvalidStateError", request.show()); await request.abort(); await promise_rejects_dom(t, "AbortError", acceptPromise); }, "Throws if the promise [[state]] is not 'created'."); promise_test(async (t) => { const request1 = new PaymentRequest(defaultMethods, defaultDetails); await test_driver.bless(); const acceptPromise1 = request1.show(); // User activation consumed, so... const request2 = new PaymentRequest(defaultMethods, defaultDetails); await promise_rejects_dom(t, "SecurityError", request2.show()); // Payment request already showing, so... await test_driver.bless(); await promise_rejects_dom(t, "AbortError", request2.show()); await request1.abort(); await promise_rejects_dom(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) => { const request = new PaymentRequest( [{ supportedMethods: "this-is-not-supported" }], defaultDetails ); await test_driver.bless(); const acceptPromise = request.show(); await promise_rejects_dom(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) => { const request = new PaymentRequest(defaultMethods, defaultDetails); await test_driver.bless(); const p1 = request.show(); await test_driver.bless(); const p2 = request.show(); await test_driver.bless(); const p3 = request.show(); await request.abort(); const promises = new Set([p1, p2, p3]); assert_equals(promises.size, 3, "Must have three unique objects"); await promise_rejects_dom(t, "AbortError", p1); await promise_rejects_dom(t, "InvalidStateError", p2); await promise_rejects_dom(t, "InvalidStateError", p3); }, "Calling show() multiple times always returns a new promise."); </script> <small> If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a> and tag one of the <a href="https://github.com/web-platform-tests/wpt/blob/master/payment-request/META.yml" >suggested reviewers</a >. </small>