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