Commit 62a1a1a8 authored by jaubourg's avatar jaubourg

Fixes #5803. Reworked jsonp prefilter so that it sets the dataType as jsonp...

Fixes #5803. Reworked jsonp prefilter so that it sets the dataType as 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.
parent 0f28835e
...@@ -4,44 +4,41 @@ var jsc = jQuery.now(), ...@@ -4,44 +4,41 @@ var jsc = jQuery.now(),
jsre = /\=\?(&|$)/, jsre = /\=\?(&|$)/,
rquery_jsonp = /\?/; rquery_jsonp = /\?/;
// Default jsonp callback name // Default jsonp settings
jQuery.ajaxSettings.jsonpCallback = function() { jQuery.ajaxSetup({
jsonp: "callback",
jsonpCallback: function() {
return "jsonp" + jsc++; 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.jsonp || if ( s.dataTypes[ 0 ] === "jsonp" ||
transportDataType === "jsonp" || originalSettings.jsonp ||
transportDataType === "json" && ( jsre.test(s.url) || typeof(s.data) === "string" && jsre.test(s.data) ) ) { originalSettings.jsonpCallback ||
jsre.test(s.url) ||
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,
...@@ -69,6 +66,9 @@ jQuery.ajax.prefilter("json jsonp", function(s) { ...@@ -69,6 +66,9 @@ jQuery.ajax.prefilter("json jsonp", function(s) {
}, s.complete ]; }, s.complete ];
// Sneakily ensure this will be handled as json
s.dataTypes[ 0 ] = "json";
// Use data converter to retrieve json after script execution // Use data converter to retrieve json after script execution
s.converters["script json"] = function() { s.converters["script json"] = function() {
if ( ! responseContainer ) { if ( ! responseContainer ) {
...@@ -79,7 +79,6 @@ jQuery.ajax.prefilter("json jsonp", function(s) { ...@@ -79,7 +79,6 @@ jQuery.ajax.prefilter("json jsonp", function(s) {
// Delegate to script transport // Delegate to script transport
return "script"; return "script";
}
}); });
})( jQuery ); })( jQuery );
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment