Fixes #5803. Reworked jsonp prefilter so that it sets the dataType as jsonp and recog...
authorjaubourg <j@ubourg.net>
Sun, 9 Jan 2011 20:19:27 +0000 (21:19 +0100)
committerjaubourg <j@ubourg.net>
Sun, 9 Jan 2011 20:19:27 +0000 (21:19 +0100)
src/ajax/jsonp.js

index 5cfb783..0af0056 100644 (file)
@@ -4,82 +4,81 @@ var jsc = jQuery.now(),
        jsre = /\=\?(&|$)/,
        rquery_jsonp = /\?/;
 
-// Default jsonp callback name
-jQuery.ajaxSettings.jsonpCallback = function() {
-       return "jsonp" + jsc++;
-};
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               return "jsonp" + jsc++;
+       }
+});
 
 // Normalize jsonp queries
 // 1) put callback parameter in url or data
-// 2) sneakily ensure transportDataType is json
-// 3) ensure options jsonp is always provided so that jsonp requests are always
-//    json request with the jsonp option set
-jQuery.ajax.prefilter("json jsonp", function(s) {
-
-       var transportDataType = s.dataTypes[ 0 ];
+// 2) sneakily ensure transportDataType is always jsonp for jsonp requests
+jQuery.ajax.prefilter("json jsonp", function(s, originalSettings) {
 
-       s.dataTypes[ 0 ] = "json";
-
-       if ( s.jsonp ||
-               transportDataType === "jsonp" ||
-               transportDataType === "json" && ( jsre.test(s.url) || typeof(s.data) === "string" && jsre.test(s.data) ) ) {
+       if ( s.dataTypes[ 0 ] === "jsonp" ||
+               originalSettings.jsonp ||
+               originalSettings.jsonpCallback ||
+               jsre.test(s.url) ||
+               typeof(s.data) === "string" && jsre.test(s.data) ) {
 
-               var jsonp = s.jsonp = s.jsonp || "callback",
-                       jsonpCallback = s.jsonpCallback =
+               var jsonpCallback = s.jsonpCallback =
                                jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
                        url = s.url.replace(jsre, "=" + jsonpCallback + "$1"),
-                       data = s.url == url && typeof(s.data) === "string" ? s.data.replace(jsre, "=" + jsonpCallback + "$1") : s.data;
+                       data = s.url === url && typeof(s.data) === "string" ? s.data.replace(jsre, "=" + jsonpCallback + "$1") : s.data;
 
-               if ( url == s.url && data == s.data ) {
-                       url = url += (rquery_jsonp.test( url ) ? "&" : "?") + jsonp + "=" + jsonpCallback;
+               if ( url === s.url && data === s.data ) {
+                       url += (rquery_jsonp.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
                }
 
                s.url = url;
                s.data = data;
+               s.dataTypes[ 0 ] = "jsonp";
        }
 
-// Bind transport to json dataType
-}).transport("json", function(s) {
-
-       if ( s.jsonp ) {
+// Bind transport to jsonp dataType
+}).transport("jsonp", function(s) {
 
-               // Put callback in place
-               var responseContainer,
-                       jsonpCallback = s.jsonpCallback,
-                       previous = window[ jsonpCallback ];
+       // Put callback in place
+       var responseContainer,
+               jsonpCallback = s.jsonpCallback,
+               previous = window[ jsonpCallback ];
 
-               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;
+               // 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] );
-                               }
-                       } else {
-                               // else, more memory leak avoidance
-                               try{ delete window[ jsonpCallback ]; } catch(e){}
+               // Call if it was a function and we have a response
+               if ( previous) {
+                       if ( responseContainer && jQuery.isFunction ( previous ) ) {
+                               window[ jsonpCallback ] ( responseContainer[0] );
                        }
+               } else {
+                       // else, more memory leak avoidance
+                       try{ delete window[ jsonpCallback ]; } catch(e){}
+               }
 
-               }, s.complete ];
+       }, s.complete ];
 
-               // Use data converter to retrieve json after script execution
-               s.converters["script json"] = function() {
-                       if ( ! responseContainer ) {
-                               jQuery.error( jsonpCallback + " was not called" );
-                       }
-                       return responseContainer[ 0 ];
-               };
+       // Sneakily ensure this will be handled as json
+       s.dataTypes[ 0 ] = "json";
 
-               // Delegate to script transport
-               return "script";
-       }
+       // Use data converter to retrieve json after script execution
+       s.converters["script json"] = function() {
+               if ( ! responseContainer ) {
+                       jQuery.error( jsonpCallback + " was not called" );
+               }
+               return responseContainer[ 0 ];
+       };
+
+       // Delegate to script transport
+       return "script";
 });
 
 })( jQuery );