| <!DOCTYPE html> | |
| <!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --> | |
| <!-- Copyright (C) 2017 Apple Inc. All rights reserved. --> | |
| <!-- FIXME: Upstream this test to web-platform-tests/payment-request/. --> | |
| <meta charset="utf-8"> | |
| <title>Test for PaymentRequest shippingOption attribute</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="/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> | |
| <body> | |
| <script> | |
| setup({ explicit_done: true, explicit_timeout: true }); | |
| const applePay = Object.freeze({ | |
| supportedMethods: "https://apple.com/apple-pay", | |
| data: { | |
| version: 2, | |
| merchantIdentifier: '', | |
| merchantCapabilities: ['supports3DS'], | |
| supportedNetworks: ['visa', 'masterCard'], | |
| countryCode: 'US', | |
| }, | |
| }); | |
| const validMethods = Object.freeze([applePay]); | |
| const validAmount = Object.freeze({ currency: "USD", value: "5.00" }); | |
| const validTotal = Object.freeze({ | |
| label: "label", | |
| amount: validAmount, | |
| }); | |
| const validDetails = Object.freeze({ total: validTotal }); | |
| const validShippingOption1 = Object.freeze({ | |
| id: "valid-1", | |
| label: "PICK ME!", | |
| amount: validAmount, | |
| selected: false, | |
| }); | |
| const validShippingOption2 = Object.freeze({ | |
| id: "initially-selected", | |
| label: "Valid shipping option 2", | |
| amount: validAmount, | |
| selected: true, | |
| }); | |
| const requestShipping = Object.freeze({ | |
| requestShipping: true, | |
| }); | |
| function testShippingOptionChanged() { | |
| user_activation_test(async t => { | |
| const detailsWithShippingOptions = Object.assign({}, validDetails, { | |
| shippingOptions: [validShippingOption1, validShippingOption2], | |
| }); | |
| const request = new PaymentRequest( | |
| validMethods, | |
| detailsWithShippingOptions, | |
| requestShipping | |
| ); | |
| request.onmerchantvalidation = event => { | |
| event.complete({ }); | |
| internals.mockPaymentCoordinator.changeShippingOption("valid-1"); | |
| }; | |
| assert_equals( | |
| request.shippingOption, | |
| "initially-selected", | |
| "Must be 'initially-selected', as the selected member is true" | |
| ); | |
| const listenerPromise = new Promise(resolve => { | |
| request.addEventListener("shippingoptionchange", () => { | |
| resolve(request.shippingOption); | |
| }); | |
| }); | |
| const handlerPromise = new Promise(resolve => { | |
| request.onshippingoptionchange = (event) => { | |
| event.updateWith({}); | |
| resolve(request.shippingOption); | |
| }; | |
| }); | |
| request.show().catch(err => err); | |
| const results = await Promise.all([listenerPromise, handlerPromise]); | |
| assert_true( | |
| results.every(result => result === "valid-1"), | |
| "Expected valid-1 as the shippingOption" | |
| ); | |
| await request.abort(); | |
| }); | |
| done(); | |
| } | |
| testShippingOptionChanged(); | |
| </script> |