Skip to content

Commit

Permalink
Fixes #5803. Reworked jsonp prefilter so that it sets the dataType as…
Browse files Browse the repository at this point in the history
… jsonp and recognizes requests with originalSettings having jsonp or jsonpCallback to be jsonp. Moved default jsonp option value into ajaxSettings. Attached the transport to "jsonp" which avoids unnecessary testing. Transport factory sets dataType back to json for proper data conversion.
  • Loading branch information
jaubourg committed Jan 9, 2011
1 parent 0f28835 commit 62a1a1a
Showing 1 changed file with 52 additions and 53 deletions.
105 changes: 52 additions & 53 deletions src/ajax/jsonp.js
Expand Up @@ -4,82 +4,81 @@ var jsc = jQuery.now(),
jsre = /\=\?(&|$)/, jsre = /\=\?(&|$)/,
rquery_jsonp = /\?/; rquery_jsonp = /\?/;


// Default jsonp callback name // Default jsonp settings
jQuery.ajaxSettings.jsonpCallback = function() { jQuery.ajaxSetup({
return "jsonp" + jsc++; jsonp: "callback",
}; jsonpCallback: function() {
return "jsonp" + jsc++;
}
});


// Normalize jsonp queries // Normalize jsonp queries
// 1) put callback parameter in url or data // 1) put callback parameter in url or data
// 2) sneakily ensure transportDataType is json // 2) sneakily ensure transportDataType is always jsonp for jsonp requests
// 3) ensure options jsonp is always provided so that jsonp requests are always jQuery.ajax.prefilter("json jsonp", function(s, originalSettings) {
// json request with the jsonp option set
jQuery.ajax.prefilter("json jsonp", function(s) {

var transportDataType = s.dataTypes[ 0 ];


s.dataTypes[ 0 ] = "json"; if ( s.dataTypes[ 0 ] === "jsonp" ||

originalSettings.jsonp ||
if ( s.jsonp || originalSettings.jsonpCallback ||
transportDataType === "jsonp" || jsre.test(s.url) ||
transportDataType === "json" && ( jsre.test(s.url) || typeof(s.data) === "string" && jsre.test(s.data) ) ) { typeof(s.data) === "string" && jsre.test(s.data) ) {


var jsonp = s.jsonp = s.jsonp || "callback", var jsonpCallback = s.jsonpCallback =
jsonpCallback = s.jsonpCallback =
jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback, jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
url = s.url.replace(jsre, "=" + jsonpCallback + "$1"), 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 ) { if ( url === s.url && data === s.data ) {
url = url += (rquery_jsonp.test( url ) ? "&" : "?") + jsonp + "=" + jsonpCallback; url += (rquery_jsonp.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
} }


s.url = url; s.url = url;
s.data = data; s.data = data;
s.dataTypes[ 0 ] = "jsonp";
} }


// Bind transport to json dataType // Bind transport to jsonp dataType
}).transport("json", function(s) { }).transport("jsonp", function(s) {

if ( s.jsonp ) {


// Put callback in place // Put callback in place
var responseContainer, var responseContainer,
jsonpCallback = s.jsonpCallback, jsonpCallback = s.jsonpCallback,
previous = window[ jsonpCallback ]; previous = window[ jsonpCallback ];


window [ jsonpCallback ] = function( response ) { window [ jsonpCallback ] = function( response ) {
responseContainer = [response]; responseContainer = [response];
}; };


s.complete = [function() { s.complete = [function() {


// Set callback back to previous value // Set callback back to previous value
window[ jsonpCallback ] = previous; window[ jsonpCallback ] = previous;


// Call if it was a function and we have a response // Call if it was a function and we have a response
if ( previous) { if ( previous) {
if ( responseContainer && jQuery.isFunction ( previous ) ) { if ( responseContainer && jQuery.isFunction ( previous ) ) {
window[ jsonpCallback ] ( responseContainer[0] ); window[ jsonpCallback ] ( responseContainer[0] );
}
} else {
// else, more memory leak avoidance
try{ delete window[ jsonpCallback ]; } catch(e){}
} }
} 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 // Sneakily ensure this will be handled as json
s.converters["script json"] = function() { s.dataTypes[ 0 ] = "json";
if ( ! responseContainer ) {
jQuery.error( jsonpCallback + " was not called" );
}
return responseContainer[ 0 ];
};


// Delegate to script transport // Use data converter to retrieve json after script execution
return "script"; s.converters["script json"] = function() {
} if ( ! responseContainer ) {
jQuery.error( jsonpCallback + " was not called" );
}
return responseContainer[ 0 ];
};

// Delegate to script transport
return "script";
}); });


})( jQuery ); })( jQuery );

0 comments on commit 62a1a1a

Please sign in to comment.