<!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-abc' 'sha256-k7iO9DPkNQ7PcwPP+8XyYuRiCJ0p76Ofveol9g3mFNs=' 'sha256-EgE/bwVJ+ZLL9F5hNjDqD4C7nlFFrdDaKeNIJ2cUem4='; connect-src 'self';">
    <title>scripthash-basic-blocked</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="../support/logTest.sub.js?logs=[]"></script>
    <script>
        window.addEventListener('securitypolicyviolation', function(e) {
            alert_assert("Fail");
        });
    </script>
    
    <script>
        var t_alert = async_test('Expecting alerts: ["PASS (1/1)"]');
        var expected_alerts = ["PASS (1/1)"];

        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>
    <script>
        alert_assert('PASS (1/1)');

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

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

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

    </script>
    <script>
        alert_assert('FAIL (4/4)');

    </script>
</head>

<body>
    <p>
        This tests the effect of a valid script-hash value, with one valid script and several invalid ones. It passes if one alert is executed and a CSP violation is reported.
    </p>
    <div id="log"></div>
</body>

</html>
