<!doctype html>
<meta name="timeout" content="long">
<title>Cross-Origin-Embedder-Policy header and nested navigable resource without such header</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/common/utils.js></script> <!-- Use token() to allow running tests in parallel -->
<script src="/common/get-host-info.sub.js"></script>
<div id=log></div>
<script>
const HOST = get_host_info();
const BASE = new URL("resources", location).pathname;

async_test(t => {
  const frame = document.createElement("iframe");
  t.add_cleanup(() => frame.remove());
  frame.onload = t.step_func_done(() => {
    assert_not_equals(frame.contentDocument, null);
  });
  frame.src = "/common/blank.html";
  document.body.append(frame);
  assert_equals(frame.contentDocument.body.localName, "body");
}, `"none" top-level: navigating a frame to "none" should succeed`);

async_test(t => {
  const frame = document.createElement("iframe");
  t.add_cleanup(() => frame.remove());
  const blank = "/common/blank.html";
  let firstNavOk = false;
  frame.onload = t.step_func(() => {
    if (!firstNavOk) {
      assert_not_equals(frame.contentDocument, null);
      firstNavOk = true;
    } else {
      assert_not_equals(frame.contentDocument, null);
      assert_equals(frame.contentWindow.location.pathname, blank);
      t.done();
    }
  });
  frame.src = `resources/navigate-require-corp.sub.html?to=${blank}`;
  document.body.append(frame);
  assert_equals(frame.contentDocument.body.localName, "body");
}, `"none" top-level: navigating a frame from "require-corp" to "none" should succeed`);

async_test(t => {
  Promise.resolve().then(async () => {
    const bc = new BroadcastChannel(token());
    const futureMessage = () => {
      return new Promise(resolve => {
        bc.onmessage = event => resolve(event.data);
      });
    };

    const prefix = document.URL.substr(0, document.URL.lastIndexOf('/'))
    const attribute = `?channelName=${bc.name}`;
    const url_1 = prefix + "/resources/navigate-none.sub.html" + attribute;
    const url_2 = prefix + "/resources/navigate-require-corp.sub.html" + attribute;

    const w = window.open(url_1, "window_name");
    t.add_cleanup(() => w.close());
    assert_equals(await futureMessage(), "loaded");
    assert_equals(w.location.href, url_1);

    w.location.href = url_2;
    assert_equals(await futureMessage(), "loaded");
    assert_equals(w.location.href, url_2);

    w.history.back();
    assert_equals(await futureMessage(), "loaded");
    assert_equals(w.location.href, url_1);

    t.done();
  }).catch((e) => t.unreached_func(e));
}, `"none" top-level: navigating a frame back from "require-corp" should succeed`);

async_test(t => {
  let pageLoaded = false;
  const bc = new BroadcastChannel(token());
  let finished = false;
  let doneCheck = _ => {
    if (finished && pageLoaded) {
      t.done();
    }
  }
  bc.onmessage = t.step_func((event) => {
    pageLoaded = true;
    let payload = event.data;
    assert_equals(payload, "loaded");

    doneCheck();
  });

  const bc2 = new BroadcastChannel(token());
  bc2.onmessage = t.step_func((event) => {
    finished = true;
    let payload = event.data;
    assert_equals(payload, "loaded");

    doneCheck();
  });

  const win = window.open(`resources/navigate-require-corp.sub.html?channelName=${bc.name}&to=navigate-none.sub.html?channelName=${bc2.name}`, "_blank", "noopener");
  assert_equals(win, null);
}, `"require-corp" top-level noopener popup: navigating to "none" should succeed`);

async_test(t => {
  const frame = document.createElement("iframe");
  const id = token();
  t.add_cleanup(() => frame.remove());
  window.addEventListener('message', t.step_func((e) => {
    if (e.data === id) {
      // Loaded!
      t.done();
    }
  }));
  frame.src = `${HOST.HTTPS_NOTSAMESITE_ORIGIN}${BASE}/navigate-require-corp-same-site.sub.html?token=${id}`;
  document.body.append(frame);
}, 'CORP: same-site is not checked.');

</script>
