Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
- /web-animations/interfaces/Animation/onfinish.html - WPT Dashboard Interop Dashboard
<!DOCTYPE html>
<meta charset=utf-8>
<title>Animation.onfinish</title>
<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_times_equal(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_times_equal(event.currentTime, 100 * MS_PER_SEC,
'event.currentTime should be the effect end');
assert_times_equal(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_times_equal(event.currentTime, 100 * MS_PER_SEC,
'event.currentTime should be the effect end');
assert_times_equal(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');
promise_test(async t => {
const div = createDiv(t);
const animation = div.animate({ opacity: [1, 0]}, 100 * MS_PER_SEC);
const restart_after_finish_promise =
new Promise(async (resolve) => {
let results = [];
animation.onfinish = () => {
animation.play();
animation.ready.then(() => {
results.push(animation.ready);
resolve(results);
});
};
await animation.ready;
results.push(animation.ready);
animation.finish();
});
const results = await restart_after_finish_promise;
assert_not_equals(results[0], results[1],
'Play created a new ready promise');
}, 'Animation can be restarted from the onfinish event');
</script>
</body>