<html>
<head>
    <title> Test case for bug 18655 </title>
</head>
<body>
<p> Test case for Bug <a href="https://bugs.webkit.org/show_bug.cgi?id=18655">18655</a>: [XHR] onProgress event
needs to be dispatched according to what the specification states </p>
<p> This test verify that we "dispatch a progress event called progress about
every 50ms or for every byte received, whichever is least frequent".</p>
<p> You should see a sequence of 5 PASSED. </p>
<p id="console"></p>

<script type="text/javascript">
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

function log(message)
{
    document.getElementById("console").appendChild(document.createTextNode(message));
    document.getElementById("console").appendChild(document.createElement("br"));
}

var testsCompleted = 0;

function test(iteration, delay, compare, testDescription)
{
    var count = 0;
    var sawReadyStateDONE = false;
    function onProgress(e) {
        ++count;
        if (sawReadyStateDONE)
            log("FAILED: saw 'progress' event after readystate 'DONE' event for " + testDescription);
    }

    function onReadyState(e) {
        if (this.readyState == 4) {
            sawReadyStateDONE = true;
            var passed =  compare(count, iteration);
            log(passed ? "PASSED" : "FAILED (count was " + count + ") for " + testDescription);
            ++testsCompleted;
            if (testsCompleted == 5) {
                if (window.testRunner)
                    testRunner.notifyDone();
            }
        }
    }

    var req = new XMLHttpRequest();
    req.onprogress = onProgress;
    req.onreadystatechange = onReadyState;
    req.open("GET", "resources/download-with-delay.php?iteration=" + iteration + "&delay=" + delay, true);
    req.send(null);
}

try {
// Number of chunks to send, delay between chunks
var strictTests = [ 2, 80,
                    1, 1000,
                    2, 50 ];
function compareStrict(count, iteration)
{
    return count == iteration;
}

var i = 0;
while (strictTests.length) {
    var iteration = strictTests.shift();
    var delay = strictTests.shift();
    test(iteration, delay, compareStrict, "strict test " + ++i);
}

// Number of chunks to send, delay between chunks
var throttledTests = [ 5, 20,
                       6, 30 ];
function compareThrottled(count, iteration)
{
    return count < iteration;
}

i = 0;
while(throttledTests.length) {
    var iteration = throttledTests.shift();
    var delay = throttledTests.shift();
    test(iteration, delay, compareThrottled, "throttled test " + ++i);
}
} catch(e) {
    log("FAILED: exception raised: " + e.message);
}
</script>
</body>
</html>
