Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 5288866

Browse files
committed
fix($jsonpCallbacks): do not overwrite callbacks added by other apps
1 parent c434bde commit 5288866

File tree

3 files changed

+19
-6
lines changed

3 files changed

+19
-6
lines changed

src/ng/jsonpCallbacks.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
*/
1212
var $jsonpCallbacksProvider = function() {
1313
this.$get = ['$window', function($window) {
14-
var counter = 0;
15-
$window.angular.callbacks = {};
1614
var callbackMap = {};
15+
var callbacks = $window.angular.callbacks = $window.angular.callbacks || {};
16+
callbacks.$$counter = callbacks.$$counter || 0;
1717

1818
function createCallback(callbackId) {
1919
var callback = function(data) {
@@ -35,10 +35,10 @@ var $jsonpCallbacksProvider = function() {
3535
* to pass to the server, which will be used to call the callback with its payload in the JSONP response.
3636
*/
3737
createCallback: function(url) {
38-
var callbackId = '_' + (counter++).toString(36);
38+
var callbackId = '_' + (callbacks.$$counter++).toString(36);
3939
var callbackPath = 'angular.callbacks.' + callbackId;
4040
var callback = createCallback(callbackId);
41-
callbackMap[callbackPath] = $window.angular.callbacks[callbackId] = callback;
41+
callbackMap[callbackPath] = callbacks[callbackId] = callback;
4242
return callbackPath;
4343
},
4444
/**
@@ -75,7 +75,7 @@ var $jsonpCallbacksProvider = function() {
7575
*/
7676
removeCallback: function(callbackPath) {
7777
var callback = callbackMap[callbackPath];
78-
delete $window.angular.callbacks[callback.id];
78+
delete callbacks[callback.id];
7979
delete callbackMap[callbackPath];
8080
}
8181
};

src/ngMock/angular-mocks.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2954,7 +2954,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
29542954
angular.forEach(angular.callbacks, function(val, key) {
29552955
delete angular.callbacks[key];
29562956
});
2957-
angular.callbacks.counter = 0;
2957+
angular.callbacks.$$counter = 0;
29582958
};
29592959

29602960
(window.beforeEach || window.setup)(module.$$beforeEach);

test/ng/jsonpCallbacksSpec.js

+13
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,19 @@ describe('$jsonpCallbacks', function() {
3636
$jsonpCallbacks.createCallback('http://some.dummy.com/jsonp/request');
3737
expect($window.angular.callbacks._3).toEqual(jasmine.any(Function));
3838
}));
39+
40+
it('should produce unique callback paths across multiple instances', function() {
41+
var $jsonpCallbacks1 = angular.injector(['ng', 'ngMock']).get('$jsonpCallbacks');
42+
var $jsonpCallbacks2 = angular.injector(['ng', 'ngMock']).get('$jsonpCallbacks');
43+
44+
var path1 = $jsonpCallbacks1.createCallback('http://some.dummy.com/jsonp/request');
45+
var path2 = $jsonpCallbacks2.createCallback('http://some.dummy.com/jsonp/request');
46+
47+
expect(path1).toBe('angular.callbacks._0');
48+
expect(path2).toBe('angular.callbacks._1');
49+
expect(angular.callbacks._0).toBeDefined();
50+
expect(angular.callbacks._1).toBeDefined();
51+
});
3952
});
4053

4154

0 commit comments

Comments
 (0)