Revision 654dc43664f0ff6b84609d334cb05147c0594fbd authored by Robert Ma on 16 March 2018, 00:32:55 UTC, committed by Robert Ma on 16 March 2018, 17:02:47 UTC
ChromeDriver doesn't honor PATH and uses /opt/google/chrome/chrome by
default (which is usually the stable channel), so we need to explicitly
pass the desired binary path to wpt run (which in turn passes to
chromedriver via capabilities) in Travis CI (both stability check and
infrastructure test).
1 parent 89ba944
Raw File
payment-request-abort-method-manual.https.html
<!DOCTYPE html>
<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,
  explicit_done: true,
  explicit_timeout: 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"`);

function manualTest1(elem){
  elem.disabled = true;
  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.".
    const acceptPromise = request.show();
    // Let's set request the state to "closed" by calling .abort()
    try {
      await request.abort();
    } catch (err) {
      assert_unreached("Unexpected promise rejection: " + err.message);
    }
    // The request is now "closed", so...
    await promise_rejects(t, "InvalidStateError", request.abort());
    await promise_rejects(t, "AbortError", acceptPromise);
  }, elem.textContent.trim());
}

function manualTest2(elem){
  elem.disabled = true;
  promise_test(async t => {
    const request = new PaymentRequest(defaultMethods, defaultDetails);
    const acceptPromise = request.show();
    try {
      await request.abort();
    } catch (err) {
      assert_unreached("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());
  }, elem.textContent.trim());
  done();
}
</script>

<h2>Test for PaymentRequest.abort() method</h2>
<p>
  Click on each button in sequence from top to bottom without refreshing the page.
  No payment sheet will be shown, but the tests will run in the background.
</p>
<ol>
  <li>
    <button onclick="manualTest1(this)">
      Calling abort must not change the [[state]] until after "interactive".
    </button>
  </li>
  <li>
    <button onclick="manualTest2(this)">
      Calling .abort() causes acceptPromise to reject and closes the request.
    </button>
  </li>
</ol>
<small>
  If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
  and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
</small>
back to top