<!DOCTYPE html>
<title>COEP for WebBundle subresource loading</title>
<link
  rel="help"
  href="https://github.com/WICG/webpackage/blob/main/explainers/subresource-loading.md"
/>
<link
  rel="help"
  href="https://html.spec.whatwg.org/multipage/origin.html#coep"
/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../resources/test-helpers.js"></script>

<body>
  <!--
       This wpt should run on an origin different from https://www1.web-platform.test:8444/,
       from where cross-orign WebBundles are served.

       This test uses a cross-origin WebBundle,
       https://www1.web-platform.test:8444/web-bundle/resources/wbn/cors/corp.wbn,
       which is served with an Access-Control-Allow-Origin response header.

       `corp.wbn` includes three subresources:
       a. `no-corp.js`, which doesn't include a Cross-Origin-Resource-Policy response header.
       b. `corp-same-origin.js`, which includes a Cross-Origin-Resource-Policy: same-origin response header.
       c. `corp-cross-origin.js`, which includes a Cross-Origin-Resource-Policy: cross-origin response header.
  -->
  <script type="webbundle">
    {
      "source": "https://www1.web-platform.test:8444/web-bundle/resources/wbn/cors/corp.wbn",
      "resources": [
        "https://www1.web-platform.test:8444/web-bundle/resources/wbn/cors/no-corp.js",
        "https://www1.web-platform.test:8444/web-bundle/resources/wbn/cors/corp-same-origin.js",
        "https://www1.web-platform.test:8444/web-bundle/resources/wbn/cors/corp-cross-origin.js",
        "urn:uuid:5eafff38-e0a0-4661-bde0-434255aa9d93",
        "urn:uuid:7e13b47a-8b91-4a0e-997c-993a5e2f3a34",
        "urn:uuid:86d5b696-8867-4454-8b07-51239a0817f7"
      ]
    }
  </script>
  <script>
    setup(() => {
      assert_true(HTMLScriptElement.supports("webbundle"));
    });

    async function expectCOEPReport(func) {
      const reportsPromise = new Promise((resolve) => {
        const observer = new ReportingObserver((reports) => {
          observer.disconnect();
          resolve(reports.map((r) => r.toJSON()));
        });
        observer.observe();
      });

      await func();

      const reports = await reportsPromise;
      assert_equals(reports.length, 1);
      assert_equals(reports[0].type, "coep");
      assert_equals(reports[0].url, location.href);
      return reports[0];
    }

    const prefix =
      "https://www1.web-platform.test:8444/web-bundle/resources/wbn/cors/";
    const no_corp_url = "urn:uuid:5eafff38-e0a0-4661-bde0-434255aa9d93";
    const corp_same_origin_url =
      "urn:uuid:7e13b47a-8b91-4a0e-997c-993a5e2f3a34";
    const corp_cross_origin_url =
      "urn:uuid:86d5b696-8867-4454-8b07-51239a0817f7";

    promise_test(async () => {
      const report = await expectCOEPReport(async () => {
        await addScriptAndWaitForError(prefix + "no-corp.js");
      });
      assert_equals(report.body.blockedURL, prefix + "no-corp.js");
      assert_equals(report.body.type, "corp");
      assert_equals(report.body.disposition, "enforce");
      assert_equals(report.body.destination, "script");
    }, "Cross-origin subresource without Cross-Origin-Resource-Policy: header should be blocked and generate a report.");

    promise_test(async () => {
      await addScriptAndWaitForError(prefix + "corp-same-origin.js");
    }, "Cross-origin subresource with Cross-Origin-Resource-Policy: same-origin should be blocked.");

    promise_test(async () => {
      await addScriptAndWaitForExecution(prefix + "corp-cross-origin.js");
    }, "Cross-origin subresource with Cross-Origin-Resource-Policy: cross-origin should be loaded.");

    promise_test(async () => {
      const report = await expectCOEPReport(async () => {
        const iframe = document.createElement("iframe");
        iframe.src = no_corp_url;
        document.body.appendChild(iframe);
      });

      assert_equals(report.body.blockedURL, no_corp_url);
      assert_equals(report.body.type, "corp");
      assert_equals(report.body.disposition, "enforce");
      assert_equals(report.body.destination, "iframe");
    }, "Urn:uuid iframe without Cross-Origin-Resource-Policy: header should be blocked and generate a report.");

    promise_test(async () => {
      const report = await expectCOEPReport(async () => {
        const iframe = document.createElement("iframe");
        iframe.src = corp_same_origin_url;
        document.body.appendChild(iframe);
      });

      assert_equals(report.body.blockedURL, corp_same_origin_url);
      assert_equals(report.body.type, "corp");
      assert_equals(report.body.disposition, "enforce");
      assert_equals(report.body.destination, "iframe");
    }, "Urn:uuid iframe with Cross-Origin-Resource-Policy: same-origin should be blocked and generate a report.");

    promise_test(async () => {
      const iframe = document.createElement("iframe");
      iframe.src = corp_cross_origin_url;
      await addElementAndWaitForLoad(iframe);
      assert_equals(
        await evalInIframe(iframe, "location.href"),
        corp_cross_origin_url
      );
    }, "Urn:uuid iframe with Cross-Origin-Resource-Policy: cross-origin should not be blocked.");
  </script>
</body>
