Fixes abort in prefilter. No global event will be fired in that case even if the...
authorjaubourg <j@ubourg.net>
Fri, 4 Feb 2011 21:19:23 +0000 (22:19 +0100)
committerjaubourg <j@ubourg.net>
Fri, 4 Feb 2011 21:19:23 +0000 (22:19 +0100)
src/ajax.js
test/unit/ajax.js

index f33bd49..e56db83 100644 (file)
@@ -388,6 +388,8 @@ jQuery.extend({
                        parts,
                        // The jqXHR state
                        state = 0,
                        parts,
                        // The jqXHR state
                        state = 0,
+                       // To know if global events are to be dispatched
+                       fireGlobals,
                        // Loop variable
                        i,
                        // Fake xhr
                        // Loop variable
                        i,
                        // Fake xhr
@@ -529,7 +531,7 @@ jQuery.extend({
                        jqXHR.statusCode( statusCode );
                        statusCode = undefined;
 
                        jqXHR.statusCode( statusCode );
                        statusCode = undefined;
 
-                       if ( s.global ) {
+                       if ( fireGlobals ) {
                                globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
                                                [ jqXHR, s, isSuccess ? success : error ] );
                        }
                                globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
                                                [ jqXHR, s, isSuccess ? success : error ] );
                        }
@@ -537,7 +539,7 @@ jQuery.extend({
                        // Complete
                        completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
 
                        // Complete
                        completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
 
-                       if ( s.global ) {
+                       if ( fireGlobals ) {
                                globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] );
                                // Handle the global AJAX counter
                                if ( !( --jQuery.active ) ) {
                                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 );
 
                // 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();
 
                // 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
                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" );
                }
 
                        jQuery.event.trigger( "ajaxStart" );
                }
 
@@ -678,7 +688,7 @@ jQuery.extend({
                                // Set state as sending
                                state = jqXHR.readyState = 1;
                                // Send global event
                                // Set state as sending
                                state = jqXHR.readyState = 1;
                                // Send global event
-                               if ( s.global ) {
+                               if ( fireGlobals ) {
                                        globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
                                }
                                // Timeout
                                        globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
                                }
                                // Timeout
index b810313..57e6512 100644 (file)
@@ -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 );
 });
 test("jQuery.ajax - active counter", function() {
     ok( jQuery.active == 0, "ajax active counter should be zero: " + jQuery.active );
 });