<html>
<head>
<title>Test case for bug 40952</title>
</head>
<body>
<p> Test case for <a href="https://bugs.webkit.org/show_bug.cgi?id=40952"> bug 40952</a>: Onloadend event is not supported in XMLHttpRequest</p>
<p> Verify that a loadend ProgressEvent is dispatched after the error ProgressEvent when an async request fails.</p>
<p>PASS should appear below:</p>
<p id=console></p>
<script type="text/javascript">
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

function log(message)
{
    var consoleElt = document.getElementById("console");
    consoleElt.appendChild(document.createTextNode(message));
}

var xhr = new XMLHttpRequest();
var results = "";
var expected = " loadstart readyState=DONE error loadend";


function logProgressEvent(e) {
    results += " " + e.type;
}

function logUnexpectedProgressEvent(e) {
    results += " [unexpected ProgressEvent: " + e.type + "]";
    completeTest();   
}

function completeTest()
{
    log(results == expected ? "PASS" : "FAILED results : '" + results + "', expected : '" + expected + "'");
    if (window.testRunner)
        testRunner.notifyDone();
}

function test()
{
    xhr.onreadystatechange = function(e) {
        if (xhr.readyState == xhr.DONE)
            results += " readyState=DONE";
    }
    xhr.onloadstart = logProgressEvent;
    xhr.onabort = logUnexpectedProgressEvent;
    xhr.onerror = logProgressEvent;
    xhr.onload = logUnexpectedProgressEvent;
    xhr.onloadend = function(e) {
        logProgressEvent(e);
        completeTest();
    }

    xhr.open("GET", "resources/infinite-loop.php", true);
    xhr.send();
}

test(); 

</script>
</body>

