Re-adds hastily removed variable and simplifies statusCode based callbacks handling.
[jquery.git] / src / ajax.js
index 5c4d469..9173d8a 100644 (file)
@@ -175,15 +175,13 @@ jQuery.extend({
                timeout: 0,
                data: null,
                dataType: null,
-               dataTypes: null,
                username: null,
                password: null,
                cache: null,
                traditional: false,
+               headers: {},
+               crossDomain: null,
                */
-               xhr: function() {
-                       return new window.XMLHttpRequest();
-               },
 
                accepts: {
                        xml: "application/xml, text/xml",
@@ -235,8 +233,7 @@ jQuery.extend({
        },
 
        // Main method
-       // (s is used internally)
-       ajax: function( url , options , s ) {
+       ajax: function( url , options ) {
 
                // Handle varargs
                if ( arguments.length === 1 ) {
@@ -250,19 +247,14 @@ jQuery.extend({
                // Get the url if provided separately
                options.url = url || options.url;
 
-               // Create the final options object
-               s = jQuery.extend( true , {} , jQuery.ajaxSettings , options );
-
-               // We force the original context
-               // (plain objects used as context get extended)
-               s.context = options.context;
-
-               var // jQuery lists
+               var // Create the final options object
+                       s = jQuery.extend( true , {} , jQuery.ajaxSettings , options ),
+                       // jQuery lists
                        jQuery_lastModified = jQuery.lastModified,
                        jQuery_etag = jQuery.etag,
                        // Callbacks contexts
-                       callbackContext = s.context || s,
-                       globalEventContext = s.context ? jQuery( s.context ) : jQuery.event,
+                       callbackContext = options.context || s.context || s,
+                       globalEventContext = callbackContext === s ? jQuery.event : jQuery( callbackContext ),
                        // Deferreds
                        deferred = jQuery.Deferred(),
                        completeDeferred = jQuery._Deferred(),
@@ -303,30 +295,25 @@ jQuery.extend({
                                },
 
                                // Builds headers hashtable if needed
-                               // (match is used internally)
-                               getResponseHeader: function( key , match ) {
+                               getResponseHeader: function( key ) {
+
+                                       var match;
 
                                        if ( state === 2 ) {
 
-                                               if ( responseHeaders === undefined ) {
+                                               if ( !responseHeaders ) {
 
                                                        responseHeaders = {};
 
-                                                       if ( typeof responseHeadersString === "string" ) {
-
-                                                               while( ( match = rheaders.exec( responseHeadersString ) ) ) {
-                                                                       responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
-                                                               }
+                                                       while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+                                                               responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
                                                        }
                                                }
                                                match = responseHeaders[ key.toLowerCase() ];
 
-                                       } else {
-
-                                               match = null;
                                        }
 
-                                       return match;
+                                       return match || null;
                                },
 
                                // Cancel the request
@@ -339,6 +326,10 @@ jQuery.extend({
                                }
                        };
 
+               // We force the original context
+               // (plain objects used as context get extended)
+               s.context = options.context;
+
                // Callback for when everything is done
                // It is defined here because jslint complains if it is declared
                // at the end of the function (which would be more logical and readable)
@@ -354,7 +345,7 @@ jQuery.extend({
 
                        // Dereference transport for early garbage collection
                        // (no matter how long the jXHR transport will be used
-                       transport = 0;
+                       transport = undefined;
 
                        // Set readyState
                        jXHR.readyState = status ? 4 : 0;
@@ -377,7 +368,12 @@ jQuery.extend({
                                // Stored success
                                success,
                                // Stored error
-                               error;
+                               error,
+
+                               // Keep track of statusCode callbacks
+                               oldStatusCode = statusCode;
+
+                       statusCode = undefined;
 
                        // If successful, handle type chaining
                        if ( status >= 200 && status < 300 || status === 304 ) {
@@ -419,6 +415,8 @@ jQuery.extend({
                                                        current,
                                                        // Previous dataType
                                                        prev,
+                                                       // Conversion expression
+                                                       conversion,
                                                        // Conversion function
                                                        conv,
                                                        // Conversion functions (when text is used in-between)
@@ -457,8 +455,8 @@ jQuery.extend({
                                                                if ( prev !== "*" && current !== "*" && prev !== current ) {
 
                                                                        // Get the converter
-                                                                       conv = converters[ prev + " " + current ] ||
-                                                                               converters[ "* " + current ];
+                                                                       conversion = prev + " " + current;
+                                                                       conv = converters[ conversion ] || converters[ "* " + current ];
 
                                                                        conv1 = conv2 = 0;
 
@@ -533,7 +531,7 @@ jQuery.extend({
                        }
 
                        // Status-dependent callbacks
-                       jXHR.statusCode( statusCode );
+                       jXHR.statusCode( oldStatusCode );
 
                        if ( s.global ) {
                                globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ) ,
@@ -561,20 +559,14 @@ jQuery.extend({
                // Status-dependent callbacks
                jXHR.statusCode = function( map ) {
                        if ( map ) {
-                               var resolved = jXHR.isResolved(),
-                                       tmp;
-                               if ( resolved || jXHR.isRejected() ) {
-                                       tmp = map[ jXHR.status ];
-                                       if ( tmp ) {
-                                               if ( map === statusCode ) {
-                                                       delete statusCode[ jXHR.status ];
-                                               }
-                                               jXHR[ resolved ? "done" : "fail" ]( tmp );
-                                       }
-                               } else {
+                               var tmp;
+                               if ( statusCode ) {
                                        for( tmp in map ) {
                                                statusCode[ tmp ] = [ statusCode[ tmp ] , map[ tmp ] ];
                                        }
+                               } else {
+                                       tmp = map[ jXHR.status ];
+                                       jXHR.done( tmp ).fail( tmp );
                                }
                        }
                        return this;
@@ -583,12 +575,6 @@ jQuery.extend({
                // Remove hash character (#7531: and string promotion)
                s.url = ( "" + s.url ).replace( rhash , "" );
 
-               // Uppercase the type
-               s.type = s.type.toUpperCase();
-
-               // Determine if request has content
-               s.hasContent = ! rnoContent.test( s.type );
-
                // Extract dataTypes list
                s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( /\s+/ );
 
@@ -604,13 +590,19 @@ jQuery.extend({
                }
 
                // Convert data if not already a string
-               if ( s.data && s.processData && typeof s.data != "string" ) {
+               if ( s.data && s.processData && typeof s.data !== "string" ) {
                        s.data = jQuery.param( s.data , s.traditional );
                }
 
                // Apply prefilters
                jQuery.ajaxPrefilter( s , options );
 
+               // Uppercase the type
+               s.type = s.type.toUpperCase();
+
+               // Determine if request has content
+               s.hasContent = ! rnoContent.test( s.type );
+
                // Watch for a new set of requests
                if ( s.global && jQuery.active++ === 0 ) {
                        jQuery.event.trigger( "ajaxStart" );
@@ -976,33 +968,4 @@ function determineDataType( s , ct , text , xml ) {
        return response;
 }
 
-/*
- * Create the request object; Microsoft failed to properly
- * implement the XMLHttpRequest in IE7 (can't request local files),
- * so we use the ActiveXObject when it is available
- * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
- * we need a fallback.
- */
-if ( window.ActiveXObject ) {
-       jQuery.ajaxSettings.xhr = function() {
-       if ( window.location.protocol !== "file:" ) {
-               try {
-                       return new window.XMLHttpRequest();
-               } catch( xhrError ) {}
-       }
-
-       try {
-               return new window.ActiveXObject("Microsoft.XMLHTTP");
-       } catch( activeError ) {}
-       };
-}
-
-var testXHR = jQuery.ajaxSettings.xhr();
-
-// Does this browser support XHR requests?
-jQuery.support.ajax = !!testXHR;
-
-// Does this browser support crossDomain XHR requests
-jQuery.support.cors = testXHR && "withCredentials" in testXHR;
-
 })( jQuery );