<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1490698
-->
<head>
  <meta charset="utf-8">
  <title>Test for retry PaymentRequest</title>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="application/javascript" src="DefaultData.js"></script>
  <script type="application/javascript">

  "use strict";
  SimpleTest.waitForExplicitFinish();

  const gUrl = SimpleTest.getTestFileURL('Bug1490698ChromeScript.js');
  const gScript = SpecialPowers.loadChromeScript(gUrl);

  function testFailHandler(message) {
    ok(false, message);
  }
  function testPassHandler(message) {
    ok(true, message);
  }
  gScript.addMessageListener("test-fail", testFailHandler);
  gScript.addMessageListener("test-pass", testPassHandler);

  async function requestChromeAction(action, params) {
    gScript.sendAsyncMessage(action, params);
    await new Promise(resolve => {
      gScript.addMessageListener(`${action}-complete`, function completeListener() {
        gScript.removeMessageListener(`${action}-complete`, completeListener);
        resolve();
      });
    });
  }
  function unexpectedErrMsg(testName, errName, timing) {
    return `${testName}: Unexpected error(${errName}) when ${timing} the PaymentRequest.`;
  }

  async function testInteractWithPaymentUnderWrongState() {
    const testName = "testInteractWithPaymentUnderWrongState";
    await requestChromeAction("start-test", testName);
    const payRequest = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions);
    ok(payRequest, testName + ": failed to create PaymentRequest.");
    if (!payRequest) {
      await requestChromeAction("finish-test");
      return;
    }
    const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true);
    let payResponse;
    try {
      payResponse = await payRequest.show();
      info(`${testName}: Interact with payment when PaymentRequest is eClosed`);
      await requestChromeAction("interact-with-payment");
      handler.destruct();
    } catch(err) {
      ok(false, unexpectedErrMsg(testName, err.name, "showing"));
      handler.destruct();
      await requestChromeAction("finish-test");
      return;
    }
    try {
      await payResponse.complete("success");
      ok(true, `${testName}: complete() is successful after PaymentRequest's state is eClosed.`);
    } catch(err) {
      ok(false, unexpectedErrMsg(testName, err.name, "completing"));
      await requestChromeAction("finish-test");
      return;
    }
    try {
      info(`${testName}: Interact with payment when PaymentRequest is completed`);
      await requestChromeAction("interact-with-payment");
    } catch(err) {
      ok(false, unexpectedErrMsg(testName, err.name, "completing"));
      await requestChromeAction("finish-test");
      return;
    }
    await requestChromeAction("finish-test");
  }

  function teardown() {
    return new Promise((resolve, reject) => {
      gScript.addMessageListener("teardown-complete", function teardownCompleteHandler() {
        gScript.removeMessageListener("teardown-complete", teardownCompleteHandler);
        gScript.removeMessageListener("test-fail", testFailHandler);
        gScript.removeMessageListener("test-pass", testPassHandler);
        gScript.destroy();
        SimpleTest.finish();
        resolve();
      });
      gScript.sendAsyncMessage("teardown");
    });
  }

  async function runTests() {
    try {
      await testInteractWithPaymentUnderWrongState();
      await teardown();
    } catch(e) {
      ok(false, "Unexpected error: " + e.name);
      SimpleTest.finish();
    }
  }

  window.addEventListener('load', function() {
    SpecialPowers.pushPrefEnv({
      'set': [
        ['dom.payments.request.enabled', true],
      ]
    }, runTests);
  });
  </script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1490698">Mozilla Bug 1490698</a>
</body>
</html>
