mirror of
https://github.com/servo/servo.git
synced 2025-07-21 14:23:41 +01:00
219 lines
7.9 KiB
HTML
219 lines
7.9 KiB
HTML
<!DOCTYPE html>
|
|
<meta charset=utf-8>
|
|
<title>Reversing an animation</title>
|
|
<link rel="help"
|
|
href="https://w3c.github.io/web-animations/#reverse-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";
|
|
|
|
promise_test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, {duration: 100 * MS_PER_SEC,
|
|
iterations: Infinity});
|
|
|
|
// Wait a frame because if currentTime is still 0 when we call
|
|
// reverse(), it will throw (per spec).
|
|
return animation.ready.then(waitForAnimationFrames(1)).then(function() {
|
|
assert_greater_than_equal(animation.currentTime, 0,
|
|
'currentTime expected to be greater than 0, one frame after starting');
|
|
animation.currentTime = 50 * MS_PER_SEC;
|
|
var previousPlaybackRate = animation.playbackRate;
|
|
animation.reverse();
|
|
assert_equals(animation.playbackRate, -previousPlaybackRate,
|
|
'playbackRate should be inverted');
|
|
});
|
|
}, 'Reversing an animation inverts the playback rate');
|
|
|
|
promise_test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, {duration: 100 * MS_PER_SEC,
|
|
iterations: Infinity});
|
|
animation.currentTime = 50 * MS_PER_SEC;
|
|
animation.pause();
|
|
|
|
return animation.ready.then(function() {
|
|
animation.reverse();
|
|
return animation.ready;
|
|
}).then(function() {
|
|
assert_equals(animation.playState, 'running',
|
|
'Animation.playState should be "running" after reverse()');
|
|
});
|
|
}, 'Reversing an animation plays a pausing animation');
|
|
|
|
test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, 100 * MS_PER_SEC);
|
|
animation.currentTime = 50 * MS_PER_SEC;
|
|
animation.reverse();
|
|
|
|
assert_equals(animation.currentTime, 50 * MS_PER_SEC,
|
|
'The current time should not change it is in the middle of ' +
|
|
'the animation duration');
|
|
}, 'Reversing an animation maintains the same current time');
|
|
|
|
test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, { duration: 200 * MS_PER_SEC,
|
|
delay: -100 * MS_PER_SEC });
|
|
assert_equals(animation.playState, 'pending',
|
|
'The playState is pending before we call reverse');
|
|
|
|
animation.reverse();
|
|
|
|
assert_equals(animation.playState, 'pending',
|
|
'The playState is still pending after calling reverse');
|
|
}, 'Reversing an animation does not cause it to leave the pending state');
|
|
|
|
promise_test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, { duration: 200 * MS_PER_SEC,
|
|
delay: -100 * MS_PER_SEC });
|
|
var readyResolved = false;
|
|
animation.ready.then(() => { readyResolved = true; });
|
|
|
|
animation.reverse();
|
|
|
|
return Promise.resolve(() => {
|
|
assert_false(readyResolved,
|
|
'ready promise should not have been resolved yet');
|
|
});
|
|
}, 'Reversing an animation does not cause it to resolve the ready promise');
|
|
|
|
test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, 100 * MS_PER_SEC);
|
|
animation.currentTime = 200 * MS_PER_SEC;
|
|
animation.reverse();
|
|
|
|
assert_equals(animation.currentTime, 100 * MS_PER_SEC,
|
|
'reverse() should start playing from the animation effect end ' +
|
|
'if the playbackRate > 0 and the currentTime > effect end');
|
|
}, 'Reversing an animation when playbackRate > 0 and currentTime > ' +
|
|
'effect end should make it play from the end');
|
|
|
|
test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, 100 * MS_PER_SEC);
|
|
|
|
animation.currentTime = -200 * MS_PER_SEC;
|
|
animation.reverse();
|
|
|
|
assert_equals(animation.currentTime, 100 * MS_PER_SEC,
|
|
'reverse() should start playing from the animation effect end ' +
|
|
'if the playbackRate > 0 and the currentTime < 0');
|
|
}, 'Reversing an animation when playbackRate > 0 and currentTime < 0 ' +
|
|
'should make it play from the end');
|
|
|
|
test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, 100 * MS_PER_SEC);
|
|
animation.playbackRate = -1;
|
|
animation.currentTime = -200 * MS_PER_SEC;
|
|
animation.reverse();
|
|
|
|
assert_equals(animation.currentTime, 0,
|
|
'reverse() should start playing from the start of animation time ' +
|
|
'if the playbackRate < 0 and the currentTime < 0');
|
|
}, 'Reversing an animation when playbackRate < 0 and currentTime < 0 ' +
|
|
'should make it play from the start');
|
|
|
|
test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, 100 * MS_PER_SEC);
|
|
animation.playbackRate = -1;
|
|
animation.currentTime = 200 * MS_PER_SEC;
|
|
animation.reverse();
|
|
|
|
assert_equals(animation.currentTime, 0,
|
|
'reverse() should start playing from the start of animation time ' +
|
|
'if the playbackRate < 0 and the currentTime > effect end');
|
|
}, 'Reversing an animation when playbackRate < 0 and currentTime > effect ' +
|
|
'end should make it play from the start');
|
|
|
|
test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, {duration: 100 * MS_PER_SEC,
|
|
iterations: Infinity});
|
|
animation.currentTime = -200 * MS_PER_SEC;
|
|
|
|
assert_throws('InvalidStateError',
|
|
function () { animation.reverse(); },
|
|
'reverse() should throw InvalidStateError ' +
|
|
'if the playbackRate > 0 and the currentTime < 0 ' +
|
|
'and the target effect is positive infinity');
|
|
}, 'Reversing an animation when playbackRate > 0 and currentTime < 0 ' +
|
|
'and the target effect end is positive infinity should throw an exception');
|
|
|
|
test(function(t) {
|
|
var animation = createDiv(t).animate({}, { duration: 100 * MS_PER_SEC,
|
|
iterations: Infinity });
|
|
animation.currentTime = -200 * MS_PER_SEC;
|
|
|
|
try { animation.reverse(); } catch(e) { }
|
|
|
|
assert_equals(animation.playbackRate, 1, 'playbackRate remains unchanged');
|
|
}, 'When reversing throws an exception, the playback rate remains unchanged');
|
|
|
|
test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, {duration: 100 * MS_PER_SEC,
|
|
iterations: Infinity});
|
|
animation.currentTime = -200 * MS_PER_SEC;
|
|
animation.playbackRate = 0;
|
|
|
|
try {
|
|
animation.reverse();
|
|
} catch (e) {
|
|
assert_unreached(`Unexpected exception when calling reverse(): ${e}`);
|
|
}
|
|
}, 'Reversing animation when playbackRate = 0 and currentTime < 0 ' +
|
|
'and the target effect end is positive infinity should NOT throw an ' +
|
|
'exception');
|
|
|
|
test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, {duration: 100 * MS_PER_SEC,
|
|
iterations: Infinity});
|
|
animation.playbackRate = -1;
|
|
animation.currentTime = -200 * MS_PER_SEC;
|
|
animation.reverse();
|
|
|
|
assert_equals(animation.currentTime, 0,
|
|
'reverse() should start playing from the start of animation time ' +
|
|
'if the playbackRate < 0 and the currentTime < 0 ' +
|
|
'and the target effect is positive infinity');
|
|
}, 'Reversing an animation when playbackRate < 0 and currentTime < 0 ' +
|
|
'and the target effect end is positive infinity should make it play ' +
|
|
'from the start');
|
|
|
|
test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation = div.animate({}, 100 * MS_PER_SEC);
|
|
animation.playbackRate = 0;
|
|
animation.currentTime = 50 * MS_PER_SEC;
|
|
animation.reverse();
|
|
|
|
assert_equals(animation.playbackRate, 0,
|
|
'reverse() should preserve playbackRate if the playbackRate == 0');
|
|
assert_equals(animation.currentTime, 50 * MS_PER_SEC,
|
|
'reverse() should not affect the currentTime if the playbackRate == 0');
|
|
t.done();
|
|
}, 'Reversing when when playbackRate == 0 should preserve the current ' +
|
|
'time and playback rate');
|
|
|
|
test(function(t) {
|
|
var div = createDiv(t);
|
|
var animation =
|
|
new Animation(new KeyframeEffect(div, null, 100 * MS_PER_SEC), null);
|
|
|
|
assert_throws('InvalidStateError', function() { animation.reverse(); });
|
|
}, 'Reversing an animation without an active timeline throws an ' +
|
|
'InvalidStateError');
|
|
|
|
</script>
|
|
</body>
|