<html>
<head></head>
<body>

<p>Test bug 13141 : XMLHttpRequest should set readyState to 0 after abort() </p>
<p>Updated for bug 16989: Add send() flag checks in XmlHttpRequest </p>
<p>Should see "PASS" two times:</p>
<div id="ans"></div>

<script type="text/javascript">
function log(message) {
    document.getElementById("ans").appendChild(document.createTextNode(message));
    document.getElementById("ans").appendChild(document.createElement("br"));
}

// Used to detect if a readystate event is dispatched
function catchReadystateEventAbort() {
    log("FAILED (readystate event send)");
}

function testAbortDoNotDispatchEvent(num)
{
    var xhr;

    if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
    } else {
        try {
            xhr = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (ex) {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }

    xhr.onreadystatechange = function () {
        if (this.readyState == num) {
            ++finishedTests;
            this.onreadystatechange = catchReadystateEventAbort;
            this.abort();
            if (this.readyState == 0)
                log("PASS");
            else
                log("FAILED");
        }
        
        if (finishedTests == abortToDo.length && window.testRunner)
            testRunner.notifyDone();
    }

    xhr.open("GET", "resources/1251.html", true);

    // We want to be able to test in the OPENED state with the send() flag to false
    // so do not call send in that case
    if (num != 1)
        xhr.send(null);
}

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

var finishedTests = 0;

var abortToDo = ['1', '4'];

for (i = 0; i < abortToDo.length; i++)
    testAbortDoNotDispatchEvent(abortToDo[i]);

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