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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / j s o n p \. p h p \/ ( [ ^ ? ] * ) / . 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 ( ( / j s o n p \. p h p \/ ( [ ^ ? ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( / ^ d a t a \/ j s o n p .p h p \? c a l l b a c k = X X X & _ = \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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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 ( ( / c a l l b a c k = ( [ ^ & ] * ) / . 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+ } ) ( ) ;
0 commit comments