<!DOCTYPE html>
<html>
<head>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
  <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
</head>
<body>
  <script>
    var t = async_test("A 'frame-ancestors' CSP directive set from a serviceworker response with a value 'none' should block rendering.");

    // Register service worker.
    var worker = 'support/service-worker.js';
    var scope = 'support/service-worker/';
    service_worker_unregister_and_register(t, worker, scope)
      .then(registration => wait_for_state(t, registration.installing, 'activated'))
      .then(() => {
        // Load iframe.
        var iframe = document.createElement("iframe");
        let timer;
        function pollForLoadCompletion() {
          timer = t.step_timeout(() => iframeMayBeLoaded({isPoll: true}), 10);
        }
        function iframeMayBeLoaded({isPoll}) {
          var failed = false;
          clearTimeout(timer);
          try {
            let href = iframe.contentWindow.location.href;
            if (isPoll && (href === "about:blank" || iframe.contentDocument.readyState !== "complete")) {
              pollForLoadCompletion();
              return;
            }
            failed = true;
          } catch (ex) {}
          t.step_func_done(() => assert_false(failed, "The IFrame should have been blocked. It wasn't."))();
        };
        iframe.addEventListener("load", () => iframeMayBeLoaded({isPoll: false}));
        iframe.addEventListener("error", () => iframeMayBeLoaded({isPoll: false}));
        iframe.src = "/content-security-policy/frame-ancestors/support/service-worker/frame-ancestors-none.html";
        document.body.appendChild(iframe);
        pollForLoadCompletion();
      });
  </script>
</body>
</html>

