<!--
  Any copyright is dedicated to the Public Domain.
  http://creativecommons.org/publicdomain/zero/1.0/
-->
<!DOCTYPE HTML>
<html>
<head>
  <title>Bug 982726 - Test service worker post message </title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test"></pre>
<script class="testbody" type="text/javascript">
  /**
   *
   */
  let iframe;
  let registration;

  function start() {
    return new Promise(resolve => {
      const content = document.getElementById("content");
      ok(content, "Parent exists.");

      iframe = document.createElement("iframe");
      iframe.setAttribute("src", "sw_clients/refresher_compressed.html");

      /*
       * The initial iframe must be the _uncached_ version, which means its
       * load must happen before the Service Worker's `activate` event.
       * Rather than `waitUntil`-ing the Service Worker's `install` event
       * until the load finishes (more concurrency, but involves coordinating
       * `postMessage`s), just ensure the load finishes before registering
       * the Service Worker (which is simpler).
       */
      iframe.onload = resolve;

      content.appendChild(iframe);
    }).then(async () => {
      /*
       * There's no need _here_ to explicitly wait for this Service Worker to be
       * "activated"; this test will progress when the "READY"/"READY_CACHED"
       * messages are received from the iframe, and the iframe will only send
       * those messages once the Service Worker is "activated" (by chaining on
       * its `navigator.serviceWorker.ready` promise).
       */
      registration = await navigator.serviceWorker.register(
        "force_refresh_worker.js", { scope: "./sw_clients/" });
    });
  }

  function unregister() {
    return registration.unregister().then(function(result) {
      ok(result, "Unregister should return true.");
    }, function(e) {
      dump("Unregistering the SW failed with " + e + "\n");
    });
  }

  function testForceRefresh(swr) {
    return new Promise(function(res, rej) {
      var count = 0;
      var cachedCount = 0;
      window.onmessage = function(e) {
        if (e.data === "READY") {
          count += 1;
          if (count == 2) {
            is(cachedCount, 1, "should have received cached message before " +
                               "second non-cached message");
            res();
          }
          iframe.contentWindow.postMessage("REFRESH", "*");
        } else if (e.data === "READY_CACHED") {
          cachedCount += 1;
          is(count, 1, "should have received non-cached message before " +
                       "cached message");
          iframe.contentWindow.postMessage("FORCE_REFRESH", "*");
        }
      }
    }).then(() => document.getElementById("content").removeChild(iframe));
  }

  function runTest() {
    start()
      .then(testForceRefresh)
      .then(unregister)
      .catch(function(e) {
        ok(false, "Some test failed with error " + e);
      }).then(SimpleTest.finish);
  }

  SimpleTest.waitForExplicitFinish();
  SpecialPowers.pushPrefEnv({"set": [
    ["dom.serviceWorkers.exemptFromPerDomainMax", true],
    ["dom.serviceWorkers.enabled", true],
    ["dom.serviceWorkers.testing.enabled", true],
    ["dom.caches.enabled", true],
  ]}, runTest);
</script>
</pre>
</body>
</html>
