| <!DOCTYPE html> |
| <meta charset=utf-8> |
| <title>Animation.onfinish</title> |
| <link rel="help" href="https://drafts.csswg.org/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(t => { |
| const div = createDiv(t); |
| const animation = div.animate({}, 100 * MS_PER_SEC); |
| let finishedTimelineTime; |
| animation.finished.then(() => { |
| finishedTimelineTime = animation.timeline.currentTime; |
| }); |
| |
| animation.onfinish = t.step_func_done(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(t => { |
| const div = createDiv(t); |
| const animation = div.animate({}, 100 * MS_PER_SEC); |
| |
| let finishedTimelineTime; |
| animation.finished.then(() => { |
| finishedTimelineTime = animation.timeline.currentTime; |
| }); |
| |
| animation.onfinish = t.step_func_done(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(t => { |
| const div = createDiv(t); |
| const animation = div.animate({}, 100 * MS_PER_SEC); |
| |
| let finishedTimelineTime; |
| animation.finished.then(() => { |
| finishedTimelineTime = animation.timeline.currentTime; |
| }); |
| |
| animation.onfinish = t.step_func_done(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(async t => { |
| const div = createDiv(t); |
| const animation = div.animate({}, 100 * MS_PER_SEC); |
| |
| animation.onfinish = event => { |
| assert_unreached('onfinish event should not be fired'); |
| }; |
| |
| animation.currentTime = 100 * MS_PER_SEC / 2; |
| animation.pause(); |
| |
| await animation.ready; |
| animation.currentTime = 100 * MS_PER_SEC; |
| await waitForAnimationFrames(2); |
| }, 'onfinish event is not fired when paused'); |
| |
| promise_test(async t => { |
| const div = createDiv(t); |
| const animation = div.animate({}, 100 * MS_PER_SEC); |
| animation.onfinish = event => { |
| assert_unreached('onfinish event should not be fired'); |
| }; |
| |
| await animation.ready; |
| animation.playbackRate = 0; |
| animation.currentTime = 100 * MS_PER_SEC; |
| await waitForAnimationFrames(2); |
| }, 'onfinish event is not fired when the playbackRate is zero'); |
| |
| promise_test(async t => { |
| const div = createDiv(t); |
| const animation = div.animate({}, 100 * MS_PER_SEC); |
| |
| animation.onfinish = event => { |
| assert_unreached('onfinish event should not be fired'); |
| }; |
| |
| await animation.ready; |
| animation.currentTime = 100 * MS_PER_SEC; |
| animation.currentTime = 100 * MS_PER_SEC / 2; |
| await waitForAnimationFrames(2); |
| }, 'onfinish event is not fired when the animation falls out ' + |
| 'finished state immediately'); |
| |
| </script> |
| </body> |