<!DOCTYPE html>
<!--
 | This test was modified to not depend on a hash to allow a script to pass, so
 | that the rest of the behavior addressed by this test can stil be tested on
 | Cobalt.
 -->
<html>

<head>
    <!-- Programmatically converted from a WebKit Reftest, please forgive resulting idiosyncracies.-->
    <title>scriptnonce-and-scripthash</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script nonce="nonceynonce">
        function log(msg) {
            test(function() {
                assert_unreached(msg)
            });
        }

    </script>
    <script nonce="nonceynonce">
        var t_alert = async_test('Expecting alerts: ["PASS (1/3)","PASS (3/3)"]');
        var expected_alerts = ["PASS (1/3)", "PASS (3/3)"];

        function alert_assert(msg) {
            t_alert.step(function() {
                if (msg.match(/^FAIL/i)) {
                    assert_unreached(msg);
                    t_alert.done();
                }
                for (var i = 0; i < expected_alerts.length; i++) {
                    if (expected_alerts[i] == msg) {
                        assert_true(expected_alerts[i] == msg);
                        expected_alerts.splice(i, 1);
                        if (expected_alerts.length == 0) {
                            t_alert.done();
                        }
                        return;
                    }
                }
                assert_unreached('unexpected alert: ' + msg);
                t_log.done();
            });
        }

    </script>
    <!-- enforcing policy:
script-src 'self' 'sha256-DISABLED-LS8v1E1Ff0Hc8FobgWKNKY3sbW4rljPlZNQHyyutfKU=' 'nonce-nonceynonce'; connect-src 'self';
-->
    <script nonce="nonceynonce">
        alert_assert('PASS (1/3)');

    </script>
    <script>
        alert_assert('FAIL (2/3)');

    </script>
    <script nonce="nonceynonce">
        alert_assert('PASS (3/3)');

    </script>
    <script>
        alert_assert('FAIL (1/2)');

    </script>
    <script nonce="notanonce">
        alert_assert('FAIL (2/2)');

    </script>
</head>

<body>
    <p>
        This tests the combined use of script hash and script nonce. It passes if a CSP violation is generated and the three alerts show PASS.
    </p>
    <div id="log"></div>
    <script async defer src="../support/checkReport.sub.js?reportExists=true&amp;reportField=violated-directive&amp;reportValue=script-src%20&apos;sha1-MfuEFRkC2LmR31AMy9KW2ZLDegA=&apos;%20&apos;sha1-p70t5PXyndLfjKNjbyBBOL1gFiM=&apos;%20&apos;nonce-nonceynonce&apos;"></script>
</body>

</html>
