mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Landing pull request 520. Unset the complete function just before calling it to avoid an exception creating a loop. Fixes #5684.
More Details: - https://github.com/jquery/jquery/pull/520 - http://bugs.jquery.com/ticket/5684
This commit is contained in:
parent
a3b59d7f92
commit
8dda57f82f
16
src/effects.js
vendored
16
src/effects.js
vendored
@ -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;
|
||||
|
32
test/unit/effects.js
vendored
32
test/unit/effects.js
vendored
@ -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);
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user