| <!DOCTYPE html> | |
| <title>Test opaque fenced frame navigations with disallowed CSP blocked</title> | |
| <meta name="timeout" content="long"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/common/utils.js"></script> | |
| <script src="resources/utils.js"></script> | |
| <script src="/common/dispatcher/dispatcher.js"></script> | |
| <body> | |
| <script> | |
| const blockedCSPs = [ | |
| "'none'", | |
| "'self'", | |
| "data:", | |
| "https://*", | |
| "https://*:80", | |
| "https://b.test:*" | |
| ]; | |
| for (const resolve_to_config of [true, false]) { | |
| blockedCSPs.forEach((csp) => { | |
| promise_test(async(t) => { | |
| const iframe = setupCSP(csp); | |
| const key = token(); | |
| await iframe.execute(async(key, resolve_to_config, csp) => { | |
| let promise = new Promise((resolve) => { | |
| window.addEventListener('securitypolicyviolation', function(e) { | |
| resolve(e.violatedDirective + ";" + e.blockedURI); | |
| }, {once: true}); | |
| }); | |
| attachFencedFrame(await runSelectURL( | |
| "/fenced-frame/resources/embeddee.html", [key], resolve_to_config)); | |
| await promise.then((result) => { | |
| assert_equals(result, "fenced-frame-src;", | |
| "The fenced frame should not load for CSP fenced-frame-src " + | |
| csp); | |
| }); | |
| }, [key, resolve_to_config, csp]); | |
| }, "Fenced frame blocked for CSP fenced-frame-src " + csp + " using " + | |
| (resolve_to_config ? "config" : "urn:uuid")); | |
| }); | |
| promise_test(async(t) => { | |
| const iframe = setupCSP("*", "'self'"); | |
| const key = token(); | |
| await iframe.execute(async(key, resolve_to_config) => { | |
| 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)); | |
| }, [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."); | |
| await iframe.execute(() => { | |
| // 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"); | |
| } | |
| blockedCSPs.forEach((csp) => { | |
| promise_test(async() => { | |
| const iframe = setupCSP(csp); | |
| await iframe.execute(() => { | |
| assert_false(navigator.canLoadAdAuctionFencedFrame()); | |
| }) | |
| }, "Opaque-ads can load API returns false for " + csp); | |
| }); | |
| </script> | |
| </body> |