<!DOCTYPE html>
<html>

<head>
    <!-- Programmatically converted from a WebKit Reftest, please forgive resulting idiosyncracies.-->
    <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline' 'nonce-noncynonce' 'nonce-noncy+/nonce=' 'unsafe-inline'; connect-src 'self';">
    <title>scriptnonce-ignore-unsafeinline</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script nonce='noncynonce'>
        function log(msg) {
            test(function() {
                assert_unreached(msg)
            });
        }

        window.addEventListener('securitypolicyviolation', function(e) {
            alert_assert("violated-directive=" + e.violatedDirective);
        });
    </script>
    <script nonce='noncynonce'>
        var t_alert = async_test('Expecting alerts: ["PASS (1/2)","PASS (2/2)", "violated-directive=script-src-elem"]');
        var expected_alerts = ["PASS (1/2)", "PASS (2/2)", "violated-directive=script-src-elem"];

        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_equals(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' 'unsafe-inline' 'nonce-noncynonce' 'nonce-noncy+/nonce=' 'unsafe-inline'; connect-src 'self';
-->
    <script nonce="noncynonce">


    </script>
    <script nonce="noncynonce">
        alert_assert('PASS (1/2)');
    </script>
    <script nonce="noncy+/nonce=">
        alert_assert('PASS (2/2)');

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

    </script>
</head>

<body>
    <p>
        This tests that a valid nonce disables inline JavaScript, even if &apos;unsafe-inline&apos; is present.
    </p>
    <div id="log"></div>
</body>

</html>
