<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 load ProgressEvent when a synchronous upload request completes normally.<br/>
Verify that a loadend ProgressEvent is not dispatched after abort() is called on completed request.</p>
<p>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("POST", "resources/post-echo.cgi", false); 
    xhr.send("data");
    
    completeTest(" load loadend");
}

function testAbort()
{
    results = "";

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

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

testNormal();
testAbort();

</script>
</body>
