From 03bad0a9600f05e61a1464c55354d26fcd8f97a4 Mon Sep 17 00:00:00 2001 From: jaubourg Date: Fri, 4 Feb 2011 22:19:23 +0100 Subject: [PATCH] Fixes abort in prefilter. No global event will be fired in that case even if the global option is set to true. Unit test added. --- src/ajax.js | 18 ++++++++++++++---- test/unit/ajax.js | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index f33bd49..e56db83 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -388,6 +388,8 @@ jQuery.extend({ parts, // The jqXHR state state = 0, + // To know if global events are to be dispatched + fireGlobals, // Loop variable i, // Fake xhr @@ -529,7 +531,7 @@ jQuery.extend({ jqXHR.statusCode( statusCode ); statusCode = undefined; - if ( s.global ) { + if ( fireGlobals ) { globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), [ jqXHR, s, isSuccess ? success : error ] ); } @@ -537,7 +539,7 @@ jQuery.extend({ // Complete completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] ); - if ( s.global ) { + if ( fireGlobals ) { globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] ); // Handle the global AJAX counter if ( !( --jQuery.active ) ) { @@ -594,6 +596,14 @@ jQuery.extend({ // Apply prefilters inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + // If request was aborted inside a prefiler, stop there + if ( state === 2 ) { + return false; + } + + // We can fire global events as of now if asked to + fireGlobals = s.global; + // Uppercase the type s.type = s.type.toUpperCase(); @@ -601,7 +611,7 @@ jQuery.extend({ s.hasContent = !rnoContent.test( s.type ); // Watch for a new set of requests - if ( s.global && jQuery.active++ === 0 ) { + if ( fireGlobals && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } @@ -678,7 +688,7 @@ jQuery.extend({ // Set state as sending state = jqXHR.readyState = 1; // Send global event - if ( s.global ) { + if ( fireGlobals ) { globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); } // Timeout diff --git a/test/unit/ajax.js b/test/unit/ajax.js index b810313..57e6512 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -2177,6 +2177,25 @@ test("jQuery.ajax - transitive conversions", function() { }); +test("jQuery.ajax - abort in prefilter", function() { + + expect( 1 ); + + jQuery.ajaxPrefilter(function( options, _, jqXHR ) { + if ( options.abortInPrefilter ) { + jqXHR.abort(); + } + }); + + strictEqual( jQuery.ajax({ + abortInPrefilter: true, + error: function() { + ok( false, "error callback called" ); + } + }), false, "Request was properly aborted early by the prefilter" ); + +}); + test("jQuery.ajax - active counter", function() { ok( jQuery.active == 0, "ajax active counter should be zero: " + jQuery.active ); }); -- 1.7.10.4