<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>XMLHttpRequest: progress events grow response body size</title>
    <meta name="timeout" content="long">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <link rel="help" href="https://xhr.spec.whatwg.org/#the-send()-method" data-tested-assertations="following::a[contains(@href,'#make-progress-notifications')]/.. following::a[contains(@href,'#make-progress-notifications')]/../following:p[1]" />
    <link rel="help" href="https://xhr.spec.whatwg.org/#make-progress-notifications" data-tested-assertations=".." />
    <link rel="help" href="https://xhr.spec.whatwg.org/#handler-xhr-onprogress" data-tested-assertations="/../.." />
    <link rel="help" href="https://xhr.spec.whatwg.org/#event-xhr-progress" data-tested-assertations="/../.." />
</head>

<div id="log"></div>

<script>

function doTest(test, expectedLengthComputable, expectedTotal, url) {
    var client = new XMLHttpRequest();
    var lastSize = 0;

    client.onprogress = test.step_func(function(e) {
        assert_equals(e.total, expectedTotal);
        assert_equals(e.lengthComputable, expectedLengthComputable);

        var currentSize = client.responseText.length;

        if (lastSize > 0 && currentSize > lastSize) {
            // growth from a positive size to bigger!
            test.done();
        }

        lastSize = currentSize;
    });

    client.onreadystatechange = test.step_func(function() {
        if (client.readyState === 4) {
            assert_unreached("onprogress not called multiple times, or response body did not grow.");
        }
    });

    client.open("GET", url);
    client.send(null);
    return client;
}

async_test(function () { doTest(this, false, 0, "resources/trickle.py?count=6&delay=150"); },
           document.title + ', unknown content-length');
async_test(function () { doTest(this, true, 78, "resources/trickle.py?count=6&delay=150&specifylength=1"); },
           document.title + ', known content-length');
</script>
