<html>
<body>
<p>Test for <a href="rdar://problem/5766352">rdar://problem/5766352</a>:
REGRESSION: XMLHttpRequest.abort() resets response status.
<div id="log"></div>


<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

var req = null;

function log(message)
{
    document.getElementById("log").innerHTML += message + "<br>";
}

function logStatusAndState(comment)
{
    var status;
    var statusText;
    var readyState;
    try
    {
        status = req.status;
    } catch (ex)
    {
        status = "[exception]";
    }

    try
    {
        statusText = req.statusText;
    } catch (ex)
    {
        statusText = "[exception]";
    }

    try
    {
        readyState = req.readyState;
    } catch (ex)
    {
        readyState = "[exception]";
    }

    log((comment ? comment + ". ": "") + "Response status: " + status + "; statusText: '" + statusText + "'; readyState: " + readyState);
}

function callBackFunction()
{
    logStatusAndState("Onreadystatechange");
    
    if (req.readyState == 4)
    {
        log("Aborting the request...");
        req.abort();
        logStatusAndState("After aborting the request");

        log("Reopening the request to check that the status is reset...");
        req.onreadystatechange = callBackFunction;
        req.open("GET", "foobar", true);
        req.onreadystatechange = null;
        req.abort();
        log("Done.");
        if (window.testRunner)
            testRunner.notifyDone();
    }
}

req = new XMLHttpRequest();
logStatusAndState("A newly created request");
req.onreadystatechange = callBackFunction;
log("Opening...");
req.open("GET","status-after-abort.html",true);
logStatusAndState("Opened request");
req.send(null);
logStatusAndState("Sent request");

</script>

</body>
</html>
