X-Git-Url: http://git.asbjorn.biz/?p=jquery.git;a=blobdiff_plain;f=src%2Fajax.js;h=8f8bc60ab07fc1105ff4a1377857fdb8dc238854;hp=cca63a291bcc37a708544cb7f0ab0663b357a71b;hb=5ca8f0617f5c94495380ff783452a52eab706d39;hpb=02ca45573b8428f16e3eddb41f8fc50867bbda1b diff --git a/src/ajax.js b/src/ajax.js index cca63a2..8f8bc60 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -76,38 +76,42 @@ function addToPrefiltersOrTransports( structure ) { //Base inspection function for prefilters and transports function inspectPrefiltersOrTransports( structure, options, originalOptions, - dataType /* internal */, tested /* internal */ ) { + dataType /* internal */, inspected /* internal */ ) { dataType = dataType || options.dataTypes[ 0 ]; - tested = tested || {}; + inspected = inspected || {}; - tested[ dataType ] = true; + inspected[ dataType ] = true; var list = structure[ dataType ], i = 0, length = list ? list.length : 0, - executeOnly = structure === prefilters, - selected; - - for(; i < length && !( executeOnly ? typeof selected === "string" && !tested[ selected ] : selected ); i++ ) { - selected = list[ i ]( options, originalOptions ); + executeOnly = ( structure === prefilters ), + selection; + + for(; i < length && ( executeOnly || !selection ); i++ ) { + selection = list[ i ]( options, originalOptions ); + // If we got redirected to another dataType + // we try there if not done already + if ( typeof selection === "string" ) { + if ( inspected[ selection ] ) { + selection = undefined; + } else { + options.dataTypes.unshift( selection ); + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, selection, inspected ); + } + } } - // If we got redirected to another dataType - // we try there - if ( typeof selected === "string" && !tested[ selected ] ) { - options.dataTypes.unshift( selected ); - selected = inspectPrefiltersOrTransports( - structure, options, originalOptions, selected, tested ); - // If we're only executing or nothing was selected // we try the catchall dataType if not done already - } else if ( ( executeOnly || !selected ) && !tested[ "*" ] ) { - selected = inspectPrefiltersOrTransports( - structure, options, originalOptions, "*" ,tested ); + if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, "*", inspected ); } // unnecessary when only executing (prefilters) // but it'll be ignored by the caller in that case - return selected; + return selection; } jQuery.fn.extend({ @@ -396,8 +400,9 @@ jQuery.extend({ // Cancel the request abort: function( statusText ) { + statusText = statusText || "abort"; if ( transport ) { - transport.abort( statusText || "abort" ); + transport.abort( statusText ); } done( 0, statusText ); return this; @@ -434,7 +439,7 @@ jQuery.extend({ var isSuccess, success, - error = ( statusText = statusText || "error" ), + error, response = responses ? ajaxHandleResponses( s, jXHR, responses ) : undefined, lastModified, etag; @@ -472,6 +477,16 @@ jQuery.extend({ error = "" + e; } } + } else { + // We extract error from statusText + // then normalize statusText and status for non-aborts + error = statusText; + if( status ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } } // Set data for the fake xhr object @@ -630,7 +645,7 @@ jQuery.extend({ // If no transport, we auto-abort if ( !transport ) { - done( 0, "notransport" ); + done( -1, "No Transport" ); } else { // Set state as sending state = jXHR.readyState = 1; @@ -649,9 +664,8 @@ jQuery.extend({ transport.send( requestHeaders, done ); } catch (e) { // Propagate exception as error if not done - if ( status === 1 ) { - done( 0, "error", "" + e ); - jXHR = false; + if ( status < 2 ) { + done( -1, "" + e ); // Simply rethrow otherwise } else { jQuery.error( e );