<!DOCTYPE html>
<html>
<!--
Repeated reload an iframe. When iframe's script is loaded from the bytecode
cache, dynamic module import should still resolve modules based on the
script's URL.
-->
<head>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />

  <script>
    const iframeId = "test_iframe";

    var checkResult = null;

    async function startTest() {
      SimpleTest.waitForExplicitFinish();

      // Setting dom.expose_test_interfaces pref causes the
      // nsScriptLoadRequest to fire event on script tags, with information
      // about its internal state. The ScriptLoader source send events to
      // trace these and resolve a promise with the path taken by the
      // script loader.
      //
      // Setting dom.script_loader.bytecode_cache.strategy to -1 causes the
      // nsScriptLoadRequest to force all the conditions necessary to make a
      // script be saved as bytecode in the alternate data storage provided
      // by the channel (necko cache).
      await SpecialPowers.pushPrefEnv({
        set: [
          ['dom.script_loader.bytecode_cache.enabled', true],
          ['dom.expose_test_interfaces', true],
          ["dom.script_loader.bytecode_cache.strategy", -1]
        ]});

      for (let i = 0; i < 3; i++) {
        let iframe = document.getElementById(iframeId);
        if (iframe) {
          document.body.removeChild(iframe);
        }

        iframe = document.createElement("iframe");
        document.body.appendChild(iframe);
        iframe.id = iframeId;

        let iwin = iframe.contentWindow;

        let eventPromise = new Promise(resolve => {
          // Both regular script and imported module scripts are encoded/decoded
          // Wait for 2 encode/load events to be fired.
          let count = 0;
          if (i == 0) {
            iwin.addEventListener("scriptloader_bytecode_saved", event => {
              count++;
              ok(true, "Bytecode encoding succeeded");
              if (count == 2) {
                resolve();
              }
            });
          } else {
            iwin.addEventListener("scriptloader_load_bytecode", event => {
              count++;
              ok(true, "Script loaded from bytecode");
              if (count == 2) {
                resolve();
              }
            });
          }

          iwin.addEventListener("scriptloader_bytecode_failed", () => {
            ok(false, "Bytecode encoding failed");
            SimpleTest.finish();
          });
        });

        let resultPromise = new Promise(resolve => {
          checkResult = resolve;
        });

        iframe.src = "bug1656248_frame.html";

        let [_, result] = await Promise.all([eventPromise, resultPromise]);

        is(result, 42, `Module was loaded successfully (${i})`);
      }

      SimpleTest.finish();
    }
  </script>
</head>

<body onload="startTest()"></body>