<!DOCTYPE html>
<html>

<head>
    <!-- Programmatically converted from a WebKit Reftest, please forgive resulting idiosyncracies.-->
    <meta http-equiv="Content-Security-Policy" content="frame-src 'none'; script-src 'self' 'unsafe-inline'; connect-src 'self';">
    <title>frame-src-blocked</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src='../support/logTest.sub.js?logs=["PASS IFrame %231 generated a load event.","violated-directive=frame-src"]'></script>
    <script>
        window.addEventListener('securitypolicyviolation', function(e) {
            log("violated-directive=" + e.violatedDirective);
        });
        
        window.addEventListener("message", function(event) {
            alert_assert(event.data);
        }, false);

        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>
    <p>
        IFrames blocked by CSP should generate a 'load', not 'error' event, regardless of blocked state. This means they appear to be normal cross-origin loads, thereby not leaking URL information directly to JS.
    </p>
    <script>
        window.wasPostTestScriptParsed = true;
        var loads = 0;

        function loadEvent() {
            loads++;
            log("PASS " + "IFrame #" + loads + " generated a load event.");
        }

    </script>
</head>

<body>
    <iframe src="/content-security-policy/support/postmessage-fail.html" onload="loadEvent()" onerror="log('FAIL')"></iframe>
    <div id="log"></div>
</body>

</html>
