diff --git a/src/ng/httpBackend.js b/src/ng/httpBackend.js index 742d7aa86a85..ea0b59c02161 100644 --- a/src/ng/httpBackend.js +++ b/src/ng/httpBackend.js @@ -33,13 +33,18 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc url = url || $browser.url(); if (lowercase(method) == 'jsonp') { - var callbackId = '_' + (callbacks.counter++).toString(36); + var callbackId = (/JSON_CALLBACK\((.*)\)/).exec(url) || ('_' + (callbacks.counter++).toString(36)); + + if (callbackId.constructor.name === "Array") { + callbackId = callbackId[1]; + } + callbacks[callbackId] = function(data) { callbacks[callbackId].data = data; callbacks[callbackId].called = true; }; - var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), + var jsonpDone = jsonpReq(url.replace(/JSON_CALLBACK\((.*)\)|JSON_CALLBACK/, 'angular.callbacks.' + callbackId), callbackId, function(status, text) { completeRequest(callback, status, callbacks[callbackId].data, "", text); callbacks[callbackId] = noop; diff --git a/test/ng/httpBackendSpec.js b/test/ng/httpBackendSpec.js index 2c1da6eba4bb..5b7e41ae3868 100644 --- a/test/ng/httpBackendSpec.js +++ b/test/ng/httpBackendSpec.js @@ -354,6 +354,14 @@ describe('$httpBackend', function() { expect(callbacks[callbackId]).toBe(angular.noop); }); + it('should set the callback name when use JSONP_CALLBACK with a parameter', function() { + $backend('JSONP', 'http://example.org/path?cb=JSON_CALLBACK(someCallback)', null, callback); + var script = fakeDocument.$$scripts.shift(), + url = script.src.match(SCRIPT_URL); + + expect(url[1]).toBe('http://example.org/path'); + expect(url[2]).toBe('someCallback'); + }); // TODO(vojta): test whether it fires "async-start" // TODO(vojta): test whether it fires "async-end" on both success and error