<html>
<body>
<p>Test that a cross-origin redirect to a server that responds is indistinguishable from one that does not. Should say PASS:</p>
<pre id='console'></pre>
<script type="text/javascript">
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    function log(message)
    {
        document.getElementById('console').appendChild(document.createTextNode(message + "\n"));
    }

    var xhr;
    var logExisting;
    var logMissing;

    function doneExisting()
    {
        if (xhr.responseText.length)
            alert("FAIL: Response is not empty, " + xhr.responseText);

        logExisting = document.getElementById('console').innerHTML;
        document.getElementById('console').innerHTML = "";

        xhr = new XMLHttpRequest;
        xhr.onreadystatechange = function() { log("onreadystatechange " + xhr.readyState) }
        xhr.onload = function() { log("onload") }
        xhr.onloadstart = function() { log("onloadstart") }
        xhr.onprogress = function() { log("onprogress") }
        xhr.onerror = function() { log("onerror"); setTimeout(doneMissing, 100); }
        xhr.open("GET", "/resources/redirect.php?url=http://localhost:22/", true); // A non-HTTP port that is likely to be listening.
        xhr.send();
    }

    function doneMissing()
    {
        if (xhr.responseText.length)
            alert("FAIL: Response is not empty, " + xhr.responseText);

        logMissing = document.getElementById('console').innerHTML;
        document.getElementById('console').innerHTML = "";
        
        if (logMissing == logExisting)
            log("PASS");
        else {
            log("FAIL. Responding server:");
            document.getElementById('console').innerHTML += logExisting;
            log("Non-existent server:");
            document.getElementById('console').innerHTML += logMissing;
        }
        if (window.testRunner)
            testRunner.notifyDone();
    }

    xhr = new XMLHttpRequest;
    xhr.onreadystatechange = function() { log("onreadystatechange " + xhr.readyState) }
    xhr.onload = function() { log("onload") }
    xhr.onloadstart = function() { log("onloadstart") }
    xhr.onprogress = function() { log("onprogress") }
    xhr.onerror = function() { log("onerror"); setTimeout(doneExisting, 100); }
    xhr.open("GET", "/resources/redirect.php?url=http://localhost:8000/xmlhttprequest/resources/reply.xml", true);
    xhr.send();

</script>
</body>
</html>
