<!doctype html>
<html>
<head>
<title>Check COEP reports are sent to iframe for 'new Worker()' failure</title>
</head>
<body>
<script src="/common/get-host-info.sub.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
<script>
const {ORIGIN} = get_host_info();
const RESOURCES_PATH= new URL("resources", location).pathname;
const iframe_path = "worker-owner-frame.html?pipe=";
const worker_path = "universal-worker.js?pipe=";

const coep_header= {
  "coep-none"         : "",
  "coep-report-only"  :
    "header(Cross-Origin-Embedder-Policy-Report-Only,require-corp)",
  "coep-require-corp" : "|header(Cross-Origin-Embedder-Policy,require-corp)",
};

function checkReport(report, url, blocked_url, disposition) {
  assert_equals(report.type, "coep");
  assert_equals(report.url, url);
  assert_equals(report.body.type, "worker initialization");
  assert_equals(report.body.blockedURL, blocked_url);
  assert_equals(report.body.disposition, disposition);
}

// Test parameters:
// - `owner_coep` the COEP header of the iframe document's response.
// - `worker_coep` the COEP header of the DedicatedWorker's script response.
//
// Test expectations:
// - `length` the length of reports.
// - `disposition`  the disposition in a report's body. Empty string if the
//                  length of reports is expected to be 0.
function check(
  // Test parameters:
  owner_coep,
  worker_coep,
  // Test expectations:
  length,
  disposition) {
  promise_test(async (t) => {
    const worker_url = worker_path + coep_header[worker_coep];
    const iframe_url = iframe_path + coep_header[owner_coep];
    const iframe = await with_iframe("./resources/" + iframe_url);
    t.add_cleanup(() => iframe.remove());

    const iframe_response = new Promise(resolve => window.onmessage = resolve);
    iframe.contentWindow.startWorkerAndObserveReports(worker_url, length > 0);

    const {data} = await iframe_response;
    assert_equals(data.length, length);
    if (data.length > 0) {
      const blocked_url = `${ORIGIN}${RESOURCES_PATH}/${worker_url}`;
      const url = `${ORIGIN}${RESOURCES_PATH}/${iframe_url}`;
      checkReport(
        data[0],
        url,
        blocked_url,
        disposition
      );
    }
  }, `Reporting to ${owner_coep} frame with ${worker_coep} worker`);
}

// -----------------------------------------------------------------------------
//    owner_coep          , worker_coep         , length  , disposition
// -----------------------------------------------------------------------------
check("coep-none"         , "coep-none"         , 0       , "");
check("coep-none"         , "coep-report-only"  , 0       , "");
check("coep-none"         , "coep-require-corp" , 0       , "");
check("coep-report-only"  , "coep-none"         , 1       , "reporting");
check("coep-report-only"  , "coep-report-only"  , 1       , "reporting");
check("coep-report-only"  , "coep-require-corp" , 0       , "");
check("coep-require-corp" , "coep-none"         , 1       , "enforce");
check("coep-require-corp" , "coep-report-only"  , 1       , "enforce");
check("coep-require-corp" , "coep-require-corp" , 0       , "");

</script>
</body>
</html>

