Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Landing pull request 520. Unset the complete function just before cal…

…ling it to avoid an exception creating a loop. Fixes #5684.

More Details:
 - jquery#520
 - http://bugs.jquery.com/ticket/5684
  • Loading branch information...
commit 8dda57f82f1c366f10c591da099f8e9495eaa01b 1 parent a3b59d7
@gnarf gnarf authored timmywil committed
Showing with 44 additions and 4 deletions.
  1. +12 −4 src/effects.js
  2. +32 −0 test/unit/effects.js
View
16 src/effects.js
@@ -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;
@@ -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;
View
32 test/unit/effects.js
@@ -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);
+});
Please sign in to comment.
Something went wrong with that request. Please try again.