Fixes #8054 by reverting feature enhancement 5812 (4920). Regexps no longer searches...
[jquery.git] / src / ajax / jsonp.js
index 675ecc0..16a4c2f 100644 (file)
@@ -1,8 +1,7 @@
 (function( jQuery ) {
 
 var jsc = jQuery.now(),
-       jsre = /(\=)(?:\?|%3F)(&|$)|()(?:\?\?|%3F%3F)()/i,
-       rquery_jsonp = /\?/;
+       jsre = /(\=)\?(&|$)|()\?\?()/i;
 
 // Default jsonp settings
 jQuery.ajaxSetup({
@@ -10,47 +9,62 @@ jQuery.ajaxSetup({
        jsonpCallback: function() {
                return "jsonp" + jsc++;
        }
+});
 
 // Detect, normalize options and install callbacks for jsonp requests
-}).ajaxPrefilter("json jsonp", function(s, originalSettings) {
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString /* internal */ ) {
+
+       dataIsString = ( typeof s.data === "string" );
 
        if ( s.dataTypes[ 0 ] === "jsonp" ||
-               originalSettings.jsonp ||
                originalSettings.jsonpCallback ||
-               jsre.test(s.url) ||
-               typeof(s.data) === "string" && jsre.test(s.data) ) {
+               originalSettings.jsonp != null ||
+               s.jsonp !== false && ( jsre.test( s.url ) ||
+                               dataIsString && jsre.test( s.data ) ) ) {
 
                var responseContainer,
                        jsonpCallback = s.jsonpCallback =
                                jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
                        previous = window[ jsonpCallback ],
-                       url = s.url.replace(jsre, "$1" + jsonpCallback + "$2"),
-                       data = s.url === url && typeof(s.data) === "string" ? s.data.replace(jsre, "$1" + jsonpCallback + "$2") : s.data;
-
-               if ( url === s.url && data === s.data ) {
-                       url += (rquery_jsonp.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+                       url = s.url,
+                       data = s.data,
+                       replace = "$1" + jsonpCallback + "$2";
+
+               if ( s.jsonp !== false ) {
+                       url = url.replace( jsre, replace );
+                       if ( s.url === url ) {
+                               if ( dataIsString ) {
+                                       data = data.replace( jsre, replace );
+                               }
+                               if ( s.data === data ) {
+                                       // Add callback manually
+                                       url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+                               }
+                       }
                }
 
                s.url = url;
                s.data = data;
 
-               window [ jsonpCallback ] = function( response ) {
-                       responseContainer = [response];
+               window[ jsonpCallback ] = function( response ) {
+                       responseContainer = [ response ];
                };
 
-               s.complete = [function() {
+               s.complete = [ function() {
 
                        // Set callback back to previous value
                        window[ jsonpCallback ] = previous;
 
                        // Call if it was a function and we have a response
                        if ( previous) {
-                               if ( responseContainer && jQuery.isFunction ( previous ) ) {
-                                       window[ jsonpCallback ] ( responseContainer[0] );
+                               if ( responseContainer && jQuery.isFunction( previous ) ) {
+                                       window[ jsonpCallback ] ( responseContainer[ 0 ] );
                                }
                        } else {
                                // else, more memory leak avoidance
-                               try{ delete window[ jsonpCallback ]; } catch(e){}
+                               try{
+                                       delete window[ jsonpCallback ];
+                               } catch( e ) {}
                        }
 
                }, s.complete ];
@@ -69,6 +83,6 @@ jQuery.ajaxSetup({
                // Delegate to script
                return "script";
        }
-});
+} );
 
 })( jQuery );