diff options
-rw-r--r-- | src/ajax/jsonp.js | 10 | ||||
-rw-r--r-- | test/unit/ajax.js | 35 |
2 files changed, 40 insertions, 5 deletions
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 1233f14ce..f9c5e0ed3 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -1,5 +1,11 @@ +var isIE8 = /msie 8\.0/i.test( window.navigator.userAgent ); + module( "ajax", { setup: function() { + if ( !isIE8 ) { + return; + } + var jsonpCallback = this.jsonpCallback = jQuery.ajaxSettings.jsonpCallback; jQuery.ajaxSettings.jsonpCallback = function() { var callback = jsonpCallback.apply( this, arguments ); @@ -737,7 +743,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"); @@ -760,6 +766,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)" ); } }, { @@ -1372,16 +1383,34 @@ 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" + ); + + if ( isIE8 ) { + ok( true, "IE8 can't remove property from the window" ); + + } else { + ok( + !( this.callback in window ), + "JSONP callback name was removed from the window" + ); + } + jQuery.ajax({ url: "data/jsonp.php", dataType: "jsonp", |