fix($jsonpCallbacks): do not overwrite callbacks added by other apps

Closes #14824
This commit is contained in:
Georgios Kalpakas
2016-06-25 15:50:03 +03:00
parent c855c3fb9f
commit 7a191eb400
4 changed files with 20 additions and 12 deletions
+1 -1
View File
@@ -150,7 +150,7 @@ function publishExternalAPI(angular) {
'isDate': isDate,
'lowercase': lowercase,
'uppercase': uppercase,
'callbacks': {counter: 0},
'callbacks': {$$counter: 0},
'getTestability': getTestability,
'$$minErr': minErr,
'$$csp': csp,
+4 -5
View File
@@ -11,8 +11,7 @@
*/
var $jsonpCallbacksProvider = function() {
this.$get = ['$window', function($window) {
var counter = 0;
$window.angular.callbacks = {};
var callbacks = $window.angular.callbacks;
var callbackMap = {};
function createCallback(callbackId) {
@@ -35,10 +34,10 @@ var $jsonpCallbacksProvider = function() {
* to pass to the server, which will be used to call the callback with its payload in the JSONP response.
*/
createCallback: function(url) {
var callbackId = '_' + (counter++).toString(36);
var callbackId = '_' + (callbacks.$$counter++).toString(36);
var callbackPath = 'angular.callbacks.' + callbackId;
var callback = createCallback(callbackId);
callbackMap[callbackPath] = $window.angular.callbacks[callbackId] = callback;
callbackMap[callbackPath] = callbacks[callbackId] = callback;
return callbackPath;
},
/**
@@ -75,7 +74,7 @@ var $jsonpCallbacksProvider = function() {
*/
removeCallback: function(callbackPath) {
var callback = callbackMap[callbackPath];
delete $window.angular.callbacks[callback.id];
delete callbacks[callback.id];
delete callbackMap[callbackPath];
}
};
+1 -1
View File
@@ -2954,7 +2954,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
angular.forEach(angular.callbacks, function(val, key) {
delete angular.callbacks[key];
});
angular.callbacks.counter = 0;
angular.callbacks.$$counter = 0;
};
(window.beforeEach || window.setup)(module.$$beforeEach);
+14 -5
View File
@@ -2,11 +2,6 @@
describe('$jsonpCallbacks', function() {
beforeEach(module(function($provide) {
// mock out the $window object
$provide.value('$window', { angular: {} });
}));
describe('createCallback(url)', function() {
it('should return a new unique path to a callback function on each call', inject(function($jsonpCallbacks) {
@@ -36,6 +31,19 @@ describe('$jsonpCallbacks', function() {
$jsonpCallbacks.createCallback('http://some.dummy.com/jsonp/request');
expect($window.angular.callbacks._3).toEqual(jasmine.any(Function));
}));
it('should produce unique callback paths across multiple instances', function() {
var $jsonpCallbacks1 = angular.injector(['ng', 'ngMock']).get('$jsonpCallbacks');
var $jsonpCallbacks2 = angular.injector(['ng', 'ngMock']).get('$jsonpCallbacks');
var path1 = $jsonpCallbacks1.createCallback('http://some.dummy.com/jsonp/request');
var path2 = $jsonpCallbacks2.createCallback('http://some.dummy.com/jsonp/request');
expect(path1).toBe('angular.callbacks._0');
expect(path2).toBe('angular.callbacks._1');
expect(angular.callbacks._0).toBeDefined();
expect(angular.callbacks._1).toBeDefined();
});
});
@@ -62,6 +70,7 @@ describe('$jsonpCallbacks', function() {
}));
});
describe('removeCallback(calbackPath)', function() {
it('should remove the callback', inject(function($window, $jsonpCallbacks) {