<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 abort ProgressEvent when an async upload request is aborted.</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 = " progress abort 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.upload.onprogress = function(e) {
        logProgressEvent(e);
        xhr.abort();
    }
    xhr.upload.onabort = logProgressEvent;
    xhr.upload.onerror = logUnexpectedProgressEvent;
    xhr.upload.onload = logUnexpectedProgressEvent;
    xhr.upload.onloadend = function(e) {
        logProgressEvent(e);
        completeTest();
    }

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

test();

</script>
</body>

