aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/service/browser.js16
-rw-r--r--test/service/browserSpecs.js17
2 files changed, 30 insertions, 3 deletions
diff --git a/src/service/browser.js b/src/service/browser.js
index b38c9211..74bea44c 100644
--- a/src/service/browser.js
+++ b/src/service/browser.js
@@ -95,6 +95,7 @@ function Browser(window, document, body, XHR, $log, $sniffer) {
* <li><tt>X-Requested-With</tt>: <tt>XMLHttpRequest</tt></li>
* </ul>
*
+ * @param {number=} timeout Timeout in ms, when the request will be aborted
* @returns {XMLHttpRequest|undefined} Raw XMLHttpRequest object or undefined when JSONP method
*
* @description
@@ -102,7 +103,7 @@ function Browser(window, document, body, XHR, $log, $sniffer) {
*
* TODO(vojta): change signature of this method to (method, url, data, headers, callback)
*/
- self.xhr = function(method, url, post, callback, headers) {
+ self.xhr = function(method, url, post, callback, headers, timeout) {
outstandingRequestCount ++;
if (lowercase(method) == 'jsonp') {
var callbackId = ("angular_" + Math.random() + '_' + (idCounter++)).replace(/\d\./, '');
@@ -126,21 +127,30 @@ function Browser(window, document, body, XHR, $log, $sniffer) {
if (value) xhr.setRequestHeader(key, value);
});
+ var status;
xhr.send(post || '');
// IE6, IE7 bug - does sync when serving from cache
if (xhr.readyState == 4) {
setTimeout(function() {
- completeOutstandingRequest(callback, fixStatus(xhr.status), xhr.responseText);
+ completeOutstandingRequest(callback, fixStatus(status || xhr.status), xhr.responseText);
}, 0);
} else {
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
- completeOutstandingRequest(callback, fixStatus(xhr.status), xhr.responseText);
+ completeOutstandingRequest(callback, fixStatus(status || xhr.status),
+ xhr.responseText);
}
};
}
+ if (timeout > 0) {
+ setTimeout(function() {
+ status = -1;
+ xhr.abort();
+ }, timeout);
+ }
+
return xhr;
}
};
diff --git a/test/service/browserSpecs.js b/test/service/browserSpecs.js
index 05c1dec0..566ffb09 100644
--- a/test/service/browserSpecs.js
+++ b/test/service/browserSpecs.js
@@ -228,6 +228,23 @@ describe('browser', function() {
expect(browser.xhr('GET', '/url', null, noop)).toBe(xhr);
});
+ it('should abort request on timeout', function() {
+ var callback = jasmine.createSpy('done').andCallFake(function(status, response) {
+ expect(status).toBe(-1);
+ });
+
+ browser.xhr('GET', '/url', null, callback, {}, 2000);
+ xhr.abort = jasmine.createSpy('xhr.abort');
+
+ fakeWindow.setTimeout.flush();
+ expect(xhr.abort).toHaveBeenCalledOnce();
+
+ xhr.status = 0;
+ xhr.readyState = 4;
+ xhr.onreadystatechange();
+ expect(callback).toHaveBeenCalledOnce();
+ });
+
it('should be async even if xhr.send() is sync', function() {
// IE6, IE7 is sync when serving from cache
var xhr;