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