<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.upload.onabort = function() { log("upload.onabort") }
        xhr.upload.onerror = function() { log("upload.onerror") }
        xhr.upload.onload = function() { log("upload.onload") }
        xhr.upload.onloadstart = function() { log("upload.onloadstart") }
        xhr.upload.onprogress = function() { log("upload.onprogress") }
        xhr.open("POST", "/resources/redirect.php?url=http://localhost:7/", true); // A port that will likely refuse the connection.
        xhr.send("Text");
    }

    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.upload.onabort = function() { log("upload.onabort") }
    xhr.upload.onerror = function() { log("upload.onerror") }
    xhr.upload.onload = function() { log("upload.onload") }
    xhr.upload.onloadstart = function() { log("upload.onloadstart") }
    xhr.upload.onprogress = function() { log("upload.onprogress") }
    xhr.open("POST", "/resources/redirect.php?url=http://localhost:8000/xmlhttprequest/resources/reply.xml", true);
    xhr.send("Text");

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