<!DOCTYPE html>
<html>

<head>
    <!-- Programmatically converted from a WebKit Reftest, please forgive resulting idiosyncracies.-->
    <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'nonce-nonceynonce' 'sha256-9UFeeZbvnMa0tLNu76v96T4Hh+UtDWHm2lPQJoTWb9c='; connect-src 'self';">
    <title>scripthash-unicode-normalization</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body>
    <!-- The following two scripts contain two separate code points (U+00C5
        and U+212B, respectively) which, depending on your text editor, might be
        rendered the same.However, their difference is important because, under
        NFC normalization, they would become the same code point, which would be
        against the spec. This test, therefore, validates that the scripts have
        *different* hash values. -->
    <script nonce="nonceynonce">
      var t_spv = async_test("Should fire securitypolicyviolation");
      window.addEventListener('securitypolicyviolation', t_spv.step_func_done(function(e) {
          assert_equals(e.violatedDirective, "script-src-elem");
      }));

      var matchingContent = 'Å';
      var nonMatchingContent = 'Å';

      // This script should have a hash value of
      // sha256-9UFeeZbvnMa0tLNu76v96T4Hh+UtDWHm2lPQJoTWb9c=
      var scriptContent1 = "window.finish('" + matchingContent + "');";

      // This script should have a hash value of
      // sha256-iNjjXUXds31FFvkAmbC74Sxnvreug3PzGtu16udQyqM=
      var scriptContent2 = "window.finish('" + nonMatchingContent + "');";

      var script1 = document.createElement('script');
      var script2 = document.createElement('script');

      script1.test = async_test("Only matching content runs even with NFC normalization.");

      var failure = function() {
        assert_unreached();
      }

      window.finish = function(content) {
        if (content == matchingContent) {
          script1.test.step(function() {
            script1.test.done();
          });
        } else {
          script1.test.step(function() {
            assert_unreached("nonMatchingContent script ran");
          });
        }
      }

      script1.onerror = failure;

      document.body.appendChild(script2);
      script2.textContent = scriptContent2;
      document.body.appendChild(script1);
      script1.textContent = scriptContent1;
    </script>

    <p>
        This tests Unicode normalization. While appearing the same, the strings in the scripts are different Unicode points, but through normalization, should be the same when the hash is taken.
    </p>
    <div id="log"></div>
</body>

</html>
