From 5ca8f0617f5c94495380ff783452a52eab706d39 Mon Sep 17 00:00:00 2001 From: jaubourg Date: Tue, 25 Jan 2011 16:08:19 +0100 Subject: [PATCH] Reworks how values of parameters passed to error callbacks are determined. Fixes #8050. --- src/ajax.js | 22 ++++++++++++++++------ src/ajax/xhr.js | 9 +++------ test/unit/ajax.js | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 12 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index 89d60e1..8f8bc60 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -400,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; @@ -438,7 +439,7 @@ jQuery.extend({ var isSuccess, success, - error = ( statusText = statusText || "error" ), + error, response = responses ? ajaxHandleResponses( s, jXHR, responses ) : undefined, lastModified, etag; @@ -476,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 @@ -634,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; @@ -653,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 ); diff --git a/src/ajax/xhr.js b/src/ajax/xhr.js index 5629dcd..b820642 100644 --- a/src/ajax/xhr.js +++ b/src/ajax/xhr.js @@ -108,12 +108,9 @@ if ( jQuery.support.ajax ) { } catch( _ ) {} // Do send the request - try { - xhr.send( ( s.hasContent && s.data ) || null ); - } catch( e ) { - complete( 0, "error", "" + e ); - return; - } + // This may raise an exception which is actually + // handled in jQuery.ajax (so no try/catch here) + xhr.send( ( s.hasContent && s.data ) || null ); // Listener callback = function( _, isAbort ) { diff --git a/test/unit/ajax.js b/test/unit/ajax.js index b44f077..d018372 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -240,6 +240,47 @@ test("jQuery.ajax() - error callbacks", function() { }); }); +test("jQuery.ajax() - textStatus and errorThrown values", function() { + + var nb = 3; + + expect( 2 * nb ); + stop(); + + function startN() { + if ( !( --nb ) ) { + start(); + } + } + + jQuery.ajax({ + url: url("data/nonExistingURL"), + error: function( _ , textStatus , errorThrown ){ + strictEqual( textStatus, "error", "textStatus is 'error' for 404" ); + strictEqual( errorThrown, "Not Found", "errorThrown is 'Not Found' for 404"); + startN(); + } + }); + + jQuery.ajax({ + url: url("data/name.php?wait=5"), + error: function( _ , textStatus , errorThrown ){ + strictEqual( textStatus, "abort", "textStatus is 'abort' for abort" ); + strictEqual( errorThrown, "abort", "errorThrown is 'abort' for abort"); + startN(); + } + }).abort(); + + jQuery.ajax({ + url: url("data/name.php?wait=5"), + error: function( _ , textStatus , errorThrown ){ + strictEqual( textStatus, "mystatus", "textStatus is 'mystatus' for abort('mystatus')" ); + strictEqual( errorThrown, "mystatus", "errorThrown is 'mystatus' for abort('mystatus')"); + startN(); + } + }).abort( "mystatus" ); +}); + test("jQuery.ajax() - responseText on error", function() { expect( 1 ); -- 1.7.10.4