<!DOCTYPE html>
<title>Service Worker: 3P iframe for partitioned service workers</title>
<script src="/test-helpers.sub.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="./partitioned-utils.js"></script>

<body>
  <script>
    // 1p mode will respond to requests for its current controller and
    // postMessage when its controller changes.
    async function onLoad1pMode(){
      self.addEventListener('message', evt => {
        if(!evt.data)
          return;

        if (evt.data.type === "get-controller") {
          window.parent.postMessage({controller: navigator.serviceWorker.controller});
        }
      });

      navigator.serviceWorker.addEventListener('controllerchange', evt => {
        window.parent.postMessage({status: "success", context: "1p"}, '*');
      });
    }

    // 3p mode will tell its SW to claim and then postMessage its results
    // automatically.
    async function onLoad3pMode() {
      reg = await setup3pIframe();

      if(navigator.serviceWorker.controller != null){
        //This iframe is already under control of a service worker, testing for
        // a controller change will timeout. Return a failure.
        window.parent.postMessage({status: "failure", context: "3p"}, '*');
        return;
      }

      // Once this client is claimed, let the test know.
      navigator.serviceWorker.addEventListener('controllerchange', evt => {
        window.parent.postMessage({status: "success", context: "3p"}, '*');
      });

      // Trigger the SW to claim.
      reg.active.postMessage({type: "claim"});

    }

    const request_url = new URL(window.location.href);
    var url_search = request_url.search.substr(1);

    if(url_search == "1p-mode") {
      self.addEventListener('load', onLoad1pMode);
    }
    else if(url_search == "3p-mode") {
      self.addEventListener('load', onLoad3pMode);
    }
    // Else do nothing.
  </script>
</body>