From: Oleg Gaidarenko Date: Fri, 10 Jul 2015 17:58:43 +0000 (+0300) Subject: Ajax: Remove jsonp callbacks through "jQuery#removeProp" method X-Git-Tag: 3.0.0-alpha1~2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a2ae215d999637e8d9d0906abcbf6b1ca35c8e6e;p=jquery.git Ajax: Remove jsonp callbacks through "jQuery#removeProp" method Fixes gh-2323 Closes gh-2464 --- diff --git a/src/ajax/jsonp.js b/src/ajax/jsonp.js index a04898f67..f469344e0 100644 --- a/src/ajax/jsonp.js +++ b/src/ajax/jsonp.js @@ -64,8 +64,14 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { // Clean-up function (fires after converters) jqXHR.always(function() { - // Restore preexisting value - window[ callbackName ] = overwritten; + // If previous value didn't exist - remove it + if ( overwritten === undefined ) { + jQuery( window ).removeProp( callbackName ); + + // Otherwise restore preexisting value + } else { + window[ callbackName ] = overwritten; + } // Save back as free if ( s[ callbackName ] ) { diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 8a4ca7a65..359fa9d81 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -1,12 +1,4 @@ module( "ajax", { - setup: function() { - var jsonpCallback = this.jsonpCallback = jQuery.ajaxSettings.jsonpCallback; - jQuery.ajaxSettings.jsonpCallback = function() { - var callback = jsonpCallback.apply( this, arguments ); - Globals.register( callback ); - return callback; - }; - }, teardown: function() { jQuery( document ).off( "ajaxStart ajaxStop ajaxSend ajaxComplete ajaxError ajaxSuccess" ); moduleTeardown.apply( this, arguments ); @@ -742,7 +734,7 @@ module( "ajax", { } ]); - ajaxTest( "jQuery.ajax() - JSONP - Explicit callback param" + label, 9, { + ajaxTest( "jQuery.ajax() - JSONP - Explicit callback param" + label, 10, { setup: function() { Globals.register("functionToCleanUp"); Globals.register("XXX"); @@ -765,6 +757,11 @@ module( "ajax", { crossDomain: crossDomain, jsonpCallback: "jsonpResults", success: function( data ) { + strictEqual( + typeof window[ "jsonpResults" ], + "function", + "should not rewrite original function" + ); ok( data.data, "JSON results returned (GET, custom callback name)" ); } }, { @@ -1356,16 +1353,29 @@ module( "ajax", { ]); jQuery.each( [ " - Same Domain", " - Cross Domain" ], function( crossDomain, label ) { - ajaxTest( "#8205 - jQuery.ajax() - JSONP - re-use callbacks name" + label, 2, { + ajaxTest( "#8205 - jQuery.ajax() - JSONP - re-use callbacks name" + label, 4, { url: "data/jsonp.php", dataType: "jsonp", crossDomain: crossDomain, beforeSend: function( jqXHR, s ) { s.callback = s.jsonpCallback; + + ok( this.callback in window, "JSONP callback name is in the window" ); }, success: function() { var previous = this; - strictEqual( previous.jsonpCallback, undefined, "jsonpCallback option is set back to default in callbacks" ); + + strictEqual( + previous.jsonpCallback, + undefined, + "jsonpCallback option is set back to default in callbacks" + ); + + ok( + !( this.callback in window ), + "JSONP callback name was removed from the window" + ); + jQuery.ajax({ url: "data/jsonp.php", dataType: "jsonp",