| <!DOCTYPE html> | |
| <head> | |
| <script src="/resources/testharness.js" nonce="123"></script> | |
| <script src="/resources/testharnessreport.js" nonce="123"></script> | |
| <script src="/common/utils.js" nonce="123"></script> | |
| <script src="/preload/resources/preload_helper.js" nonce="123"></script> | |
| <title>CSP strict-dynamic + preload</title> | |
| <meta http-equiv="Content-Security-Policy" content="script-src 'nonce-123' 'strict-dynamic'" /> | |
| </head> | |
| <body> | |
| <script nonce="123"> | |
| const PATTERN = /\?key=([a-zA-Z0-9\-]+)$/; | |
| // We use async_test instead of promise_test in this file because these | |
| // tests take long time to run and we want to run them in parallel. | |
| async_test((t) => { | |
| Promise.resolve().then(async () => { | |
| let sawViolation = false; | |
| self.addEventListener('securitypolicyviolation', (e) => { | |
| const link = document.querySelector('#static-no-nonce'); | |
| if (e.violatedDirective == 'script-src-elem' && e.blockedURI === link.href) { | |
| sawViolation = true; | |
| } | |
| }); | |
| await new Promise((resolve) => step_timeout(resolve, 3000)); | |
| const link = document.querySelector('#static-no-nonce'); | |
| const key = link.href.match(PATTERN)[1] | |
| assert_true(sawViolation, 'sawViolation'); | |
| assert_false(await hasArrivedAtServer(key), 'hasArrivedAtServer'); | |
| t.done(); | |
| }).catch(t.step_func((e) => { | |
| throw e; | |
| })); | |
| }, 'static-no-nonce'); | |
| async_test((t) => { | |
| Promise.resolve().then(async () => { | |
| let sawViolation = false; | |
| self.addEventListener('securitypolicyviolation', (e) => { | |
| const link = document.querySelector('#static-nonce'); | |
| if (e.violatedDirective == 'script-src-elem' && e.blockedURI === link.href) { | |
| sawViolation = true; | |
| } | |
| }); | |
| // TODO: Use step_wait after | |
| // https://github.com/web-platform-tests/wpt/pull/34289 is merged. | |
| await new Promise((resolve) => step_timeout(resolve, 3000)); | |
| const link = document.querySelector('#static-nonce'); | |
| const key = link.href.match(PATTERN)[1] | |
| assert_false(sawViolation, 'sawViolation'); | |
| assert_true(await hasArrivedAtServer(key), 'hasArrivedAtServer'); | |
| t.done(); | |
| }).catch(t.step_func((e) => { | |
| throw e; | |
| })); | |
| }, 'static-nonce'); | |
| async_test((t) => { | |
| Promise.resolve().then(async () => { | |
| const link = document.createElement('link'); | |
| link.rel = 'preload'; | |
| const id = token(); | |
| link.href = `/preload/resources/stash-put.py?key=${id}`; | |
| link.as = 'script'; | |
| document.head.appendChild(link); | |
| await new Promise((resolve, reject) => { | |
| link.addEventListener('load', resolve, {once: true}); | |
| link.addEventListener('error', resolve, {once: true}); | |
| }); | |
| assert_true(await hasArrivedAtServer(id), 'hasArrivedAtServer'); | |
| t.done(); | |
| }).catch(t.step_func((e) => { | |
| throw e; | |
| })); | |
| }, 'dynamic'); | |
| </script> | |
| <link id="static-no-nonce" href="/preload/resources/stash-put.py?key={{uuid()}}" rel=preload as=script> | |
| <link id="static-nonce" href="/preload/resources/stash-put.py?key={{uuid()}}" rel=preload as=script nonce="123"> | |
| </body> | |
| </html> |