diff --git a/src/Angular.js b/src/Angular.js index 127be95d4a29..9e08d4babe07 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -101,8 +101,6 @@ var $$scope = '$scope', angularWidget = extensionMap(angular, 'widget', shivForIE), /** @name angular.module.ng */ angularInputType = extensionMap(angular, 'inputType', lowercase), - /** @name angular.module.ng */ - angularCallbacks = extensionMap(angular, 'callbacks'), nodeName_, uid = ['0', '0', '0'], DATE_ISOSTRING_LN = 24; diff --git a/src/AngularPublic.js b/src/AngularPublic.js index 663011045786..16045af7e13e 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -47,7 +47,8 @@ function publishExternalAPI(angular){ 'version': version, 'isDate': isDate, 'lowercase': lowercase, - 'uppercase': uppercase + 'uppercase': uppercase, + 'callbacks': {counter: 0} }); angularModule.ng = ngModule; diff --git a/src/service/browser.js b/src/service/browser.js index 2e2c07e8ad95..4d093ae99055 100644 --- a/src/service/browser.js +++ b/src/service/browser.js @@ -96,18 +96,18 @@ function Browser(window, document, body, XHR, $log, $sniffer) { self.xhr = function(method, url, post, callback, headers) { outstandingRequestCount ++; if (lowercase(method) == 'json') { - var callbackId = ("angular_" + Math.random() + '_' + (idCounter++)).replace(/\d\./, ''); - window[callbackId] = function(data) { - window[callbackId].data = data; + var callbacks = window.angular.callbacks; + var callbackId = '_' + (callbacks.counter++).toString(36); + callbacks[callbackId] = function(data) { + callbacks[callbackId].data = data; }; - - var script = self.addJs(url.replace('JSON_CALLBACK', callbackId), function() { - if (window[callbackId].data) { - completeOutstandingRequest(callback, 200, window[callbackId].data); + var script = self.addJs(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), function() { + if (callbacks[callbackId].data) { + completeOutstandingRequest(callback, 200, callbacks[callbackId].data); } else { completeOutstandingRequest(callback); } - delete window[callbackId]; + delete callbacks[callbackId]; body[0].removeChild(script); }); } else { diff --git a/test/service/browserSpecs.js b/test/service/browserSpecs.js index 5234f0bef5aa..aa02d451b89d 100644 --- a/test/service/browserSpecs.js +++ b/test/service/browserSpecs.js @@ -44,6 +44,8 @@ function MockWindow() { replaceState: noop, pushState: noop }; + + this.angular = angular; } describe('browser', function() { @@ -135,15 +137,16 @@ describe('browser', function() { expect(scripts.length).toEqual(1); var script = scripts[0]; var url = script.src.split('?cb='); + expect(url[1]).toMatch(/angular\.callbacks\._\d+/); + var callbackId = url[1].split('\.')[2]; expect(url[0]).toEqual('http://example.org/path'); - expect(typeof fakeWindow[url[1]]).toEqual('function'); - fakeWindow[url[1]]('data'); + expect(typeof fakeWindow.angular.callbacks[callbackId]).toEqual('function'); + fakeWindow.angular.callbacks[callbackId]('data'); script.onload(); - expect(notify).toHaveBeenCalled(); expect(log).toEqual('200:data;'); expect(scripts).toEqual(removedScripts); - expect(fakeWindow[url[1]]).toBeUndefined(); + expect(fakeWindow.angular.callbacks[callbackId]).toBeUndefined(); }); @@ -166,7 +169,8 @@ describe('browser', function() { var script = scripts[0]; var url = script.src.split('?cb='); - fakeWindow[url[1]]('data'); + var callbackId = url[1].split('\.')[2]; + fakeWindow.angular.callbacks[callbackId]('data'); script.onload(); expect(notify).toHaveBeenCalled();