| OLD | NEW |
| 1 <html> | 1 <html> |
| 2 <head> | 2 <head> |
| 3 <script> | 3 <script> |
| 4 var ranProgressHandler = false; | 4 var ranProgressHandler = false; |
| 5 var completedUpload = false; | 5 var completedUpload = false; |
| 6 | 6 |
| 7 var asyncXHR; | 7 var asyncXHR; |
| 8 var lastSeenProgress = 0; | 8 var lastSeenProgress = 0; |
| 9 // Build a long string, fast. | 9 // Build a long string, fast. |
| 10 // data.length = 2 * 3^15 = 28697814 | 10 // data.length = 2 * 3^15 = 28697814 |
| 11 | 11 var sent_data; |
| 12 var smaller_data; |
| 12 var data = 'yo'; | 13 var data = 'yo'; |
| 13 var iterations = 15; | 14 var iterations = 15; |
| 14 for (var i = 0; i < iterations; i++) { | 15 for (var i = 0; i < iterations; i++) { |
| 15 data = data + data + data; | 16 data = data + data + data; |
| 17 if (i === 13) |
| 18 smaller_data = data; |
| 16 } | 19 } |
| 17 | 20 |
| 18 function sendResults(failures) { | 21 function sendResults(failures) { |
| 19 var resultString = failures.length ? failures.join('\n') : "success"; | 22 var resultString = failures.length ? failures.join('\n') : "success"; |
| 20 window.domAutomationController.send(resultString); | 23 window.domAutomationController.send(resultString); |
| 21 } | 24 } |
| 22 | 25 |
| 23 function progressListener(e) { | 26 function progressListener(e) { |
| 24 var progress = e.loaded; | 27 var progress = e.loaded; |
| 25 var failureList = []; | 28 var failureList = []; |
| 26 | 29 |
| 27 // The |progress| event should not be called after the |load| event. | 30 // The |progress| event should not be called after the |load| event. |
| 28 // e.loaded should never hold the same value twice. | 31 // e.loaded should never hold the same value twice. |
| 29 if (completedUpload) | 32 if (completedUpload) |
| 30 failureList.push('Progress event occurred after load event.'); | 33 failureList.push('Progress event occurred after load event.'); |
| 31 if (progress <= lastSeenProgress) | 34 if (progress <= lastSeenProgress) |
| 32 failureList.push('No forward upload progress between events.'); | 35 failureList.push('No forward upload progress between events.'); |
| 33 if (e.total != data.length) | 36 if (e.total != sent_data.length) |
| 34 failureList.push('Upload total does not match payload size.'); | 37 failureList.push('Upload total does not match payload size.'); |
| 35 if (progress > e.total) | 38 if (progress > e.total) |
| 36 failureList.push('Upload progress exceeds payload size.'); | 39 failureList.push('Upload progress exceeds payload size.'); |
| 37 | 40 |
| 38 if (failureList.length) | 41 if (failureList.length) |
| 39 sendResults(failureList); | 42 sendResults(failureList); |
| 40 | 43 |
| 41 lastSeenProgress = progress; | 44 lastSeenProgress = progress; |
| 42 ranProgressHandler = true; | 45 ranProgressHandler = true; |
| 43 } | 46 } |
| 44 | 47 |
| 45 function completedUpload(e) { | 48 function completedUpload(e) { |
| 46 completedUpload = true; | 49 completedUpload = true; |
| 47 } | 50 } |
| 48 | 51 |
| 49 function onFinished(e) { | 52 function onFinished(e) { |
| 50 var failureList = []; | 53 var failureList = []; |
| 51 if (!ranProgressHandler) | 54 if (!ranProgressHandler) |
| 52 failureList.push('Finished upload without firing a progress event.'); | 55 failureList.push('Finished upload without firing a progress event.'); |
| 53 if (lastSeenProgress != data.length) | 56 if (lastSeenProgress != sent_data.length) |
| 54 failureList.push('Final progress event before data transfer completed.'); | 57 failureList.push('Final progress event before data transfer completed.'); |
| 55 if (this.responseText != 'hello') { | 58 if (this.responseText != 'hello') { |
| 56 failureList.push( | 59 failureList.push( |
| 57 'Receieved responseText: \'' + this.responseText +'\'. Expected: \'hello
\'.'); | 60 'Receieved responseText: \'' + this.responseText +'\'. Expected: \'hello
\'.'); |
| 58 } | 61 } |
| 59 sendResults(failureList); | 62 sendResults(failureList); |
| 60 } | 63 } |
| 61 | 64 |
| 62 function onError(e) { | 65 function onError(e) { |
| 63 sendResults(['Received an XHR error event.']); | 66 sendResults(['Received an XHR error event.']); |
| 64 } | 67 } |
| 65 | 68 |
| 66 function WaitForAsyncXHR(url) { | 69 function WaitForAsyncXHR(url, data_size) { |
| 67 asyncXHR = new XMLHttpRequest(); | 70 asyncXHR = new XMLHttpRequest(); |
| 68 asyncXHR.addEventListener('load', onFinished); | 71 asyncXHR.addEventListener('load', onFinished); |
| 69 asyncXHR.addEventListener('error', onError); | 72 asyncXHR.addEventListener('error', onError); |
| 70 | 73 |
| 71 asyncXHR.upload.addEventListener('progress', progressListener); | 74 asyncXHR.upload.addEventListener('progress', progressListener); |
| 72 asyncXHR.upload.addEventListener('load', completedUpload); | 75 asyncXHR.upload.addEventListener('load', completedUpload); |
| 73 | 76 |
| 74 asyncXHR.open('POST', url, true); | 77 asyncXHR.open('POST', url, true); |
| 75 | 78 |
| 76 asyncXHR.setRequestHeader('Content-Type', 'text/plain'); | 79 asyncXHR.setRequestHeader('Content-Type', 'text/plain'); |
| 77 asyncXHR.send(data); | 80 if (data_size === "small") |
| 81 sent_data = smaller_data; |
| 82 else if (data_size === "large") |
| 83 sent_data = data; |
| 84 asyncXHR.send(sent_data); |
| 78 } | 85 } |
| 79 </script> | 86 </script> |
| 80 </head> | 87 </head> |
| 81 <body> | 88 <body> |
| 82 This page sends an asynchronous XMLHttpRequest on calling WaitForAsyncXHR(url). | 89 This page sends an asynchronous XMLHttpRequest on calling WaitForAsyncXHR(url). |
| 83 </body> | 90 </body> |
| 84 </html> | 91 </html> |
| OLD | NEW |