Bug 8107; Fix argument handling for $.ajax for multiple method signatues and add...
[jquery.git] / src / ajax.js
index 363e9c8..3158ca4 100644 (file)
@@ -322,9 +322,8 @@ jQuery.extend({
        // Main method
        ajax: function( url, options ) {
 
-               // If options is not an object,
-               // we simulate pre-1.5 signature
-               if ( typeof options !== "object" ) {
+               // If url is an object, simulate pre-1.5 signature
+               if ( typeof url === "object" ) {
                        options = url;
                        url = undefined;
                }
@@ -334,18 +333,24 @@ jQuery.extend({
 
                var // Create the final options object
                        s = jQuery.extend( true, {}, jQuery.ajaxSettings, options ),
-                       // Callbacks contexts
+                       // Callbacks context
                        // We force the original context if it exists
                        // or take it from jQuery.ajaxSettings otherwise
                        // (plain objects used as context get extended)
                        callbackContext =
                                ( s.context = ( "context" in options ? options : jQuery.ajaxSettings ).context ) || s,
-                       globalEventContext = callbackContext === s ? jQuery.event : jQuery( callbackContext ),
+                       // Context for global events
+                       // It's the callbackContext if one was provided in the options
+                       // and if it's a DOM node
+                       globalEventContext = callbackContext !== s && callbackContext.nodeType ?
+                               jQuery( callbackContext ) : jQuery.event,
                        // Deferreds
                        deferred = jQuery.Deferred(),
                        completeDeferred = jQuery._Deferred(),
                        // Status-dependent callbacks
                        statusCode = s.statusCode || {},
+                       // ifModified key
+                       ifModifiedKey,
                        // Headers (they are sent all at once)
                        requestHeaders = {},
                        // Response headers
@@ -449,10 +454,10 @@ jQuery.extend({
                                if ( s.ifModified ) {
 
                                        if ( ( lastModified = jXHR.getResponseHeader( "Last-Modified" ) ) ) {
-                                               jQuery.lastModified[ s.url ] = lastModified;
+                                               jQuery.lastModified[ ifModifiedKey ] = lastModified;
                                        }
                                        if ( ( etag = jXHR.getResponseHeader( "Etag" ) ) ) {
-                                               jQuery.etag[ s.url ] = etag;
+                                               jQuery.etag[ ifModifiedKey ] = etag;
                                        }
                                }
 
@@ -586,6 +591,9 @@ jQuery.extend({
                                s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
                        }
 
+                       // Get ifModifiedKey before adding the anti-cache parameter
+                       ifModifiedKey = s.url;
+
                        // Add anti-cache in url if needed
                        if ( s.cache === false ) {
 
@@ -605,11 +613,12 @@ jQuery.extend({
 
                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
                if ( s.ifModified ) {
-                       if ( jQuery.lastModified[ s.url ] ) {
-                               requestHeaders[ "if-modified-since" ] = jQuery.lastModified[ s.url ];
+                       ifModifiedKey = ifModifiedKey || s.url;
+                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
+                               requestHeaders[ "if-modified-since" ] = jQuery.lastModified[ ifModifiedKey ];
                        }
-                       if ( jQuery.etag[ s.url ] ) {
-                               requestHeaders[ "if-none-match" ] = jQuery.etag[ s.url ];
+                       if ( jQuery.etag[ ifModifiedKey ] ) {
+                               requestHeaders[ "if-none-match" ] = jQuery.etag[ ifModifiedKey ];
                        }
                }
 
@@ -736,9 +745,9 @@ function buildParams( prefix, obj, traditional, add ) {
 
                // Serialize object item.
                } else {
-                       jQuery.each( obj, function( k, v ) {
-                               buildParams( prefix + "[" + k + "]", v, traditional, add );
-                       });
+                       for ( var name in obj ) {
+                               buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+                       }
                }
 
        } else {
@@ -838,8 +847,9 @@ function ajaxConvert( s, response ) {
        }
 
        var dataTypes = s.dataTypes,
-               converters = s.converters,
+               converters = {},
                i,
+               key,
                length = dataTypes.length,
                tmp,
                // Current and previous dataTypes
@@ -856,6 +866,16 @@ function ajaxConvert( s, response ) {
        // For each dataType in the chain
        for( i = 1; i < length; i++ ) {
 
+               // Create converters map
+               // with lowercased keys
+               if ( i === 1 ) {
+                       for( key in s.converters ) {
+                               if( typeof key === "string" ) {
+                                       converters[ key.toLowerCase() ] = s.converters[ key ];
+                               }
+                       }
+               }
+
                // Get the dataTypes
                prev = current;
                current = dataTypes[ i ];