<!doctype html>
<meta charset=utf-8>
<title>Dispatching PaymentRequestUpdateEvent for "payerdetailschange"</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="helpers.js"></script>
<script>
function runTest(button) {
  button.disabled = true;
  promise_test(async t => {
    const response = await getPaymentResponse({ requestPayerName: true });
    const eventPromise = new Promise((_, reject) => {
      response.addEventListener("payerdetailchange", ev => {
        // [[waitForUpdate]] becomes true...
        ev.updateWith({});
        // So calling it again throws "InvalidStateError".
        try {
          ev.updateWith({});
        } catch (err) {
          reject(err);
        }
      });
    });
    await response.retry({
      payer: { name: "Change me!" },
    });
    await promise_rejects_dom(t, "InvalidStateError", eventPromise);
    await response.complete("success");
  }, button.textContent.trim());
}
</script>
<h2>Handling PaymentResponse.prototype.onpayerdetailchange events</h2>
<p>
  The test brings up the Payment Request UI window.
  When shown the payment sheet, use any details and hit pay.
</p>
<p>
  When asked to retry the payment:
</p>
<ol>
  <li>
    <p>
      Change payer's name to anything.
    </p>
    <button onclick="runTest(this);">
      Calling PaymentRequestUpdateEvent updateWith() twice throws an "InvalidStateError".
    </button>
  </li>
  <li>
    <button onclick="done();">DONE!</button>
  </li>
</ol>
<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">owners</a>.
</small>
