<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>
