aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Minar2014-01-04 23:42:44 -0800
committerIgor Minar2014-01-10 02:25:36 -0800
commita9cccbe14f1bd9048f5dab4443f58c804d4259a1 (patch)
treeb86682b041de5051fa2a1a354d1685e72d8a483e
parent36c9e42de2d78af39600c588b06f2a52199ee8b6 (diff)
downloadangular.js-a9cccbe14f1bd9048f5dab4443f58c804d4259a1.tar.bz2
fix($http): return responseText on IE8 for requests with responseType set
Closes #4464 Closes #4738 Closes #5636
-rw-r--r--src/ng/httpBackend.js7
-rw-r--r--test/ng/httpBackendSpec.js44
2 files changed, 38 insertions, 13 deletions
diff --git a/src/ng/httpBackend.js b/src/ng/httpBackend.js
index d2806e3e..f52e4611 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 92781f9a..2a3f6012 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();
+ });
});