Skip to content

Commit 81b094b

Browse files
committed
No ticket: update test suite to pass QUnit globals check in most environments. Close jquerygh-1016.
1 parent 80d45a6 commit 81b094b

File tree

6 files changed

+196
-90
lines changed

6 files changed

+196
-90
lines changed

test/data/testrunner.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
*/
44
jQuery.noConflict();
55

6+
// For checking globals pollution
7+
window[ jQuery.expando ] = undefined;
8+
// ...in Gecko
9+
this.getInterface = this.getInterface;
10+
611
// Expose Sizzle for Sizzle's selector tests
712
// We remove Sizzle's globalization in jQuery
813
var Sizzle = Sizzle || jQuery.find;
@@ -96,7 +101,7 @@ function testSubproject( label, url, risTests ) {
96101
}
97102
});
98103

99-
function requireFixture( fnTest ) {
104+
function requireFixture( fn ) {
100105
return function() {
101106
if ( !fixtureReplaced ) {
102107
// Make sure that we retrieved a fixture for the subproject
@@ -124,7 +129,7 @@ function testSubproject( label, url, risTests ) {
124129
fixtureReplaced = true;
125130
}
126131

127-
fnTest.apply( this, arguments );
132+
fn.apply( this, arguments );
128133
};
129134
}
130135
}

test/unit/ajax.js

Lines changed: 112 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,47 @@
1-
module( "ajax", {
2-
teardown: moduleTeardown
3-
});
1+
(function() {
42

5-
if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
3+
var isOpera = !!window.opera,
4+
jsonpCallbacks = [],
5+
jsonpCallback = jQuery.ajaxSettings.jsonpCallback,
6+
deleteExpando = jQuery.support.deleteExpando,
67

7-
var isOpera = !!window.opera;
8+
// Ensure that we can cleanup generated JSONP callback functions if checking globals
9+
newjsonpCallback = jsonpCallback && function() {
10+
var callback = jsonpCallback.apply( this, arguments );
11+
12+
// Explanation at http://perfectionkills.com/understanding-delete/#ie_bugs
13+
jQuery.globalEval( "var " + callback );
14+
15+
return callback;
16+
};
17+
18+
module( "ajax", {
19+
setup: deleteExpando ?
20+
function() {} :
21+
function() {
22+
if ( QUnit.config.noglobals ) {
23+
jQuery.ajaxSettings.jsonpCallback = newjsonpCallback;
24+
}
25+
},
26+
teardown: function() {
27+
// Cleanup JSONP callback functions
28+
jsonpCallbacks = jQuery.map( jsonpCallbacks, QUnit.config.noglobals ?
29+
function( callback ) {
30+
jQuery.globalEval( "try { " +
31+
"delete " + ( deleteExpando ? "window['" + callback + "']" : callback ) +
32+
"; } catch( x ) {}" );
33+
} :
34+
function() {}
35+
);
36+
jQuery.ajaxSettings.jsonpCallback = jsonpCallback;
37+
38+
moduleTeardown.apply( this, arguments );
39+
}
40+
});
41+
42+
if ( !jQuery.ajax || ( isLocal && !hasPHP ) ) {
43+
return;
44+
}
845

946
test( "jQuery.ajax() - success callbacks", function() {
1047
expect( 8 );
@@ -597,6 +634,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
597634
url: loc.protocol + "//" + loc.host + ":" + samePort,
598635
beforeSend: function( _, s ) {
599636
ok( !s.crossDomain, "Test matching ports are not detected as cross-domain" );
637+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
600638
return false;
601639
}
602640
});
@@ -606,6 +644,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
606644
url: otherProtocol + "//" + loc.host,
607645
beforeSend: function( _, s ) {
608646
ok( s.crossDomain, "Test different protocols are detected as cross-domain" );
647+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
609648
return false;
610649
}
611650
});
@@ -615,6 +654,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
615654
url: "app:/path",
616655
beforeSend: function( _, s ) {
617656
ok( s.crossDomain, "Adobe AIR app:/ URL detected as cross-domain" );
657+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
618658
return false;
619659
}
620660
});
@@ -624,6 +664,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
624664
url: loc.protocol + "//example.invalid:" + ( loc.port || 80 ),
625665
beforeSend: function( _, s ) {
626666
ok( s.crossDomain, "Test different hostnames are detected as cross-domain" );
667+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
627668
return false;
628669
}
629670
});
@@ -633,6 +674,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
633674
url: loc.protocol + "//" + loc.hostname + ":" + otherPort,
634675
beforeSend: function( _, s ) {
635676
ok( s.crossDomain, "Test different ports are detected as cross-domain" );
677+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
636678
return false;
637679
}
638680
});
@@ -642,6 +684,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
642684
url: "about:blank",
643685
beforeSend: function( _, s ) {
644686
ok( s.crossDomain, "Test about:blank is detected as cross-domain" );
687+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
645688
return false;
646689
}
647690
});
@@ -652,10 +695,10 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
652695
crossDomain: true,
653696
beforeSend: function( _, s ) {
654697
ok( s.crossDomain, "Test forced crossDomain is detected as cross-domain" );
698+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
655699
return false;
656700
}
657701
});
658-
659702
});
660703

661704
test( ".load() - 404 error callbacks", function() {
@@ -899,6 +942,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
899942
jQuery.ajax({
900943
url: url("data/with_fries_over_jsonp.php"),
901944
dataType: "jsonp xml",
945+
beforeSend: function( jqXHR, s ) {
946+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
947+
},
902948
success: function( resp ) {
903949
equal( jQuery( "properties", resp ).length, 1, "properties in responseXML" );
904950
equal( jQuery( "jsconf", resp ).length, 1, "jsconf in responseXML" );
@@ -1466,6 +1512,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
14661512
url: "data/jsonp.php?callback=?",
14671513
dataType: "jsonp",
14681514
crossDomain: crossDomain,
1515+
beforeSend: function( jqXHR, s ) {
1516+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
1517+
},
14691518
success: function( data ) {
14701519
ok( data.data, "JSON results returned (GET, url callback)" );
14711520
plus();
@@ -1480,6 +1529,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
14801529
url: "data/jsonp.php?callback=??",
14811530
dataType: "jsonp",
14821531
crossDomain: crossDomain,
1532+
beforeSend: function( jqXHR, s ) {
1533+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
1534+
},
14831535
success: function( data ) {
14841536
ok( data.data, "JSON results returned (GET, url context-free callback)" );
14851537
plus();
@@ -1494,6 +1546,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
14941546
url: "data/jsonp.php/??",
14951547
dataType: "jsonp",
14961548
crossDomain: crossDomain,
1549+
beforeSend: function( jqXHR, s ) {
1550+
jsonpCallbacks.push( (/jsonp\.php\/([^?]*)/.exec( s.url ) || [])[1] );
1551+
},
14971552
success: function( data ) {
14981553
ok( data.data, "JSON results returned (GET, REST-like)" );
14991554
plus();
@@ -1508,6 +1563,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
15081563
url: "data/jsonp.php/???json=1",
15091564
dataType: "jsonp",
15101565
crossDomain: crossDomain,
1566+
beforeSend: function( jqXHR, s ) {
1567+
jsonpCallbacks.push( (/jsonp\.php\/([^?]*)/.exec( s.url ) || [])[1] );
1568+
},
15111569
success: function( data ) {
15121570
strictEqual( jQuery.type( data ), "array", "JSON results returned (GET, REST-like with param)" );
15131571
plus();
@@ -1534,6 +1592,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
15341592
dataType: "jsonp",
15351593
crossDomain: crossDomain,
15361594
jsonp: "callback",
1595+
beforeSend: function( jqXHR, s ) {
1596+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
1597+
},
15371598
success: function( data ) {
15381599
ok( data["data"], "JSON results returned (GET, data obj callback)" );
15391600
plus();
@@ -1544,9 +1605,10 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
15441605
}
15451606
});
15461607

1608+
jQuery.globalEval("var jsonpResults;");
15471609
window["jsonpResults"] = function( data ) {
15481610
ok( data["data"], "JSON results returned (GET, custom callback function)" );
1549-
window["jsonpResults"] = undefined;
1611+
jQuery.globalEval("delete jsonpResults;");
15501612
plus();
15511613
};
15521614

@@ -1565,11 +1627,15 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
15651627
}
15661628
});
15671629

1630+
jQuery.globalEval("var functionToCleanUp;");
15681631
jQuery.ajax({
15691632
url: "data/jsonp.php",
15701633
dataType: "jsonp",
15711634
crossDomain: crossDomain,
15721635
jsonpCallback: "functionToCleanUp",
1636+
beforeSend: function() {
1637+
jsonpCallbacks.push("functionToCleanUp");
1638+
},
15731639
success: function( data ) {
15741640
ok( data["data"], "JSON results returned (GET, custom callback name to be cleaned up)" );
15751641
strictEqual( window["functionToCleanUp"], undefined, "Callback was removed (GET, custom callback name to be cleaned up)" );
@@ -1598,6 +1664,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
15981664
}
15991665
});
16001666

1667+
jQuery.globalEval("var XXX;");
16011668
jQuery.ajax({
16021669
url: "data/jsonp.php?callback=XXX",
16031670
dataType: "jsonp",
@@ -1606,6 +1673,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
16061673
crossDomain: crossDomain,
16071674
beforeSend: function() {
16081675
ok( /^data\/jsonp.php\?callback=XXX&_=\d+$/.test( this.url ), "The URL wasn't messed with (GET, custom callback name with no url manipulation)" );
1676+
jsonpCallbacks.push("XXX");
16091677
plus();
16101678
},
16111679
success: function( data ) {
@@ -1634,6 +1702,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
16341702
dataType: "jsonp",
16351703
crossDomain: crossDomain,
16361704
data: "callback=?",
1705+
beforeSend: function( jqXHR, s ) {
1706+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
1707+
},
16371708
success: function( data ) {
16381709
ok( data.data, "JSON results returned (GET, data callback)" );
16391710
plus();
@@ -1649,6 +1720,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
16491720
dataType: "jsonp",
16501721
crossDomain: crossDomain,
16511722
data: "callback=??",
1723+
beforeSend: function( jqXHR, s ) {
1724+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
1725+
},
16521726
success: function( data ) {
16531727
ok( data.data, "JSON results returned (GET, data context-free callback)" );
16541728
plus();
@@ -1676,6 +1750,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
16761750
url: "data/jsonp.php",
16771751
dataType: "jsonp",
16781752
crossDomain: crossDomain,
1753+
beforeSend: function( jqXHR, s ) {
1754+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
1755+
},
16791756
success: function( data ) {
16801757
ok( data["data"], "JSON results returned (POST, no callback)" );
16811758
plus();
@@ -1692,6 +1769,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
16921769
data: "callback=?",
16931770
dataType: "jsonp",
16941771
crossDomain: crossDomain,
1772+
beforeSend: function( jqXHR, s ) {
1773+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( crossDomain ? s.url : s.data ) || [])[1] );
1774+
},
16951775
success: function( data ) {
16961776
ok( data["data"], "JSON results returned (POST, data callback)" );
16971777
plus();
@@ -1708,6 +1788,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
17081788
jsonp: "callback",
17091789
dataType: "jsonp",
17101790
crossDomain: crossDomain,
1791+
beforeSend: function( jqXHR, s ) {
1792+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
1793+
},
17111794
success: function( data ) {
17121795
ok( data["data"], "JSON results returned (POST, data obj callback)" );
17131796
plus();
@@ -1733,6 +1816,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
17331816
url: "data/jsonp.php",
17341817
dataType: "jsonp",
17351818
crossDomain: crossDomain,
1819+
beforeSend: function( jqXHR, s ) {
1820+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
1821+
},
17361822
success: function( data ) {
17371823
ok( data.data, "JSON results returned (GET, no callback)" );
17381824
plus();
@@ -1747,6 +1833,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
17471833
url: "data/jsonp.php",
17481834
dataType: "jsonp",
17491835
crossDomain: crossDomain,
1836+
beforeSend: function( jqXHR, s ) {
1837+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
1838+
},
17501839
success: function( data ) {
17511840
ok( data.data, ( this.alreadyDone ? "this re-used" : "first request" ) + ": JSON results returned (GET, no callback)" );
17521841
if ( !this.alreadyDone ) {
@@ -1773,8 +1862,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
17731862
url: "data/jsonp.php",
17741863
dataType: "jsonp",
17751864
crossDomain: crossDomain,
1776-
beforeSend: function() {
1865+
beforeSend: function( jqXHR, s ) {
17771866
strictEqual( this.cache, false, "cache must be false on JSON request" );
1867+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
17781868
start();
17791869
return false;
17801870
}
@@ -1788,8 +1878,9 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
17881878
url: "data/jsonp.php",
17891879
dataType: "jsonp",
17901880
crossDomain: crossDomain,
1791-
beforeSend: function() {
1792-
this.callback = this.jsonpCallback;
1881+
beforeSend: function( jqXHR, s ) {
1882+
s.callback = s.jsonpCallback;
1883+
jsonpCallbacks.push( (/callback=([^&]*)/.exec( s.url ) || [])[1] );
17931884
}
17941885
}).pipe(function() {
17951886
var previous = this;
@@ -2019,18 +2110,23 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
20192110
asyncTest( "jQuery.getJSON - Using Native JSON", function() {
20202111
expect( 2 );
20212112

2022-
var old = window.JSON;
2113+
var restore = "JSON" in window,
2114+
old = window.JSON;
20232115

2116+
jQuery.globalEval("var JSON;");
20242117
window.JSON = {
20252118
parse: function( str ) {
20262119
ok( true, "Verifying that parse method was run" );
2120+
window.JSON = old;
2121+
if ( !restore ) {
2122+
jQuery.globalEval("delete JSON;");
2123+
}
20272124
return true;
20282125
}
20292126
};
20302127

20312128
jQuery.getJSON( url("data/json.php"), function( json ) {
2032-
window.JSON = old;
2033-
equal( json, true, "Verifying return value" );
2129+
strictEqual( json, true, "Verifying return value" );
20342130
start();
20352131
});
20362132
});
@@ -2760,7 +2856,7 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
27602856
start();
27612857
});
27622858
});
2763-
2859+
27642860
test( "jQuery.ajax - empty json gets to error callback instead of success callback.", function() {
27652861
expect( 1 );
27662862

@@ -2774,4 +2870,5 @@ if ( jQuery.ajax && ( !isLocal || hasPHP ) ) {
27742870
dataType: "json"
27752871
});
27762872
});
2777-
}
2873+
2874+
})();

test/unit/attributes.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,12 @@ test( "attr(String, Object)", function() {
340340
});
341341

342342
jQuery.each( [ window, document, obj, "#firstp" ], function( i, elem ) {
343-
var $elem = jQuery( elem );
343+
// use iframeCallback to avoid generating a new global when testing window
344+
var oldVal = elem.iframeCallback,
345+
$elem = jQuery( elem );
344346
strictEqual( $elem.attr("nonexisting"), undefined, "attr works correctly for non existing attributes (bug #7500)." );
345-
equal( $elem.attr( "something", "foo" ).attr("something"), "foo", "attr falls back to prop on unsupported arguments" );
347+
equal( $elem.attr( "iframeCallback", "foo" ).attr("iframeCallback"), "foo", "attr falls back to prop on unsupported arguments" );
348+
elem.iframeCallback = oldVal;
346349
});
347350

348351
var table = jQuery("#table").append("<tr><td>cell</td></tr><tr><td>cell</td><td>cell</td></tr><tr><td>cell</td><td>cell</td></tr>"),

0 commit comments

Comments
 (0)