<!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>
