| <!DOCTYPE html> | |
| <!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --> | |
| <meta charset="utf-8"> | |
| <title>Test for PaymentRequest.abort() method</title> | |
| <link rel="help" href="https://w3c.github.io/browser-payment-api/#abort-method"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script> | |
| "use strict"; | |
| setup(() => {}, { | |
| // Ignore unhandled rejections resulting from .show()'s acceptPromise | |
| // not being explicitly handled. | |
| allow_uncaught_exception: true, | |
| }); | |
| const basicCard = Object.freeze({ supportedMethods: "basic-card" }); | |
| const defaultMethods = Object.freeze([basicCard]); | |
| 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(t, "InvalidStateError", request.abort()); | |
| }, `Throws if the promise [[state]] is not "interactive"`); | |
| promise_test(async t => { | |
| // request is in "created" state. | |
| const request = new PaymentRequest(defaultMethods, defaultDetails); | |
| await promise_rejects(t, "InvalidStateError", request.abort()); | |
| // Call it again, for good measure. | |
| await promise_rejects(t, "InvalidStateError", request.abort()); | |
| // The request's state is "created", so let's show it | |
| // which changes the state to "interactive.". | |
| request.show(); | |
| // Let's set request the state to "closed" by calling .abort() | |
| try { | |
| await request.abort(); | |
| } catch (err) { | |
| assert_true(false, "Unexpected promise rejection: " + err.message); | |
| } | |
| // The request is now "closed", so... | |
| await promise_rejects(t, "InvalidStateError", request.abort()); | |
| }, `Calling abort must not change the [[state]] until after "interactive"`); | |
| promise_test(async t => { | |
| const request = new PaymentRequest(defaultMethods, defaultDetails); | |
| const acceptPromise = request.show(); | |
| try { | |
| await request.abort(); | |
| } catch (err) { | |
| assert_true(false, "Unexpected promise rejection: " + err.message); | |
| } | |
| await promise_rejects(t, "AbortError", acceptPromise); | |
| // As request is now "closed", trying to show it will fail | |
| await promise_rejects(t, "InvalidStateError", request.show()); | |
| }, "calling .abort() causes acceptPromise to reject and closes the request."); | |
| </script> |