diff --git a/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method-protection.https.html b/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method-protection.https.html
new file mode 100644
index 000000000000..b0582d520d30
--- /dev/null
+++ b/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method-protection.https.html
@@ -0,0 +1,56 @@
+
+
+
Tests for PaymentRequest.canMakePayment() method
+
+
+
+
+
+
+
+
+ If you find a buggy test, please file a bug
+ and tag one of the suggested reviewers.
+
diff --git a/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method.https.html b/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method.https.html
index 2943c2da688f..03a9c19fb8fd 100644
--- a/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method.https.html
+++ b/testing/web-platform/tests/payment-request/payment-request-canmakepayment-method.https.html
@@ -20,6 +20,56 @@ const defaultDetails = Object.freeze({
},
});
+promise_test(async t => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ assert_true(await request.canMakePayment(), "one of the methods should be supported");
+}, `If payment method identifier and serialized parts are supported, resolve promise with true.`);
+
+promise_test(async t => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ const acceptPromise = test_driver.bless("show payment request", () => {
+ request.show() // Sets state to "interactive"
+ });
+ const canMakePaymentPromise = request.canMakePayment();
+ try {
+ const result = await canMakePaymentPromise;
+ assert_true(
+ false,
+ `canMakePaymentPromise should have thrown InvalidStateError`
+ );
+ } catch (err) {
+ await promise_rejects(t, "InvalidStateError", canMakePaymentPromise);
+ } finally {
+ await request.abort();
+ await promise_rejects(t, "AbortError", acceptPromise);
+ }
+ // The state should be "closed"
+ 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 => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ const acceptPromise = test_driver.bless("show payment request", () => {
+ request.show() // Sets state to "interactive"
+ });
+ acceptPromise.catch(() => {}); // no-op, just to silence unhandled rejection in devtools.
+ await request.abort(); // The state is now "closed"
+ await promise_rejects(t, "InvalidStateError", request.canMakePayment());
+ try {
+ const result = await request.canMakePayment();
+ assert_true(
+ false,
+ `should have thrown InvalidStateError, but instead returned "${result}"`
+ );
+ } catch (err) {
+ assert_equals(
+ err.name,
+ "InvalidStateError",
+ "must be an InvalidStateError."
+ );
+ }
+}, 'If request.[[state]] is "closed", then return a promise rejected with an "InvalidStateError" DOMException.');
+
promise_test(async t => {
const request = new PaymentRequest(defaultMethods, defaultDetails);
try {
@@ -40,11 +90,6 @@ promise_test(async t => {
}
}, `If request.[[state]] is "created", then return a promise that resolves to true for known method.`);
-promise_test(async t => {
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- assert_true(await request.canMakePayment(), "one of the methods should be supported");
-}, `If payment method identifier and serialized parts are supported, resolve promise with true.`);
-
promise_test(async t => {
const unsupportedMethods = [
"this-is-not-supported",
@@ -92,81 +137,6 @@ promise_test(async t => {
}
}
}, `If payment method identifier is unknown, resolve promise with false.`);
-
-promise_test(async t => {
- // This test might never actually hit its assertion, but that's allowed.
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- for (let i = 0; i < 1000; i++) {
- try {
- await request.canMakePayment();
- } catch (err) {
- assert_equals(
- err.name,
- "NotAllowedError",
- "if it throws, then it must be a NotAllowedError."
- );
- break;
- }
- }
- for (let i = 0; i < 1000; i++) {
- try {
- await new PaymentRequest(defaultMethods, defaultDetails).canMakePayment();
- } catch (err) {
- assert_equals(
- err.name,
- "NotAllowedError",
- "if it throws, then it must be a NotAllowedError."
- );
- break;
- }
- }
-}, `Optionally, at the user agent's discretion, return a promise rejected with a "NotAllowedError" DOMException.`);
-
-promise_test(async t => {
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- const acceptPromise = test_driver.bless("show payment request", () => {
- request.show() // Sets state to "interactive"
- });
- const canMakePaymentPromise = request.canMakePayment();
- try {
- const result = await canMakePaymentPromise;
- assert_true(
- false,
- `canMakePaymentPromise should have thrown InvalidStateError`
- );
- } catch (err) {
- await promise_rejects(t, "InvalidStateError", canMakePaymentPromise);
- } finally {
- await request.abort();
- await promise_rejects(t, "AbortError", acceptPromise);
- }
- // The state should be "closed"
- 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 => {
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- const acceptPromise = test_driver.bless("show payment request", () => {
- request.show() // Sets state to "interactive"
- });
- acceptPromise.catch(() => {}); // no-op, just to silence unhandled rejection in devtools.
- await request.abort(); // The state is now "closed"
- await promise_rejects(t, "InvalidStateError", request.canMakePayment());
- try {
- const result = await request.canMakePayment();
- assert_true(
- false,
- `should have thrown InvalidStateError, but instead returned "${result}"`
- );
- } catch (err) {
- assert_equals(
- err.name,
- "InvalidStateError",
- "must be an InvalidStateError."
- );
- }
-}, 'If request.[[state]] is "closed", then return a promise rejected with an "InvalidStateError" DOMException.');
-