Skip to content
Permalink
Browse files

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.
  • Loading branch information...
jaubourg committed Feb 4, 2011
1 parent d66cc55 commit 03bad0a9600f05e61a1464c55354d26fcd8f97a4
Showing with 33 additions and 4 deletions.
  1. +14 −4 src/ajax.js
  2. +19 −0 test/unit/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,15 +531,15 @@ jQuery.extend({
jqXHR.statusCode( statusCode );
statusCode = undefined;

if ( s.global ) {
if ( fireGlobals ) {
globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
[ jqXHR, s, isSuccess ? success : error ] );
}

// 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,14 +596,22 @@ 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();

// Determine if request has content
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
@@ -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 );
});

0 comments on commit 03bad0a

Please sign in to comment.
You can’t perform that action at this time.