<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 a load, error, or abort ProgressEvent when a synchronous request completes normally, fails, or is aborted respectively.</p>
<p>PASS PASS 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;

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

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

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

function testNormal()
{
    results = "";

    xhr.onloadstart = logUnexpectedProgressEvent;
    xhr.onabort = logUnexpectedProgressEvent;
    xhr.onerror = logUnexpectedProgressEvent;
    xhr.onload = logProgressEvent;
    xhr.onloadend = logProgressEvent;

    xhr.open("GET", "resources/get.txt", false); 
    xhr.send();
    
    completeTest(" load loadend");
}

function testError()
{
    results = "";

    xhr.onloadstart = logUnexpectedProgressEvent;
    xhr.onabort = logUnexpectedProgressEvent;
    xhr.onerror = logProgressEvent;
    xhr.onload = logUnexpectedProgressEvent;
    xhr.onloadend = logProgressEvent;

    xhr.open("GET", "resources/infinite-loop.php", false); 
    try {
        xhr.send();
    }
    catch (e) {
        if (e.code != e.NETWORK_ERR)
            results += " " + e;
    }
    
    completeTest(" error loadend");
}

function testAbort()
{
    results = "";

    xhr.onloadstart = logUnexpectedProgressEvent;
    xhr.onabort = logProgressEvent;
    xhr.onerror = logUnexpectedProgressEvent;
    xhr.onload = logUnexpectedProgressEvent;
    xhr.onloadend = logProgressEvent;
    xhr.onreadystatechange = function(e) {
        if (xhr.readyState == xhr.DONE)
            xhr.abort();
    }

    xhr.open("GET", "resources/get.txt", false); 
    try {
        xhr.send();
    }
    catch (e) {
        if (e.code != e.NETWORK_ERR)
            results += " " + e;
    }
    
    completeTest(" abort loadend");
}

testNormal();
testError();
testAbort();

</script>
</body>
