<!-- webkit-test-runner [ enablePageCache=true ] -->
<!DOCTYPE html>
<html>
<body>
<script src="resources/sw-test-pre.js"></script>
<script>
log("* Tests that a client is re-added to the list of service worker clients when it is restored from the page cache");
log("");

if (window.testRunner)
  testRunner.setCanOpenWindows();

let tries = 0;

let expectedClientIdentifiers = [];

function containsExpectedClients(clientIdentifiers)
{
    for (let expectedIdentifier of expectedClientIdentifiers) {
        if (!clientIdentifiers.includes(expectedIdentifier))
            return false;
    }
    return true;
}

navigator.serviceWorker.addEventListener("message", function(event) {
  if (step == "BothClientsInitiallyActive") {
    if (!containsExpectedClients(event.data)) {
      if (++tries > 20) {
          log("FAIL: Wrong initial number of clients");
          finishSWTest();
          return;
      }
      worker.postMessage("getClientIds");
      return;
    }
    log("PASS: service worker has initially 2 clients");

    otherWindow.addEventListener("pagehide", function(event) {
       if (!event.persisted) {
         log("FAIL: page failed to enter page cache");
         finishSWTest();
         return;
       }
       log("PASS: page is about to enter page cache");
    });

    otherWindow.addEventListener("pageshow", function(event) {
      if (!event.persisted) {
         log("FAIL: page was not restored from page cache");
         finishSWTest();
         return;
       }
       setTimeout(function() {
         step = "SecondClientRestoredFromPageCache";
         worker.postMessage("getClientIds");
       }, 0);
    });

    otherWindow.location.href = "/navigation/resources/page-cache-helper.html";
    return;
  }

  if (step == "SecondClientRestoredFromPageCache") {
    if (!containsExpectedClients(event.data)) {
      log("FAIL: Wrong number of clients after one client was restored from page cache");
      finishSWTest();
    }

    log("PASS: service worker now has 2 clients again after restoring the second one from page cache");
    finishSWTest();
  }
});

navigator.serviceWorker.register("resources/getClientIds-worker.js", { }).then(function(registration) {
    expectedClientIdentifiers.push(internals.serviceWorkerClientIdentifier(document));

    worker = registration.installing;
    otherWindow = open("other_resources/test.html");
    otherWindow.onload = function() {
      expectedClientIdentifiers.push(internals.serviceWorkerClientIdentifier(otherWindow.document));
      step = "BothClientsInitiallyActive"
      worker.postMessage("getClientIds");
    };
});
</script>
</body>
</html>
