diff options
author | Richard Gibson <richard.gibson@gmail.com> | 2012-11-03 00:06:50 -0400 |
---|---|---|
committer | Richard Gibson <richard.gibson@gmail.com> | 2012-11-05 17:24:03 -0500 |
commit | 81b094b2c180d490c093dafe53a69f59e1f8afe7 (patch) | |
tree | 62bedc6e856dc88414549299f68c2771a5fd5580 /test/unit/ajax.js | |
parent | 80d45a69ea5e81897ebcb6868a902f3b21d5b101 (diff) | |
download | jquery-81b094b2c180d490c093dafe53a69f59e1f8afe7.tar.gz jquery-81b094b2c180d490c093dafe53a69f59e1f8afe7.zip |
No ticket: update test suite to pass QUnit globals check in most environments. Close gh-1016.
Diffstat (limited to 'test/unit/ajax.js')
-rw-r--r-- | test/unit/ajax.js | 127 |
1 files changed, 112 insertions, 15 deletions
diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 9367320d2..1f3654a60 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -1,10 +1,47 @@ -module( "ajax", { - teardown: moduleTeardown -}); +(function() { -if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { + var isOpera = !!window.opera, + jsonpCallbacks = [], + jsonpCallback = jQuery.ajaxSettings.jsonpCallback, + deleteExpando = jQuery.support.deleteExpando, - var isOpera = !!window.opera; + // Ensure that we can cleanup generated JSONP callback functions if checking globals + newjsonpCallback = jsonpCallback && function() { + var callback = jsonpCallback.apply( this, arguments ); + + // Explanation at http://perfectionkills.com/understanding-delete/#ie_bugs + jQuery.globalEval( "var " + callback ); + + return callback; + }; + + module( "ajax", { + setup: deleteExpando ? + function() {} : + function() { + if ( QUnit.config.noglobals ) { + jQuery.ajaxSettings.jsonpCallback = newjsonpCallback; + } + }, + teardown: function() { + // Cleanup JSONP callback functions + jsonpCallbacks = jQuery.map( jsonpCallbacks, QUnit.config.noglobals ? + function( callback ) { + jQuery.globalEval( "try { " + + "delete " + ( deleteExpando ? "window['" + callback + "']" : callback ) + + "; } catch( x ) {}" ); + } : + function() {} + ); + jQuery.ajaxSettings.jsonpCallback = jsonpCallback; + + moduleTeardown.apply( this, arguments ); + } + }); + + if ( !jQuery.ajax || ( isLocal && !hasPHP ) ) { + return; + } test( "jQuery.ajax() - success callbacks", function() { expect( 8 ); @@ -597,6 +634,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: loc.protocol + "//" + loc.host + ":" + samePort, beforeSend: function( _, s ) { ok( !s.crossDomain, "Test matching ports are not detected as cross-domain" ); + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); return false; } }); @@ -606,6 +644,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: otherProtocol + "//" + loc.host, beforeSend: function( _, s ) { ok( s.crossDomain, "Test different protocols are detected as cross-domain" ); + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); return false; } }); @@ -615,6 +654,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: "app:/path", beforeSend: function( _, s ) { ok( s.crossDomain, "Adobe AIR app:/ URL detected as cross-domain" ); + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); return false; } }); @@ -624,6 +664,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: loc.protocol + "//example.invalid:" + ( loc.port || 80 ), beforeSend: function( _, s ) { ok( s.crossDomain, "Test different hostnames are detected as cross-domain" ); + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); return false; } }); @@ -633,6 +674,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: loc.protocol + "//" + loc.hostname + ":" + otherPort, beforeSend: function( _, s ) { ok( s.crossDomain, "Test different ports are detected as cross-domain" ); + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); return false; } }); @@ -642,6 +684,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: "about:blank", beforeSend: function( _, s ) { ok( s.crossDomain, "Test about:blank is detected as cross-domain" ); + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); return false; } }); @@ -652,10 +695,10 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { crossDomain: true, beforeSend: function( _, s ) { ok( s.crossDomain, "Test forced crossDomain is detected as cross-domain" ); + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); return false; } }); - }); test( ".load() - 404 error callbacks", function() { @@ -899,6 +942,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { jQuery.ajax({ url: url("data/with_fries_over_jsonp.php"), dataType: "jsonp xml", + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); + }, success: function( resp ) { equal( jQuery( "properties", resp ).length, 1, "properties in responseXML" ); equal( jQuery( "jsconf", resp ).length, 1, "jsconf in responseXML" ); @@ -1466,6 +1512,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: "data/jsonp.php?callback=?", dataType: "jsonp", crossDomain: crossDomain, + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); + }, success: function( data ) { ok( data.data, "JSON results returned (GET, url callback)" ); plus(); @@ -1480,6 +1529,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: "data/jsonp.php?callback=??", dataType: "jsonp", crossDomain: crossDomain, + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); + }, success: function( data ) { ok( data.data, "JSON results returned (GET, url context-free callback)" ); plus(); @@ -1494,6 +1546,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: "data/jsonp.php/??", dataType: "jsonp", crossDomain: crossDomain, + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/jsonp\.php\/([^?]*)/.exec( s.url ) || [])[1] ); + }, success: function( data ) { ok( data.data, "JSON results returned (GET, REST-like)" ); plus(); @@ -1508,6 +1563,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: "data/jsonp.php/???json=1", dataType: "jsonp", crossDomain: crossDomain, + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/jsonp\.php\/([^?]*)/.exec( s.url ) || [])[1] ); + }, success: function( data ) { strictEqual( jQuery.type( data ), "array", "JSON results returned (GET, REST-like with param)" ); plus(); @@ -1534,6 +1592,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { dataType: "jsonp", crossDomain: crossDomain, jsonp: "callback", + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); + }, success: function( data ) { ok( data["data"], "JSON results returned (GET, data obj callback)" ); plus(); @@ -1544,9 +1605,10 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { } }); + jQuery.globalEval("var jsonpResults;"); window["jsonpResults"] = function( data ) { ok( data["data"], "JSON results returned (GET, custom callback function)" ); - window["jsonpResults"] = undefined; + jQuery.globalEval("delete jsonpResults;"); plus(); }; @@ -1565,11 +1627,15 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { } }); + jQuery.globalEval("var functionToCleanUp;"); jQuery.ajax({ url: "data/jsonp.php", dataType: "jsonp", crossDomain: crossDomain, jsonpCallback: "functionToCleanUp", + beforeSend: function() { + jsonpCallbacks.push("functionToCleanUp"); + }, success: function( data ) { ok( data["data"], "JSON results returned (GET, custom callback name to be cleaned up)" ); strictEqual( window["functionToCleanUp"], undefined, "Callback was removed (GET, custom callback name to be cleaned up)" ); @@ -1598,6 +1664,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { } }); + jQuery.globalEval("var XXX;"); jQuery.ajax({ url: "data/jsonp.php?callback=XXX", dataType: "jsonp", @@ -1606,6 +1673,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { crossDomain: crossDomain, beforeSend: function() { ok( /^data\/jsonp.php\?callback=XXX&_=\d+$/.test( this.url ), "The URL wasn't messed with (GET, custom callback name with no url manipulation)" ); + jsonpCallbacks.push("XXX"); plus(); }, success: function( data ) { @@ -1634,6 +1702,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { dataType: "jsonp", crossDomain: crossDomain, data: "callback=?", + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); + }, success: function( data ) { ok( data.data, "JSON results returned (GET, data callback)" ); plus(); @@ -1649,6 +1720,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { dataType: "jsonp", crossDomain: crossDomain, data: "callback=??", + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); + }, success: function( data ) { ok( data.data, "JSON results returned (GET, data context-free callback)" ); plus(); @@ -1676,6 +1750,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: "data/jsonp.php", dataType: "jsonp", crossDomain: crossDomain, + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); + }, success: function( data ) { ok( data["data"], "JSON results returned (POST, no callback)" ); plus(); @@ -1692,6 +1769,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { data: "callback=?", dataType: "jsonp", crossDomain: crossDomain, + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/callback=([^&]*)/.exec( crossDomain ? s.url : s.data ) || [])[1] ); + }, success: function( data ) { ok( data["data"], "JSON results returned (POST, data callback)" ); plus(); @@ -1708,6 +1788,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { jsonp: "callback", dataType: "jsonp", crossDomain: crossDomain, + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); + }, success: function( data ) { ok( data["data"], "JSON results returned (POST, data obj callback)" ); plus(); @@ -1733,6 +1816,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: "data/jsonp.php", dataType: "jsonp", crossDomain: crossDomain, + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); + }, success: function( data ) { ok( data.data, "JSON results returned (GET, no callback)" ); plus(); @@ -1747,6 +1833,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: "data/jsonp.php", dataType: "jsonp", crossDomain: crossDomain, + beforeSend: function( jqXHR, s ) { + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); + }, success: function( data ) { ok( data.data, ( this.alreadyDone ? "this re-used" : "first request" ) + ": JSON results returned (GET, no callback)" ); if ( !this.alreadyDone ) { @@ -1773,8 +1862,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: "data/jsonp.php", dataType: "jsonp", crossDomain: crossDomain, - beforeSend: function() { + beforeSend: function( jqXHR, s ) { strictEqual( this.cache, false, "cache must be false on JSON request" ); + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); start(); return false; } @@ -1788,8 +1878,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { url: "data/jsonp.php", dataType: "jsonp", crossDomain: crossDomain, - beforeSend: function() { - this.callback = this.jsonpCallback; + beforeSend: function( jqXHR, s ) { + s.callback = s.jsonpCallback; + jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] ); } }).pipe(function() { var previous = this; @@ -2019,18 +2110,23 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { asyncTest( "jQuery.getJSON - Using Native JSON", function() { expect( 2 ); - var old = window.JSON; + var restore = "JSON" in window, + old = window.JSON; + jQuery.globalEval("var JSON;"); window.JSON = { parse: function( str ) { ok( true, "Verifying that parse method was run" ); + window.JSON = old; + if ( !restore ) { + jQuery.globalEval("delete JSON;"); + } return true; } }; jQuery.getJSON( url("data/json.php"), function( json ) { - window.JSON = old; - equal( json, true, "Verifying return value" ); + strictEqual( json, true, "Verifying return value" ); start(); }); }); @@ -2760,7 +2856,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { start(); }); }); - + test( "jQuery.ajax - empty json gets to error callback instead of success callback.", function() { expect( 1 ); @@ -2774,4 +2870,5 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) { dataType: "json" }); }); -} + +})(); |