<!DOCTYPE html> <meta charset=utf-8> <title>Animation.onfinish</title> <link rel="help" href="https://w3c.github.io/web-animations/#dom-animation-onfinish"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="../../testcommon.js"></script> <body> <div id="log"></div> <script> "use strict"; async_test(function(t) { var div = createDiv(t); var animation = div.animate({}, 100 * MS_PER_SEC); var finishedTimelineTime; animation.finished.then(function() { finishedTimelineTime = animation.timeline.currentTime; }); animation.onfinish = t.step_func_done(function(event) { assert_equals(event.currentTime, 0, 'event.currentTime should be zero'); assert_equals(event.timelineTime, finishedTimelineTime, 'event.timelineTime should equal to the animation timeline ' + 'when finished promise is resolved'); }); animation.playbackRate = -1; }, 'onfinish event is fired when the currentTime < 0 and ' + 'the playbackRate < 0'); async_test(function(t) { var div = createDiv(t); var animation = div.animate({}, 100 * MS_PER_SEC); var finishedTimelineTime; animation.finished.then(function() { finishedTimelineTime = animation.timeline.currentTime; }); animation.onfinish = t.step_func_done(function(event) { assert_equals(event.currentTime, 100 * MS_PER_SEC, 'event.currentTime should be the effect end'); assert_equals(event.timelineTime, finishedTimelineTime, 'event.timelineTime should equal to the animation timeline ' + 'when finished promise is resolved'); }); animation.currentTime = 100 * MS_PER_SEC; }, 'onfinish event is fired when the currentTime > 0 and ' + 'the playbackRate > 0'); async_test(function(t) { var div = createDiv(t); var animation = div.animate({}, 100 * MS_PER_SEC); var finishedTimelineTime; animation.finished.then(function() { finishedTimelineTime = animation.timeline.currentTime; }); animation.onfinish = t.step_func_done(function(event) { assert_equals(event.currentTime, 100 * MS_PER_SEC, 'event.currentTime should be the effect end'); assert_equals(event.timelineTime, finishedTimelineTime, 'event.timelineTime should equal to the animation timeline ' + 'when finished promise is resolved'); }); animation.finish(); }, 'onfinish event is fired when animation.finish() is called'); promise_test(function(t) { var div = createDiv(t); var animation = div.animate({}, 100 * MS_PER_SEC); animation.onfinish = function(event) { assert_unreached('onfinish event should not be fired'); }; animation.currentTime = 100 * MS_PER_SEC / 2; animation.pause(); return animation.ready.then(function() { animation.currentTime = 100 * MS_PER_SEC; return waitForAnimationFrames(2); }); }, 'onfinish event is not fired when paused'); promise_test(function(t) { var div = createDiv(t); var animation = div.animate({}, 100 * MS_PER_SEC); animation.onfinish = function(event) { assert_unreached('onfinish event should not be fired'); }; return animation.ready.then(function() { animation.playbackRate = 0; animation.currentTime = 100 * MS_PER_SEC; return waitForAnimationFrames(2); }); }, 'onfinish event is not fired when the playbackRate is zero'); promise_test(function(t) { var div = createDiv(t); var animation = div.animate({}, 100 * MS_PER_SEC); animation.onfinish = function(event) { assert_unreached('onfinish event should not be fired'); }; return animation.ready.then(function() { animation.currentTime = 100 * MS_PER_SEC; animation.currentTime = 100 * MS_PER_SEC / 2; return waitForAnimationFrames(2); }); }, 'onfinish event is not fired when the animation falls out ' + 'finished state immediately'); </script> </body>