<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <title>Test back/forward after pushState</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
  <script>
    SimpleTest.waitForExplicitFinish();
    SimpleTest.requestFlakyTimeout("Need to wait to make sure an event does not fire");

    async function runTest() {
      let win = window.open();
      let goneBackAndForwardOnce = new Promise((resolve) => {
        let timeoutID;

        // We should only get one load event in win.
        let bc = new BroadcastChannel("bug1729662");
        bc.addEventListener("message", () => {
          bc.addEventListener("message", () => {
            clearTimeout(timeoutID);
            resolve(false);
          });
        }, { once: true });

        let goneBack = false, goneForward = false;
        win.addEventListener("popstate", ({ state }) => {
          // We should only go back and forward once, if we get another
          // popstate after that then we should fall through to the
          // failure case below.
          if (!(goneBack && goneForward)) {
            // Check if this is the popstate for the forward (the one for
            // back will have state == undefined).
            if (state == 1) {
              ok(goneBack, "We should have gone back before going forward");

              goneForward = true;

              // Wait a bit to make sure there are no more popstate events.
              // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
              timeoutID = setTimeout(resolve, 1000, true);

              return;
            }

            // Check if we've gone back once before, if we get another
            // popstate after that then we should fall through to the
            // failure case below.
            if (!goneBack) {
              goneBack = true;

              return;
            }
          }

          clearTimeout(timeoutID);
          resolve(false);
        });
      });

      win.location = "file_bug1729662.html";

      ok(await goneBackAndForwardOnce, "Stopped navigating history");

      win.close();

      SimpleTest.finish();
    }
  </script>
</head>
<body onload="runTest();">
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test"></pre>
</body>
</html>
