<html>
<head>
<script>
var ranProgressHandler = false;
var completedUpload = false;
var asyncXHR;
var lastSeenProgress = 0;
var data;
function sendResults(failures) {
var resultString = failures.length ? failures.join('\n') : "success";
window.domAutomationController.send(resultString);
}
function progressListener(e) {
var progress = e.loaded;
var failureList = [];
// The |progress| event should not be called after the |load| event.
// e.loaded should never hold the same value twice.
if (completedUpload)
failureList.push('Progress event occurred after load event.');
if (progress <= lastSeenProgress)
failureList.push('No forward upload progress between events.');
if (e.total != data.length)
failureList.push('Upload total does not match payload size.');
if (progress > e.total)
failureList.push('Upload progress exceeds payload size.');
if (failureList.length)
sendResults(failureList);
lastSeenProgress = progress;
ranProgressHandler = true;
}
function completedUploadFunc(e) {
completedUpload = true;
}
function onFinished(e) {
var failureList = [];
if (!ranProgressHandler)
failureList.push('Finished upload without firing a progress event.');
if (lastSeenProgress != data.length)
failureList.push('Final progress event before data transfer completed.');
if (this.responseText != 'hello') {
failureList.push(
'Receieved responseText: \'' + this.responseText +'\'. Expected: \'hello\'.');
}
sendResults(failureList);
}
function onError(e) {
sendResults(['Received an XHR error event.']);
}
function WaitForAsyncXHR(url, payloadSize) {
// Build a long string, fast.
// Note: payloadSize will be of the form 2*3^x.
data = 'yo';
while(data.length !== payloadSize) {
data = data + data + data;
}
asyncXHR = new XMLHttpRequest();
asyncXHR.addEventListener('load', onFinished);
asyncXHR.addEventListener('error', onError);
asyncXHR.upload.addEventListener('progress', progressListener);
asyncXHR.upload.addEventListener('load', completedUploadFunc);
asyncXHR.open('POST', url, true);
asyncXHR.setRequestHeader('Content-Type', 'text/plain');
asyncXHR.send(data);
}
</script>
</head>
<body>
This page sends an asynchronous XMLHttpRequest on calling WaitForAsyncXHR(url).
</body>
</html>