| <!DOCTYPE html> | |
| <!-- Copyright © 2017 Mozilla and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --> | |
| <meta charset="utf-8"> | |
| <title>Test for validity of payment method identifiers when calling updateWith() method</title> | |
| <link rel="help" href="https://www.w3.org/TR/payment-request/#updatewith()-method"> | |
| <script src="/js-test-resources/ui-helper.js"></script> | |
| <script src="/resources/payment-request.js"></script> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script> | |
| "use strict"; | |
| setup({ explicit_done: true, explicit_timeout: true }); | |
| const validMethod = Object.freeze({ | |
| supportedMethods: "https://:@wpt.fyi:443/payment-request", | |
| }); | |
| const validMethods = Object.freeze([validMethod]); | |
| const validAmount = Object.freeze({ | |
| currency: "USD", | |
| value: "1.0", | |
| }); | |
| const validTotal = Object.freeze({ | |
| label: "Default Total", | |
| amount: validAmount, | |
| }); | |
| const validShippingOption = Object.freeze({ | |
| id: "standard", | |
| label: "Shipping option", | |
| amount: validAmount, | |
| selected: true, | |
| }); | |
| const validDetails = Object.freeze({ | |
| total: validTotal, | |
| shippingOptions: [validShippingOption], | |
| }); | |
| const validModifier = Object.freeze({ | |
| supportedMethods: "basic-card", | |
| total: validTotal, | |
| }); | |
| test(() => { | |
| try { | |
| new PaymentRequest(validMethods, validDetails); | |
| } catch (err) { | |
| done(); | |
| throw err; | |
| } | |
| }, "smoke test"); | |
| function runTest(button, { invalidMethod }) { | |
| button.disabled = true; | |
| const applePay = Object.freeze({ | |
| supportedMethods: "https://apple.com/apple-pay", | |
| data: { | |
| version: 2, | |
| merchantIdentifier: '', | |
| merchantCapabilities: ['supports3DS'], | |
| supportedNetworks: ['visa', 'masterCard'], | |
| countryCode: 'US', | |
| }, | |
| }); | |
| user_activation_test(async t => { | |
| const request = new PaymentRequest( | |
| [applePay], | |
| validDetails, | |
| { requestShipping: true } | |
| ); | |
| request.onmerchantvalidation = event => { | |
| event.complete({ }); | |
| }; | |
| const listener = ev => { | |
| const invalidModifier = Object.assign({}, validModifier, { | |
| supportedMethods: invalidMethod, | |
| }); | |
| const invalidDetails = Object.assign({}, validDetails, { | |
| modifiers: [validModifier, invalidModifier], | |
| }); | |
| ev.updateWith(invalidDetails); | |
| }; | |
| // We test against a valid and an invalid modifier | |
| request.onshippingaddresschange = listener; | |
| // request.addEventListener("shippingaddresschange", listener, { once: true }); | |
| const showPromise = request.show(); | |
| await promise_rejects_js(t, RangeError, showPromise); | |
| }, button.textContent.trim()); | |
| } | |
| </script> | |
| <ol> | |
| <li> | |
| <button id="button1"> | |
| Must throw if the URL has a password. | |
| </button> | |
| </li> | |
| <li> | |
| <button id="button2"> | |
| Must throw if the URL has a username. | |
| </button> | |
| </li> | |
| <li> | |
| <button id="button3"> | |
| Must throw if the URL has a username and a password. | |
| </button> | |
| </li> | |
| <li> | |
| <button id="button4"> | |
| Must throw if it's http, and has a username and password. | |
| </button> | |
| </li> | |
| <li> | |
| <button id="button5"> | |
| Must throw if the URL is invalid (port range). | |
| </button> | |
| </li> | |
| <li> | |
| <button id="button6"> | |
| Must throw if the PMI contains characters that are out of range. | |
| </button> | |
| </li> | |
| <li> | |
| <button id="button7"> | |
| Must throw if not https. | |
| </button> | |
| </li> | |
| <li> | |
| <button id="button8"> | |
| Must throw if the standardized PMI contains characters outside the ascii range. | |
| </button> | |
| </li> | |
| <li> | |
| <button id="button9"> | |
| Must throw if standardized PMI has uppercase characters. | |
| </button> | |
| </li> | |
| </ol> | |
| <script> | |
| async function runTests() | |
| { | |
| await runTest(document.getElementById("button1"), {invalidMethod: 'https://:password@example.com'}); | |
| await runTest(document.getElementById("button2"), {invalidMethod: 'https://username@example.com'}); | |
| await runTest(document.getElementById("button3"), {invalidMethod: 'https://username:password@example.com/pay'}); | |
| await runTest(document.getElementById("button4"), {invalidMethod: 'http://username:password@example.com/pay'}); | |
| await runTest(document.getElementById("button5"), {invalidMethod: 'http://foo.com:100000000/pay'}); | |
| await runTest(document.getElementById("button6"), {invalidMethod: 'basic-💳'}); | |
| await runTest(document.getElementById("button7"), {invalidMethod: 'not-https://wpt.fyi/payment-request'}); | |
| await runTest(document.getElementById("button8"), {invalidMethod: '¡basic-*-card!'}); | |
| await runTest(document.getElementById("button9"), {invalidMethod: 'Basic-Card'}); | |
| done(); | |
| } | |
| runTests(); | |
| </script> |