// META: script=/common/get-host-info.sub.js
// META: script=/common/utils.js
// META: script=/common/dispatcher/dispatcher.js
// META: script=./resources/common.js

const http  = get_host_info().HTTP_ORIGIN;
const https = get_host_info().HTTPS_ORIGIN;

let crossOriginIsolatedTest = (
    description,
    origin ,
    headers,
    expect_crossOriginIsolated) => {
  promise_test_parallel(async test => {
    const w_token = token();
    const w_url = origin + executor_path + headers + `&uuid=${w_token}`;
    const w = window.open(w_url)
    add_completion_callback(() => w.close());

    const this_token = token();
    send(w_token, `
      if (window.crossOriginIsolated)
        send("${this_token}", "crossOriginIsolated");
      else
        send("${this_token}", "not isolated")
    `);
    assert_equals(await receive(this_token), expect_crossOriginIsolated);
  }, description);
}

crossOriginIsolatedTest("Main crossOriginIsolated case:",
  https,  coop_same_origin +
          coep_credentialless, "crossOriginIsolated");

crossOriginIsolatedTest("Missing HTTPS:",
  http,  coop_same_origin +
         coep_credentialless, "not isolated");

crossOriginIsolatedTest("Missing COOP:same-origin:",
  https,  coep_credentialless, "not isolated");

crossOriginIsolatedTest("Report-only:",
  https, coop_same_origin +
         coep_report_only_credentialless, "not isolated");

crossOriginIsolatedTest("Report-only + enforced:",
  https, coop_same_origin +
         coep_credentialless +
         coep_report_only_credentialless, "crossOriginIsolated");
