Skip to content
Browse files

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.
  • Loading branch information...
1 parent 0f28835 commit 62a1a1a8fa64f92f429a3f5b8ed2e0d1f6fc3d6c @jaubourg jaubourg committed Jan 9, 2011
Showing with 52 additions and 53 deletions.
  1. +52 −53 src/ajax/jsonp.js
View
105 src/ajax/jsonp.js
@@ -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 );

0 comments on commit 62a1a1a

Please sign in to comment.
Something went wrong with that request. Please try again.