| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <meta http-equiv="Content-Security-Policy" content="child-src 'self' http://www1.{{host}}:{{ports[http][0]}}; script-src 'self' 'unsafe-inline'; connect-src 'self';"> </head> |
| <body></body> |
| |
| <script> |
| async_test(test => { |
| let count = 0; |
| window.addEventListener("message", test.step_func((event) => { |
| assert_equals(event.data, "PASS"); |
| count++; |
| assert_less_than_equal(count, 2); |
| if (count == 2) { |
| // Use a timeout, to let some time for additional messages to show up |
| // before declaring this test as completed. |
| test.step_timeout(() => test.done(), 1000); |
| } |
| })); |
| }, "Two of the three iframe are expected to load."); |
| |
| // IFrames blocked by CSP should generate a 'load', not 'error' event, |
| // regardless of blocked state. This means they appear to be normal |
| // cross-origin loads, thereby not leaking URL information directly to JS. |
| const runTest = (description, src) => { |
| async_test(test => { |
| const iframe = document.createElement("iframe"); |
| iframe.src = src; |
| iframe.onload = () => test.done(); |
| iframe.onerror = () => test.assert_unreached('unexpected onerror') |
| document.body.appendChild(iframe); |
| }, description); |
| }; |
| |
| runTest("Navigation in iframe allowed by child-src 'self'", |
| "/content-security-policy/support/postmessage-pass.html"); |
| |
| runTest("Navigation in iframe allowed by child-src explicit CSP source", |
| "http://{{domains[www1]}}:{{ports[http][0]}}/content-security-policy/support/postmessage-pass.html"); |
| |
| runTest("Navigation in iframe not allowed by child-src", |
| "http://{{domains[www2]}}:{{ports[http][0]}}/content-security-policy/support/postmessage-fail.html"); |
| </script> |