From fd38655e6c8e58e7c7325b2a5937b26174ebdefa Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Wed, 7 Dec 2011 07:53:57 -0800 Subject: fix(): use angular.callbacks namespace for jsonp callbacks Previously we used to put callbacks on the window object, but that causes problems on IE8 where it is not possible to delete properties from the window object --- src/Angular.js | 2 -- src/AngularPublic.js | 3 ++- src/service/httpBackend.js | 20 +++++++++----------- 3 files changed, 11 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/Angular.js b/src/Angular.js index 9a4470eb..2a9fb556 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 e5c70a8b..7664ed8c 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/httpBackend.js b/src/service/httpBackend.js index 7443347f..6ea7df0f 100644 --- a/src/service/httpBackend.js +++ b/src/service/httpBackend.js @@ -17,31 +17,29 @@ var XHR = window.XMLHttpRequest || function() { */ function $HttpBackendProvider() { this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) { - return createHttpBackend($browser, XHR, $browser.defer, $window, $document[0].body, - $window.location.href.replace(':', '')); + return createHttpBackend($browser, XHR, $browser.defer, $window.angular.callbacks, + $document[0].body, $window.location.href.replace(':', '')); }]; } -function createHttpBackend($browser, XHR, $browserDefer, $window, body, locationProtocol) { - var idCounter = 0; - +function createHttpBackend($browser, XHR, $browserDefer, callbacks, body, locationProtocol) { // TODO(vojta): fix the signature return function(method, url, post, callback, headers, timeout) { $browser.$$incOutstandingRequestCount(); if (lowercase(method) == 'jsonp') { - var callbackId = ('angular_' + Math.random() + '_' + (idCounter++)).replace(/\d\./, ''); - $window[callbackId] = function(data) { - $window[callbackId].data = data; + var callbackId = '_' + (callbacks.counter++).toString(36); + callbacks[callbackId] = function(data) { + callbacks[callbackId].data = data; }; var script = $browser.addJs(url.replace('JSON_CALLBACK', callbackId), null, function() { - if ($window[callbackId].data) { - completeRequest(callback, 200, $window[callbackId].data); + if (callbacks[callbackId].data) { + completeRequest(callback, 200, callbacks[callbackId].data); } else { completeRequest(callback, -2); } - delete $window[callbackId]; + delete callbacks[callbackId]; body.removeChild(script); }); } else { -- cgit v1.2.3