Fixes #8205. Mitigates memory usage by recycling jsonp callback names the safest possible way (no kittens were harmed in the making of this). Doesn't even try to delete window properties (would necessitate a try/catch for IE which makes the cost in size prohibitive). Unit tests added.

This commit is contained in:
jaubourg
2012-04-20 03:02:20 +02:00
parent 3e6f94c360
commit 8ebb2f4793
2 changed files with 55 additions and 4 deletions

View File

@@ -1,13 +1,16 @@
(function( jQuery ) {
var jsc = jQuery.now(),
jsre = /(\=)\?(&|$)|\?\?/i;
jsre = /(\=)\?(&|$)|\?\?/i,
jscallbacks = [];
// Default jsonp settings
jQuery.ajaxSetup({
jsonp: "callback",
jsonpCallback: function() {
return jQuery.expando + "_" + ( jsc++ );
var callback = jscallbacks.pop() || ( jQuery.expando + "_" + ( jsc++ ) );
this[ callback ] = true;
return callback;
}
});
@@ -53,6 +56,13 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
jqXHR.always(function() {
// Set callback back to previous value
window[ jsonpCallback ] = previous;
// Save back as free
if ( s[ jsonpCallback ] ) {
// make sure that re-using the options doesn't screw things around
s.jsonpCallback = originalSettings.jsonpCallback;
// save the callback name for future use
jscallbacks.push( jsonpCallback );
}
// Call if it was a function and we have a response
if ( responseContainer && jQuery.isFunction( previous ) ) {
window[ jsonpCallback ]( responseContainer[ 0 ] );