Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* Test imported from Alex Vincent's XHR2 timeout tests, written for Mozilla. | 1 /* Test imported from Alex Vincent's XHR2 timeout tests, written for Mozilla. |
| 2 https://hg.mozilla.org/mozilla-central/file/tip/content/base/test/ | 2 https://hg.mozilla.org/mozilla-central/file/tip/content/base/test/ |
| 3 Released into the public domain, according to | 3 Released into the public domain, according to |
| 4 https://bugzilla.mozilla.org/show_bug.cgi?id=525816#c86 | 4 https://bugzilla.mozilla.org/show_bug.cgi?id=525816#c86 |
| 5 */ | 5 */ |
| 6 | 6 |
| 7 /* Notes: | 7 /* Notes: |
| 8 - All times are expressed in milliseconds in this test suite. | 8 - All times are expressed in milliseconds in this test suite. |
| 9 - Test harness code is at the end of this file. | 9 - Test harness code is at the end of this file. |
| 10 - We generate only one request at a time, to avoid overloading the HTTP | 10 - We generate only one request at a time, to avoid overloading the HTTP |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 186 this.request = req; | 186 this.request = req; |
| 187 req.open("GET", STALLED_REQUEST_URL); | 187 req.open("GET", STALLED_REQUEST_URL); |
| 188 var me = this; | 188 var me = this; |
| 189 function handleEvent(e) { return me.handleEvent(e); }; | 189 function handleEvent(e) { return me.handleEvent(e); }; |
| 190 req.onerror = handleEvent; | 190 req.onerror = handleEvent; |
| 191 req.onload = handleEvent; | 191 req.onload = handleEvent; |
| 192 req.onabort = handleEvent; | 192 req.onabort = handleEvent; |
| 193 req.ontimeout = handleEvent; | 193 req.ontimeout = handleEvent; |
| 194 | 194 |
| 195 req.timeout = TIME_REGULAR_TIMEOUT; | 195 req.timeout = TIME_REGULAR_TIMEOUT; |
| 196 var _this = this; | |
| 197 | 196 |
| 198 function abortReq() { | 197 function abortReq() { |
| 199 req.abort(); | 198 if (me.request.readyState == XMLHttpRequest.DONE || me.request.readyState > XMLHttpRequest.OPENED) { |
|
tyoshino (SeeGerritForStatus)
2013/11/07 13:38:05
maybe this should be
me.request.readyState < XMLHt
sof
2013/11/07 14:34:14
Much better, that was the intent & close enough (i
| |
| 199 if (me.abortDelay > TIME_REGULAR_TIMEOUT) | |
| 200 me.timeoutEventFired() | |
| 201 else | |
| 202 me.noEventsFired(); | |
| 203 } else | |
| 204 req.abort(); | |
| 200 } | 205 } |
| 201 | 206 |
| 202 if (!this.shouldAbort) { | 207 if (!this.shouldAbort) { |
| 203 self.setTimeout(function() { | 208 self.setTimeout(function() { |
| 204 try { | 209 try { |
| 205 _this.noEventsFired(); | 210 me.noEventsFired(); |
| 206 } | 211 } |
| 207 catch (e) { | 212 catch (e) { |
| 208 ok(false, "Unexpected error: " + e); | 213 ok(false, "Unexpected error: " + e); |
| 209 TestCounter.testComplete(); | 214 TestCounter.testComplete(); |
| 210 } | 215 } |
| 211 }, TIME_NORMAL_LOAD); | 216 }, TIME_NORMAL_LOAD); |
| 212 } | 217 } |
| 213 else { | 218 else { |
| 214 // Abort events can only be triggered on sent requests. | 219 // Abort events can only be triggered on sent requests. |
| 215 req.send(); | 220 req.send(); |
| 216 if (this.abortDelay == -1) { | 221 if (this.abortDelay == -1) { |
| 217 abortReq(); | 222 abortReq(); |
| 218 } | 223 } |
| 219 else { | 224 else { |
| 220 self.setTimeout(abortReq, this.abortDelay); | 225 self.setTimeout(abortReq, this.abortDelay); |
| 221 } | 226 } |
| 222 } | 227 } |
| 223 }, | 228 }, |
| 224 | 229 |
| 225 /** | 230 /** |
| 226 * Ensure that no events fired at all, especially not our timeout event. | 231 * Ensure that no events fired at all, especially not our timeout event. |
| 227 */ | 232 */ |
| 228 noEventsFired: function() { | 233 noEventsFired: function() { |
| 229 ok(!this.hasFired, "No events should fire for an unsent, unaborted request") ; | 234 ok(!this.hasFired, "No events should fire for an unsent, unaborted request") ; |
| 230 // We're done; if timeout hasn't fired by now, it never will. | 235 // We're done; if timeout hasn't fired by now, it never will. |
| 231 TestCounter.testComplete(); | 236 TestCounter.testComplete(); |
| 232 }, | 237 }, |
| 233 | 238 |
| 234 /** | 239 /** |
| 240 * Ensure that an event fired, our timeout event. | |
| 241 */ | |
| 242 timeoutEventFired: function() { | |
| 243 ok(this.hasFired && this.eventFired == "timeout", "A timeout event should ha ve fired"); | |
| 244 TestCounter.testComplete(); | |
| 245 }, | |
| 246 | |
| 247 /** | |
| 235 * Get a message describing this test. | 248 * Get a message describing this test. |
| 236 * | 249 * |
| 237 * @returns {String} The test description. | 250 * @returns {String} The test description. |
| 238 */ | 251 */ |
| 239 getMessage: function() { | 252 getMessage: function() { |
| 240 return "time to abort is " + this.abortDelay + ", timeout set at " + TIME_RE GULAR_TIMEOUT; | 253 return "time to abort is " + this.abortDelay + ", timeout set at " + TIME_RE GULAR_TIMEOUT; |
| 241 }, | 254 }, |
| 242 | 255 |
| 243 /** | 256 /** |
| 244 * Check the event received, and if it's the right (and only) one we get. | 257 * Check the event received, and if it's the right (and only) one we get. |
| 245 * | 258 * |
| 246 * WebKit fires abort events even for DONE and UNSENT states, which is | |
| 247 * discussed in http://webkit.org/b/98404 | |
| 248 * That's why we chose to accept secondary "abort" events in this test. | |
| 249 * | |
| 250 * @param {DOMProgressEvent} evt An event of type "load" or "timeout". | 259 * @param {DOMProgressEvent} evt An event of type "load" or "timeout". |
| 251 */ | 260 */ |
| 252 handleEvent: function(evt) { | 261 handleEvent: function(evt) { |
| 253 if (this.hasFired && evt.type != "abort") { | 262 if (this.hasFired) { |
| 254 ok(false, "Only abort event should fire: " + this.getMessage()); | 263 ok(false, "Only one event should fire: " + this.getMessage()); |
| 255 return; | 264 return; |
| 256 } | 265 } |
| 257 | 266 |
| 258 var expectedEvent = (this.abortDelay >= TIME_REGULAR_TIMEOUT && !this.hasFir ed) ? "timeout" : "abort"; | 267 var expectedEvent = (this.abortDelay >= TIME_REGULAR_TIMEOUT) ? "timeout" : "abort"; |
| 259 this.hasFired = true; | 268 this.hasFired = true; |
| 269 this.eventFired = evt.type; | |
| 260 is(evt.type, expectedEvent, this.getMessage()); | 270 is(evt.type, expectedEvent, this.getMessage()); |
| 261 TestCounter.testComplete(); | 271 TestCounter.testComplete(); |
| 262 } | 272 } |
| 263 }; | 273 }; |
| 264 | 274 |
| 265 var SyncRequestSettingTimeoutAfterOpen = { | 275 var SyncRequestSettingTimeoutAfterOpen = { |
| 266 startXHR: function() { | 276 startXHR: function() { |
| 267 var pass = false; | 277 var pass = false; |
| 268 var req = new XMLHttpRequest(); | 278 var req = new XMLHttpRequest(); |
| 269 req.open("GET", STALLED_REQUEST_URL, false); | 279 req.open("GET", STALLED_REQUEST_URL, false); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 366 } | 376 } |
| 367 } | 377 } |
| 368 }; | 378 }; |
| 369 | 379 |
| 370 self.addEventListener("message", function (event) { | 380 self.addEventListener("message", function (event) { |
| 371 if (event.data.type == "start") { | 381 if (event.data.type == "start") { |
| 372 TestRequests = TestRequestGroups[event.data.group]; | 382 TestRequests = TestRequestGroups[event.data.group]; |
| 373 TestCounter.next(); | 383 TestCounter.next(); |
| 374 } | 384 } |
| 375 }); | 385 }); |
| OLD | NEW |