<html>
<head>
    <script>
        window.onload = function()
        {
            if (window.testRunner) {
                testRunner.dumpAsText();
                testRunner.dumpChildFramesAsText();
                testRunner.waitUntilDone();
            }

            if (window.testRunner) {
                setTimeout(pollForTest, 1);
            } else {
                alert("This test requires it be run in DRT.");
            }
        }

        pollForTest = function()
        {
            if (!testRunner.globalFlag) {
                setTimeout(pollForTest, 1);
                return;
            }
            runTest();
            testRunner.notifyDone();
        }

        runTest = function()
        {
            var frame = document.getElementById('aFrame');
            frame.setAttributeNS(null, "src", 'javascript:"FAIL: this should not have been loaded."');
            frame.setAttributeNS(null, "src", ' javascript:"FAIL: this should not have been loaded."');
            frame.setAttributeNS(null, "src", 'java\0script:"FAIL: this should not have been loaded."');
            frame.setAttributeNS(null, "src", 'javascript\t:"FAIL: this should not have been loaded."');
            frame.setAttributeNS(null, "src", 'javascript\1:"FAIL: this should not have been loaded."');
        }
    </script>
</head>
<frameset rows="10%,*">
    <frame id='main' name='main' src="data:text/html,<p>This test passes as long as the word 'FAIL' and an accompanying message do not appear in the frame below.</p>">
    <frame id='aFrame' name='aFrame' src='http://localhost:8000/security/resources/cross-frame-iframe.html'>
</frameset>
</html>
