<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 load ProgressEvent when an async upload request completes normally.</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 load 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)
            completeTest();
    }
    xhr.upload.onloadstart = logProgressEvent;
    xhr.upload.onabort = logUnexpectedProgressEvent;
    xhr.upload.onerror = logUnexpectedProgressEvent;
    xhr.upload.onload = logProgressEvent;
    xhr.upload.onloadend = logProgressEvent;

    xhr.open("POST", "resources/post-echo.cgi", true);
    xhr.send("data");
}

test();

</script>
</body>
