diff --git a/src/ng/httpBackend.js b/src/ng/httpBackend.js index 29f390e0402b..1c7ea81dd026 100644 --- a/src/ng/httpBackend.js +++ b/src/ng/httpBackend.js @@ -84,11 +84,12 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc if(status !== ABORTED) { responseHeaders = xhr.getAllResponseHeaders(); - response = xhr.responseType ? xhr.response : xhr.responseText; + + // responseText is the old-school way of retrieving response (supported by IE8 & 9) + // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) + response = ('response' in xhr) ? xhr.response : xhr.responseText; } - // responseText is the old-school way of retrieving response (supported by IE8 & 9) - // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) completeRequest(callback, status || xhr.status, response, diff --git a/test/ng/httpBackendSpec.js b/test/ng/httpBackendSpec.js index 1be31984d2f3..70186c815b0e 100644 --- a/test/ng/httpBackendSpec.js +++ b/test/ng/httpBackendSpec.js @@ -264,21 +264,45 @@ describe('$httpBackend', function() { }); - it('should set responseType and return xhr.response', function() { - $backend('GET', '/whatever', null, callback, {}, null, null, 'blob'); + describe('responseType', function() { - var xhrInstance = MockXhr.$$lastInstance; - expect(xhrInstance.responseType).toBe('blob'); + it('should set responseType and return xhr.response', function() { + $backend('GET', '/whatever', null, callback, {}, null, null, 'blob'); - callback.andCallFake(function(status, response) { - expect(response).toBe(xhrInstance.response); + var xhrInstance = MockXhr.$$lastInstance; + expect(xhrInstance.responseType).toBe('blob'); + + callback.andCallFake(function(status, response) { + expect(response).toBe(xhrInstance.response); + }); + + xhrInstance.response = {some: 'object'}; + xhrInstance.readyState = 4; + xhrInstance.onreadystatechange(); + + expect(callback).toHaveBeenCalledOnce(); }); - xhrInstance.response = {some: 'object'}; - xhrInstance.readyState = 4; - xhrInstance.onreadystatechange(); - expect(callback).toHaveBeenCalledOnce(); + it('should read responseText if response was not defined', function() { + // old browsers like IE8, don't support responseType, so they always respond with responseText + + $backend('GET', '/whatever', null, callback, {}, null, null, 'blob'); + + var xhrInstance = MockXhr.$$lastInstance; + var responseText = '{"some": "object"}'; + expect(xhrInstance.responseType).toBe('blob'); + + callback.andCallFake(function(status, response) { + expect(response).toBe(responseText); + }); + + xhrInstance.responseText = responseText; + xhrInstance.readyState = 4; + xhrInstance.onreadystatechange(); + + expect(callback).toHaveBeenCalledOnce(); + }); });