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

Commit 1778d34

Browse files
committed
fix($jsonpCallbacks): do not overwrite callbacks added by other apps
Closes #14824
1 parent 4724d56 commit 1778d34

File tree

4 files changed

+20
-12
lines changed

4 files changed

+20
-12
lines changed

src/AngularPublic.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ function publishExternalAPI(angular) {
149149
'isDate': isDate,
150150
'lowercase': lowercase,
151151
'uppercase': uppercase,
152-
'callbacks': {counter: 0},
152+
'callbacks': {$$counter: 0},
153153
'getTestability': getTestability,
154154
'$$minErr': minErr,
155155
'$$csp': csp,

src/ng/jsonpCallbacks.js

+4-5
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
*/
1212
var $jsonpCallbacksProvider = function() {
1313
this.$get = ['$window', function($window) {
14-
var counter = 0;
15-
$window.angular.callbacks = {};
14+
var callbacks = $window.angular.callbacks;
1615
var callbackMap = {};
1716

1817
function createCallback(callbackId) {
@@ -35,10 +34,10 @@ var $jsonpCallbacksProvider = function() {
3534
* to pass to the server, which will be used to call the callback with its payload in the JSONP response.
3635
*/
3736
createCallback: function(url) {
38-
var callbackId = '_' + (counter++).toString(36);
37+
var callbackId = '_' + (callbacks.$$counter++).toString(36);
3938
var callbackPath = 'angular.callbacks.' + callbackId;
4039
var callback = createCallback(callbackId);
41-
callbackMap[callbackPath] = $window.angular.callbacks[callbackId] = callback;
40+
callbackMap[callbackPath] = callbacks[callbackId] = callback;
4241
return callbackPath;
4342
},
4443
/**
@@ -75,7 +74,7 @@ var $jsonpCallbacksProvider = function() {
7574
*/
7675
removeCallback: function(callbackPath) {
7776
var callback = callbackMap[callbackPath];
78-
delete $window.angular.callbacks[callback.id];
77+
delete callbacks[callback.id];
7978
delete callbackMap[callbackPath];
8079
}
8180
};

src/ngMock/angular-mocks.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2930,7 +2930,7 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
29302930
angular.forEach(angular.callbacks, function(val, key) {
29312931
delete angular.callbacks[key];
29322932
});
2933-
angular.callbacks.counter = 0;
2933+
angular.callbacks.$$counter = 0;
29342934
};
29352935

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

test/ng/jsonpCallbacksSpec.js

+14-5
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,6 @@
22

33
describe('$jsonpCallbacks', function() {
44

5-
beforeEach(module(function($provide) {
6-
// mock out the $window object
7-
$provide.value('$window', { angular: {} });
8-
}));
9-
105
describe('createCallback(url)', function() {
116

127
it('should return a new unique path to a callback function on each call', inject(function($jsonpCallbacks) {
@@ -36,6 +31,19 @@ describe('$jsonpCallbacks', function() {
3631
$jsonpCallbacks.createCallback('http://some.dummy.com/jsonp/request');
3732
expect($window.angular.callbacks._3).toEqual(jasmine.any(Function));
3833
}));
34+
35+
it('should produce unique callback paths across multiple instances', function() {
36+
var $jsonpCallbacks1 = angular.injector(['ng', 'ngMock']).get('$jsonpCallbacks');
37+
var $jsonpCallbacks2 = angular.injector(['ng', 'ngMock']).get('$jsonpCallbacks');
38+
39+
var path1 = $jsonpCallbacks1.createCallback('http://some.dummy.com/jsonp/request');
40+
var path2 = $jsonpCallbacks2.createCallback('http://some.dummy.com/jsonp/request');
41+
42+
expect(path1).toBe('angular.callbacks._0');
43+
expect(path2).toBe('angular.callbacks._1');
44+
expect(angular.callbacks._0).toBeDefined();
45+
expect(angular.callbacks._1).toBeDefined();
46+
});
3947
});
4048

4149

@@ -62,6 +70,7 @@ describe('$jsonpCallbacks', function() {
6270
}));
6371
});
6472

73+
6574
describe('removeCallback(calbackPath)', function() {
6675

6776
it('should remove the callback', inject(function($window, $jsonpCallbacks) {

0 commit comments

Comments
 (0)