|  | <!DOCTYPE html> | 
|  | <head> | 
|  | <script src="/resources/testharness.js" nonce="123"></script> | 
|  | <script src="/resources/testharnessreport.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> | 
|  | <link id="static-no-nonce" href="resources/dummy.js?static-no-nonce" rel=preload as=script> | 
|  | <link id="static-nonce" href="resources/dummy.js?static-nonce" rel=preload as=script nonce="123"> | 
|  | <script nonce="123"> | 
|  | let counter = 0; | 
|  | let cspViolation = false; | 
|  | let isLoaded = (url) => { | 
|  | let entries = performance.getEntriesByType("resource"); | 
|  | for (let entry of entries) { | 
|  | if (entry.name.indexOf(url) != -1 ) { | 
|  | return true; | 
|  | } | 
|  | } | 
|  | return false; | 
|  | } | 
|  | window.addEventListener("securitypolicyviolation", (e) => { | 
|  | counter++; | 
|  | if (e.violatedDirective == "script-src-elem" && e.blockedURI.includes("static-no-nonce")) { | 
|  | cspViolation = true; | 
|  | } | 
|  | }); | 
|  | let link = document.createElement("link"); | 
|  | link.rel = "preload"; | 
|  | link.href = "resources/dummy.js?dynamic-nonce"; | 
|  | link.as = "script"; | 
|  | link.onload = () => { ++counter; }; | 
|  | document.head.appendChild(link); | 
|  | link = document.getElementById("static-no-nonce"); | 
|  | link.addEventListener("error", () => { ++counter; }); | 
|  | link = document.getElementById("static-nonce"); | 
|  | link.addEventListener("load", () => { ++counter; }); | 
|  | let t = async_test('preload from nonced script should work with strict-dynamic. preloaded script from markup should not.'); | 
|  | let timerCounter = 0; | 
|  | setInterval(t.step_func(() => { | 
|  | if (counter >= 4 || timerCounter > 5) { | 
|  | assert_true(isLoaded("dynamic-nonce"), "dynamic inserted preload script should have been loaded"); | 
|  | assert_true(isLoaded("static-nonce"), "preload tag with a nonce should have been loaded"); | 
|  | assert_false(isLoaded("static-no-nonce"), "preload tag without a nonce should not have been loaded"); | 
|  | assert_true(cspViolation, "CSP violation should have fired"); | 
|  | t.done(); | 
|  | } | 
|  | ++timerCounter; | 
|  | }), 100); | 
|  |  | 
|  | </script> | 
|  | </body> | 
|  | </html> |