<!DOCTYPE html>
<title>Test opaque fenced frame navigations with disallowed CSP blocked</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="resources/utils.js"></script>

<body>
<script>
for (const resolve_to_config of [true, false]) {
  const blockedCSPs = ["'none'", "'self'", "data:", "https://*", "https://*:80",
                       "https://b.test:*"];
  blockedCSPs.forEach((csp) => {
    promise_test(async() => {
      setupCSP(csp);

      const key = token();
      window.addEventListener('securitypolicyviolation', function(e) {
        // Write to the server even though the listener is in the same file in
        // the test below.
        writeValueToServer(key, e.violatedDirective + ";" + e.blockedURI);
      }, {once: true});

      attachFencedFrame(await runSelectURL("resources/embeddee.html",
                                  [key], resolve_to_config));

      const result = await nextValueFromServer(key);
      assert_equals(result, "fenced-frame-src;",
          "The fenced frame should not load for CSP fenced-frame-src " + csp);
    }, "Fenced frame blocked for CSP fenced-frame-src " + csp + " using " +
       (resolve_to_config ? "config" : "urn:uuid"));

    promise_test(async() => {
      setupCSP(csp);
      assert_false(navigator.canLoadAdAuctionFencedFrame());
    }, "Opaque-ads can load API returns false for " + csp + " using " +
       (resolve_to_config ? "config" : "urn:uuid"));
  });

  promise_test(async() => {
    setupCSP("*", "'self'");

    const key = token();
    window.addEventListener('securitypolicyviolation', function(e) {
      // Write to the server even though the listener is in the same file in
      // the test below.
      writeValueToServer(key, e.violatedDirective + ";" + e.blockedURI);
    }, {once: true});

    attachFencedFrame(await runSelectURL("resources/embeddee.html",
                                [key], resolve_to_config));

    const result = await nextValueFromServer(key);
    assert_equals(result, "fenced-frame-src;",
        "The fenced frame should not load for CSP frame-src 'self' even if " +
        "another CSP allows loading a fenced frame.");

    // Test the canLoadOpaqueURL API to ensure it arrives at the same result.
    assert_false(navigator.canLoadAdAuctionFencedFrame());
  }, "Fenced frame not loaded using " +
     (resolve_to_config ? "config" : "urn:uuid") +
     " if any of CSPs in place disallow loading");
}
</script>
</body>
