From 80801fd6479cecfead5cd86d92f97805feb8937e Mon Sep 17 00:00:00 2001 From: Ricardo Bin Date: Wed, 26 Jun 2013 16:10:17 -0300 Subject: [PATCH] feat($http): setting JSONP callback name --- src/ng/httpBackend.js | 11 ++++++++--- test/ng/httpBackendSpec.js | 8 ++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/ng/httpBackend.js b/src/ng/httpBackend.js index 69711df23bb2..96c9ecee77f2 100644 --- a/src/ng/httpBackend.js +++ b/src/ng/httpBackend.js @@ -38,12 +38,17 @@ function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument, 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; }; - - var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), + + var jsonpDone = jsonpReq(url.replace(/JSON_CALLBACK\((.*)\)|JSON_CALLBACK/, 'angular.callbacks.' + callbackId), function() { if (callbacks[callbackId].data) { completeRequest(callback, 200, callbacks[callbackId].data); diff --git a/test/ng/httpBackendSpec.js b/test/ng/httpBackendSpec.js index c65ab2e17c5b..57893cccb8eb 100644 --- a/test/ng/httpBackendSpec.js +++ b/test/ng/httpBackendSpec.js @@ -327,6 +327,14 @@ describe('$httpBackend', function() { expect(callback).toHaveBeenCalledOnce(); }); + 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