<body onload="test();">
<p>Test that we don't hang xhr loads from cache when the resposne body was empty.<p>
<pre id=log></pre>
<script type="text/javascript">

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

function log(msg) {
    document.getElementById("log").innerHTML += msg + "\n";
}

function test() {
    var request = new XMLHttpRequest();
    request.addEventListener("progress", function() { log("progress") }, false);
    request.addEventListener("load", function() { log("load"); repeat(); }, false);
    request.addEventListener("error", function() { log("error"); repeat(); }, false);
    request.addEventListener("abort", function() { log("abort"); repeat(); }, false);
    request.open("GET", "resources/body.py", true);
    request.send();
}

var secondRequest;

function secondRequestFinished() {
    log("load");
    log(secondRequest.response);
    end();
}

function repeat() {
    secondRequest = new XMLHttpRequest();
    secondRequest.addEventListener("progress", function() { log("progress") }, false);
    secondRequest.addEventListener("load", function() { secondRequestFinished(); }, false);
    secondRequest.addEventListener("error", function() { log("error"); end(); }, false);
    secondRequest.addEventListener("abort", function() { log("abort"); end(); }, false);
    secondRequest.open("POST", "resources/body.py", true);
    secondRequest.send("This http body should be visible");
}

function end() {
    log("DONE");
    if (window.testRunner)
        testRunner.notifyDone();
}
</script>
</body>
