Skip to content

Commit

Permalink
Landing pull request 520. Unset the complete function just before cal…
Browse files Browse the repository at this point in the history
…ling it to avoid an exception creating a loop. Fixes #5684.

More Details:
 - jquery#520
 - http://bugs.jquery.com/ticket/5684
  • Loading branch information
gnarf authored and timmywil committed Sep 28, 2011
1 parent 34acd8c commit 0c044e4
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 4 deletions.
16 changes: 12 additions & 4 deletions src/effects.js
Original file line number Diff line number Diff line change
Expand Up @@ -481,11 +481,11 @@ jQuery.fx.prototype = {

// Each step of an animation
step: function( gotoEnd ) {
var t = fxNow || createFxNow(),
var p, n, complete,
t = fxNow || createFxNow(),
done = true,
elem = this.elem,
options = this.options,
p, n;
options = this.options;

if ( gotoEnd || t >= options.duration + this.startTime ) {
this.now = this.end;
Expand Down Expand Up @@ -525,7 +525,15 @@ jQuery.fx.prototype = {
}

// Execute the complete function
options.complete.call( elem );
// in the event that the complete function throws an exception
// we must ensure it won't be called twice. #5684

complete = options.complete;
if ( complete ) {

options.complete = false;
complete.call( elem );
}
}

return false;
Expand Down
32 changes: 32 additions & 0 deletions test/unit/effects.js
Original file line number Diff line number Diff line change
Expand Up @@ -1205,3 +1205,35 @@ test("callbacks should fire in correct order (#9100)", function() {
}
});
});

asyncTest( "callbacks that throw exceptions will be removed (#5684)", function() {
expect( 2 );

var foo = jQuery( "#foo" );

function testException() {
}

foo.animate({ height: 1 }, 1, function() {
throw new testException;
});

// this test thoroughly abuses undocumented methods - please feel free to update
// with any changes internally to these functions.

// make sure that the standard timer loop will NOT run.
jQuery.fx.stop();

setTimeout(function() {

// the first call to fx.tick should raise the callback exception
raises( jQuery.fx.tick, testException, "Exception was thrown" );

// the second call shouldn't
jQuery.fx.tick();

ok( true, "Test completed without throwing a second exception" );

start();
}, 1);
});

0 comments on commit 0c044e4

Please sign in to comment.