| <!DOCTYPE html> | |
| <meta charset="utf-8" /> | |
| <title>Test for PaymentRequest shippingOption dynamic updating</title> | |
| <link | |
| rel="help" | |
| href="https://w3c.github.io/payment-request/#shippingoption-attribute" | |
| /> | |
| <link | |
| rel="help" | |
| href="https://w3c.github.io/payment-request/#onshippingoptionchange-attribute" | |
| /> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script> | |
| setup({ explicit_done: true, explicit_timeout: true }); | |
| const validMethod = Object.freeze({ supportedMethods: "basic-card" }); | |
| const applePayMethod = { | |
| supportedMethods: "https://apple.com/apple-pay", | |
| data: { | |
| version: 3, | |
| merchantIdentifier: "merchant.com.example", | |
| countryCode: "US", | |
| merchantCapabilities: ["supports3DS"], | |
| supportedNetworks: ["visa"], | |
| }, | |
| }; | |
| const validMethods = Object.freeze([validMethod, applePayMethod]); | |
| const validAmount = Object.freeze({ currency: "USD", value: "5.00" }); | |
| const validTotal = Object.freeze({ | |
| label: "label", | |
| amount: validAmount, | |
| }); | |
| const validDetails = Object.freeze({ total: validTotal }); | |
| const initialValidShippingOption = Object.freeze({ | |
| id: "default-method", | |
| label: "Default shipping method", | |
| amount: validAmount, | |
| selected: true, | |
| }); | |
| const validDynamicShippingOption = Object.freeze({ | |
| id: "dynamically-added-id", | |
| label: "Dynamically added shipping option", | |
| amount: validAmount, | |
| selected: false, | |
| }); | |
| const requestShipping = Object.freeze({ | |
| requestShipping: true, | |
| }); | |
| function testShippingOptionChanged() { | |
| promise_test(async (t) => { | |
| const detailsWithShippingOptions = { | |
| ...validDetails, | |
| shippingOptions: [initialValidShippingOption], | |
| }; | |
| const request = new PaymentRequest( | |
| validMethods, | |
| detailsWithShippingOptions, | |
| requestShipping | |
| ); | |
| const shippingAddressChangeListener = new Promise((resolve) => { | |
| request.addEventListener( | |
| "shippingaddresschange", | |
| (ev) => { | |
| // resolve(request.shippingOption); | |
| ev.updateWith({ | |
| shippingOptions: [ | |
| initialValidShippingOption, | |
| validDynamicShippingOption, | |
| ], | |
| }); | |
| resolve(); | |
| }, | |
| { once: true } | |
| ); | |
| }); | |
| const handlerPromise = new Promise((resolve) => { | |
| request.onshippingoptionchange = () => { | |
| resolve(request.shippingOption); | |
| }; | |
| }); | |
| request.show().catch((err) => err); | |
| const results = await Promise.all([ | |
| shippingAddressChangeListener, | |
| handlerPromise, | |
| ]); | |
| assert_true( | |
| results[1] === "dynamically-added-id", | |
| "Expected dynamically-added-id as the shippingOption" | |
| ); | |
| await request.abort(); | |
| }); | |
| } | |
| </script> | |
| <h2>PaymentRequest shippingOption attribute</h2> | |
| <p> | |
| Click on each button in sequence from top to bottom without refreshing the | |
| page. Each button (except the 'Done' button) will bring up the Payment Request | |
| UI window. | |
| </p> | |
| <ol> | |
| <li> | |
| When the payment sheet is presented, view options for Shipping Method. There | |
| should only be one: "Default shipping method" | |
| </li> | |
| <li> | |
| Change your Shipping Address - either update your existing one by changing | |
| something (name, address, etc), or select a different Shipping Address, or | |
| add a new Shipping Address and select it. | |
| </li> | |
| <li> | |
| Go back to Shipping Method, and there is now an option called "Dynamically | |
| added shipping option". Select it | |
| </li> | |
| <li> | |
| Click on the 'Done' button | |
| </li> | |
| </ol> | |
| <ul> | |
| <li> | |
| <button onclick="testShippingOptionChanged()"> | |
| When the address is changed, shipping methods can be updated | |
| </button> | |
| </li> | |
| <li> | |
| <button onclick="done()">Done</button> | |
| </li> | |
| </ul> | |
| <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> |