| <!DOCTYPE html> | |
| <meta charset="utf-8" /> | |
| <title>Test for PaymentRequest.abort() method</title> | |
| <link rel="help" href="https://w3c.github.io/payment-request/#abort-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({ | |
| // Ignore unhandled rejections resulting from .show()'s acceptPromise | |
| // not being explicitly handled. | |
| allow_uncaught_exception: true, | |
| explicit_timeout: true, | |
| }); | |
| const basicCard = Object.freeze({ supportedMethods: "basic-card" }); | |
| const applePay = Object.freeze({ | |
| supportedMethods: "https://apple.com/apple-pay", | |
| data: { | |
| version: 3, | |
| merchantIdentifier: "merchant.com.example", | |
| countryCode: "US", | |
| merchantCapabilities: ["supports3DS"], | |
| supportedNetworks: ["visa"], | |
| }, | |
| }); | |
| const defaultMethods = Object.freeze([basicCard, applePay]); | |
| const defaultDetails = Object.freeze({ | |
| total: { | |
| label: "Total", | |
| amount: { | |
| currency: "USD", | |
| value: "1.00", | |
| }, | |
| }, | |
| }); | |
| promise_test(async t => { | |
| // request is in "created" state | |
| const request = new PaymentRequest(defaultMethods, defaultDetails); | |
| await promise_rejects_dom(t, "InvalidStateError", request.abort()); | |
| }, `Throws if the promise [[state]] is not "interactive"`); | |
| promise_test(async t => { | |
| const request = new PaymentRequest(defaultMethods, defaultDetails); | |
| const promises = new Set([ | |
| request.abort(), | |
| request.abort(), | |
| request.abort(), | |
| ]); | |
| assert_equals(promises.size, 3, "Must have three unique objects"); | |
| }, "Calling abort() multiple times is always a new object."); | |
| promise_test(async t => { | |
| const request = new PaymentRequest(defaultMethods, defaultDetails); | |
| await test_driver.bless("show payment request"); | |
| const acceptPromise = request.show(); | |
| await request.abort(); | |
| await promise_rejects_dom(t, "AbortError", acceptPromise); | |
| // As request is now "closed", trying to show it will fail | |
| await test_driver.bless("show payment request"); | |
| await promise_rejects_dom(t, "InvalidStateError", request.show()); | |
| }, "The same request cannot be shown multiple times."); | |
| promise_test(async t => { | |
| // request is in "created" state. | |
| const request = new PaymentRequest(defaultMethods, defaultDetails); | |
| await promise_rejects_dom(t, "InvalidStateError", request.abort()); | |
| // Call it again, for good measure. | |
| await promise_rejects_dom(t, "InvalidStateError", request.abort()); | |
| // The request's state is "created", so let's show it | |
| // which changes the state to "interactive.". | |
| await test_driver.bless("show payment request"); | |
| const acceptPromise = request.show(); | |
| // Let's set request the state to "closed" by calling .abort() | |
| await request.abort(); | |
| // The request is now "closed", so... | |
| await promise_rejects_dom(t, "InvalidStateError", request.abort()); | |
| await promise_rejects_dom(t, "AbortError", acceptPromise); | |
| }, "Aborting a request before it is shown doesn't prevent it from being shown later."); | |
| </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> |