1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
<!doctype html>
<meta charset=utf-8>
<title>Setting the current time of an animation</title>
<link rel="help"
href="https://drafts.csswg.org/web-animations-1/#setting-the-current-time-of-an-animation">
<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';
test(t => {
const anim = new Animation();
assert_equals(anim.playState, 'idle');
assert_equals(anim.currentTime, null);
// This should not throw because the currentTime is already null.
anim.currentTime = null;
}, 'Setting the current time of a pending animation to unresolved does not'
+ ' throw a TypeError');
promise_test(async t => {
const anim = createDiv(t).animate(null, 100 * MS_PER_SEC);
await anim.ready;
assert_greater_than_equal(anim.currentTime, 0);
assert_throws_js(TypeError, () => {
anim.currentTime = null;
});
}, 'Setting the current time of a playing animation to unresolved throws a'
+ ' TypeError');
promise_test(async t => {
const anim = createDiv(t).animate(null, 100 * MS_PER_SEC);
await anim.ready;
anim.pause();
assert_greater_than_equal(anim.currentTime, 0);
assert_throws_js(TypeError, () => {
anim.currentTime = null;
});
}, 'Setting the current time of a paused animation to unresolved throws a'
+ ' TypeError');
promise_test(async t => {
const anim = createDiv(t).animate(null, 100 * MS_PER_SEC);
await anim.ready;
anim.pause();
// We should be pause-pending now
assert_true(anim.pending);
assert_equals(anim.playState, 'paused');
// Apply a pending playback rate
anim.updatePlaybackRate(2);
assert_equals(anim.playbackRate, 1);
// Setting the current time should apply the pending playback rate
anim.currentTime = 50 * MS_PER_SEC;
assert_equals(anim.playbackRate, 2);
assert_false(anim.pending);
// Sanity check that the current time is preserved
assert_time_equals_literal(anim.currentTime, 50 * MS_PER_SEC);
}, 'Setting the current time of a pausing animation applies a pending playback'
+ ' rate');
// The following tests verify that currentTime can be set outside of the normal
// bounds of an animation.
promise_test(async t => {
const anim = createDiv(t).animate(null, 100 * MS_PER_SEC);
await anim.ready;
anim.currentTime = 200 * MS_PER_SEC;
assert_equals(anim.playState, 'finished');
assert_time_equals_literal(anim.currentTime, 200 * MS_PER_SEC);
}, 'Setting the current time after the end with a positive playback rate');
promise_test(async t => {
const anim = createDiv(t).animate(null, 100 * MS_PER_SEC);
await anim.ready;
anim.currentTime = -100 * MS_PER_SEC;
assert_equals(anim.playState, 'running');
assert_time_equals_literal(anim.currentTime, -100 * MS_PER_SEC);
await waitForAnimationFrames(2);
assert_greater_than(anim.currentTime, -100 * MS_PER_SEC);
}, 'Setting a negative current time with a positive playback rate');
promise_test(async t => {
const anim = createDiv(t).animate(null, 100 * MS_PER_SEC);
anim.updatePlaybackRate(-1);
await anim.ready;
anim.currentTime = 200 * MS_PER_SEC;
assert_equals(anim.playState, 'running');
assert_time_equals_literal(anim.currentTime, 200 * MS_PER_SEC);
await waitForAnimationFrames(2);
assert_less_than(anim.currentTime, 200 * MS_PER_SEC);
}, 'Setting the current time after the end with a negative playback rate');
promise_test(async t => {
const anim = createDiv(t).animate(null, 100 * MS_PER_SEC);
anim.updatePlaybackRate(-1);
await anim.ready;
anim.currentTime = -100 * MS_PER_SEC;
assert_equals(anim.playState, 'finished');
assert_time_equals_literal(anim.currentTime, -100 * MS_PER_SEC);
}, 'Setting a negative current time with a negative playback rate');
promise_test(async t => {
const anim = createDiv(t).animate(null, 100 * MS_PER_SEC);
anim.updatePlaybackRate(0);
await anim.ready;
// An animation with a playback rate of zero is never in the finished state
// even if currentTime is outside the normal range of [0, effect end].
anim.currentTime = 200 * MS_PER_SEC;
assert_equals(anim.playState, 'running');
assert_time_equals_literal(anim.currentTime, 200 * MS_PER_SEC);
await waitForAnimationFrames(2);
assert_time_equals_literal(anim.currentTime, 200 * MS_PER_SEC);
anim.currentTime = -200 * MS_PER_SEC;
assert_equals(anim.playState, 'running');
assert_time_equals_literal(anim.currentTime, -200 * MS_PER_SEC);
await waitForAnimationFrames(2);
assert_time_equals_literal(anim.currentTime, -200 * MS_PER_SEC);
}, 'Setting the current time on an animation with a zero playback rate');
</script>
</body>
|