From 9ab00a712fe3757f130dce8b42293c82a68c690e Mon Sep 17 00:00:00 2001 From: jaubourg Date: Thu, 20 Jan 2011 15:39:30 +0100 Subject: Makes sure statusCode callbacks are ordered in the same way success and error callbacks are. Unit tests added. --- src/ajax.js | 8 ++++---- test/unit/ajax.js | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index fc1ecfde3..63914d23a 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -427,10 +427,8 @@ jQuery.extend({ // Stored error error, - // Keep track of statusCode callbacks - oldStatusCode = statusCode; - - statusCode = undefined; + // To keep track of statusCode based callbacks + oldStatusCode; // If successful, handle type chaining if ( status >= 200 && status < 300 || status === 304 ) { @@ -588,6 +586,8 @@ jQuery.extend({ } // Status-dependent callbacks + oldStatusCode = statusCode; + statusCode = undefined; jXHR.statusCode( oldStatusCode ); if ( s.global ) { diff --git a/test/unit/ajax.js b/test/unit/ajax.js index d262988eb..1ed15b50c 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -1911,9 +1911,9 @@ test( "jQuery.ajax - Location object as url (#7531)", 1, function () { test( "jQuery.ajax - statusCode" , function() { - var count = 10; + var count = 12; - expect( 16 ); + expect( 20 ); stop(); function countComplete() { @@ -1975,8 +1975,35 @@ test( "jQuery.ajax - statusCode" , function() { } }).statusCode( createStatusCodes( "all (immediately with method)" , isSuccess ) ); - }); + var testString = ""; + + jQuery.ajax( url( uri ), { + success: function( a , b , jXHR ) { + ok( isSuccess , "success" ); + var statusCode = {}; + statusCode[ jXHR.status ] = function() { + testString += "B"; + }; + jXHR.statusCode( statusCode ); + testString += "A"; + }, + error: function( jXHR ) { + ok( ! isSuccess , "error" ); + var statusCode = {}; + statusCode[ jXHR.status ] = function() { + testString += "B"; + }; + jXHR.statusCode( statusCode ); + testString += "A"; + }, + complete: function() { + strictEqual( testString , "AB" , "Test statusCode callbacks are ordered like " + + ( isSuccess ? "success" : "error" ) + " callbacks" ); + countComplete(); + } + } ); + }); }); test("jQuery.ajax - active counter", function() { -- cgit v1.2.3 From 3e1d3d0f21d1b292fe721b4f483b3a3bc2dadd86 Mon Sep 17 00:00:00 2001 From: jaubourg Date: Thu, 20 Jan 2011 16:22:36 +0100 Subject: Revises the way arguments are handled in ajax. --- src/ajax.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index 63914d23a..dd3c50d80 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -291,18 +291,16 @@ jQuery.extend({ // Main method ajax: function( url , options ) { - // Handle varargs - if ( arguments.length === 1 ) { + // If options is not an object, + // we simulate pre-1.5 signature + if ( typeof( options ) !== "object" ) { options = url; - url = options ? options.url : undefined; + url = undefined; } // Force options to be an object options = options || {}; - // Get the url if provided separately - options.url = url || options.url; - var // Create the final options object s = jQuery.extend( true , {} , jQuery.ajaxSettings , options ), // jQuery lists @@ -630,7 +628,8 @@ jQuery.extend({ }; // Remove hash character (#7531: and string promotion) - s.url = ( "" + s.url ).replace( rhash , "" ); + // We also use the url parameter if available + s.url = ( "" + ( url || s.url ) ).replace( rhash , "" ); // Extract dataTypes list s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( /\s+/ ); -- cgit v1.2.3 From ef86694ada757e5bc14227f8e5cc7d9d3a771da2 Mon Sep 17 00:00:00 2001 From: jaubourg Date: Thu, 20 Jan 2011 17:38:21 +0100 Subject: Renames determineDataType as determineResponse. Makes it more generic as a first step into integrating the logic into the main ajax done callback. Also fixes some comments in ajax/xhr.js. --- src/ajax.js | 31 +++++++++++++++---------------- src/ajax/xhr.js | 23 ++++++++++++----------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index dd3c50d80..955856cc2 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -235,7 +235,7 @@ jQuery.extend({ // Utility function that handles dataType when response is received // (for those transports that can give text or xml responses) - determineDataType: function( ct , text , xml ) { + determineResponse: function( responses , ct ) { var s = this, contents = s.contents, @@ -246,7 +246,7 @@ jQuery.extend({ response; // Auto (xml, json, script or text determined given headers) - if ( transportDataType === "*" ) { + if ( ct && transportDataType === "*" ) { for ( type in contents ) { if ( ( regexp = contents[ type ] ) && regexp.test( ct ) ) { @@ -256,23 +256,22 @@ jQuery.extend({ } } - // xml and parsed as such - if ( transportDataType === "xml" && - xml && - xml.documentElement /* #4958 */ ) { - - response = xml; - - // Text response was provided - } else { + // Get response + for( type in responses ) { + if ( type === transportDataType ) { + break; + } + } - response = text; + // Get final response + response = responses[ type ]; - // If it's not really text, defer to converters - if ( transportDataType !== "text" ) { - dataTypes.unshift( "text" ); + // If it's not the right dataType, handle the dataTypeList + if ( transportDataType !== type ) { + if ( transportDataType === "*" ) { + dataTypes.shift(); } - + dataTypes.unshift( type ); } return response; diff --git a/src/ajax/xhr.js b/src/ajax/xhr.js index 4acb70054..cd9838c3b 100644 --- a/src/ajax/xhr.js +++ b/src/ajax/xhr.js @@ -12,8 +12,8 @@ var // Next active xhr id // XHR used to determine supports properties testXHR; -// Create the request object; Microsoft failed to properly -// (This is still attached to ajaxSettings for backward compatibility reasons) +// Create the request object +// (This is still attached to ajaxSettings for backward compatibility) jQuery.ajaxSettings.xhr = window.ActiveXObject ? /* Microsoft failed to properly * implement the XMLHttpRequest in IE7 (can't request local files), @@ -146,8 +146,9 @@ if ( jQuery.support.ajax ) { // Get info var status = xhr.status, statusText, - response, - responseHeaders = xhr.getAllResponseHeaders(); + responseHeaders = xhr.getAllResponseHeaders(), + responses = {}, + xml = xhr.responseXML; try { // Firefox throws an exception when accessing statusText for faulty cross-domain requests @@ -184,15 +185,15 @@ if ( jQuery.support.ajax ) { status ); - // Guess response & update dataType accordingly - response = - s.determineDataType( - xhr.getResponseHeader("content-type"), - xhr.responseText, - xhr.responseXML ); + // Construct response list + if ( xml && xml.documentElement /* #4958 */ ) { + responses.xml = xml; + } + responses.text = xhr.responseText; // Call complete - complete(status,statusText,response,responseHeaders); + complete(status,statusText,s.determineResponse( responses, + xhr.getResponseHeader( "content-type" ) ),responseHeaders); } } }; -- cgit v1.2.3 From a7cb93bee529a09056f521e6c0b760447b5cfb29 Mon Sep 17 00:00:00 2001 From: jaubourg Date: Thu, 20 Jan 2011 17:51:57 +0100 Subject: Renames Deferred's fire and fireReject methods as resolveWith and rejectWith respectively. --- src/ajax.js | 6 +++--- src/core.js | 14 +++++++------- test/unit/core.js | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index 955856cc2..a92522f5b 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -577,9 +577,9 @@ jQuery.extend({ // Success/Error if ( isSuccess ) { - deferred.fire( callbackContext , [ success , statusText , jXHR ] ); + deferred.resolveWith( callbackContext , [ success , statusText , jXHR ] ); } else { - deferred.fireReject( callbackContext , [ jXHR , statusText , error ] ); + deferred.rejectWith( callbackContext , [ jXHR , statusText , error ] ); } // Status-dependent callbacks @@ -593,7 +593,7 @@ jQuery.extend({ } // Complete - completeDeferred.fire( callbackContext, [ jXHR , statusText ] ); + completeDeferred.resolveWith( callbackContext, [ jXHR , statusText ] ); if ( s.global ) { globalEventContext.trigger( "ajaxComplete" , [ jXHR , s] ); diff --git a/src/core.js b/src/core.js index f116ef4d1..69f4f5ac9 100644 --- a/src/core.js +++ b/src/core.js @@ -406,7 +406,7 @@ jQuery.extend({ } // If there are functions bound, to execute - readyList.fire( document , [ jQuery ] ); + readyList.resolveWith( document , [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { @@ -844,7 +844,7 @@ jQuery.extend({ } if ( _fired ) { - deferred.fire( _fired[ 0 ] , _fired[ 1 ] ); + deferred.resolveWith( _fired[ 0 ] , _fired[ 1 ] ); } } @@ -852,7 +852,7 @@ jQuery.extend({ }, // resolve with given context and args - fire: function( context , args ) { + resolveWith: function( context , args ) { if ( ! cancelled && ! fired && ! firing ) { firing = 1; @@ -872,7 +872,7 @@ jQuery.extend({ // resolve with this as context and given arguments resolve: function() { - deferred.fire( jQuery.isFunction( this.promise ) ? this.promise() : this , arguments ); + deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this , arguments ); return this; }, @@ -908,7 +908,7 @@ jQuery.extend({ return this; }, fail: failDeferred.done, - fireReject: failDeferred.fire, + rejectWith: failDeferred.resolveWith, reject: failDeferred.resolve, isRejected: failDeferred.isResolved, // Get a promise for this deferred @@ -961,10 +961,10 @@ jQuery.extend({ args = arguments; resolveArray[ index ] = args.length > 1 ? slice.call( args , 0 ) : value; if( ! --length ) { - deferred.fire( promise, resolveArray ); + deferred.resolveWith( promise, resolveArray ); } }).fail( function() { - deferred.fireReject( promise, arguments ); + deferred.rejectWith( promise, arguments ); }); return !deferred.isRejected(); }); diff --git a/test/unit/core.js b/test/unit/core.js index 8e57edf95..30039bf92 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1002,7 +1002,7 @@ test("jQuery._Deferred()", function() { deferred = jQuery._Deferred(); - deferred.fire( jQuery , [ document ] ).done( function( doc ) { + deferred.resolveWith( jQuery , [ document ] ).done( function( doc ) { ok( this === jQuery && arguments.length === 1 && doc === document , "Test fire context & args" ); }); }); -- cgit v1.2.3