blob: 116bd47cddb3362a01c6a473d5216aa693133be3 [file] [log] [blame]
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<body>
<div id='e'></div>
</body>
<script>
var element = document.getElementById('e');
var keyframes = [{opacity: '1', offset: 0}, {opacity: '0', offset: 1}];
test(function() {
var keyframeEffect = new KeyframeEffect(element, keyframes);
assert_equals(keyframeEffect.computedTiming.localTime, null);
assert_equals(keyframeEffect.computedTiming.currentIteration, null);
}, 'localTime and currentIteration are null when the KeyframeEffect is not associated with an Animation');
test(function() {
var animation = element.animate(keyframes, {fill: 'both', duration: 2000, iterations: 3});
var keyframeEffect = animation.effect;
animation.currentTime = -1000;
assert_equals(keyframeEffect.computedTiming.localTime, -1000, 'localTime');
assert_equals(keyframeEffect.computedTiming.currentIteration, 0);
animation.currentTime = 1000;
assert_equals(keyframeEffect.computedTiming.localTime, 1000);
assert_equals(keyframeEffect.computedTiming.currentIteration, 0);
animation.currentTime = 5000;
assert_equals(keyframeEffect.computedTiming.localTime, 5000);
assert_equals(keyframeEffect.computedTiming.currentIteration, 2);
animation.currentTime = 7000;
assert_equals(keyframeEffect.computedTiming.localTime, 7000);
assert_equals(keyframeEffect.computedTiming.currentIteration, 2);
}, 'TimedItem.localTime and TimedItem.currentIteration return reasonable values when an keyframeEffect is in effect');
test(function() {
var animation = element.animate(keyframes);
var keyframeEffect = animation.effect;
animation.currentTime = -1;
assert_equals(keyframeEffect.computedTiming.currentIteration, null);
animation.currentTime = 1;
assert_equals(keyframeEffect.computedTiming.currentIteration, null);
}, 'TimedItem.currentIteration is null when keyframeEffect is not in effect');
test(function() {
var keyframeEffect = new KeyframeEffect(element, keyframes, 2);
assert_equals(keyframeEffect.computedTiming.startTime, 0);
assert_equals(keyframeEffect.computedTiming.endTime, 2);
assert_equals(keyframeEffect.computedTiming.duration, 2);
assert_equals(keyframeEffect.computedTiming.activeDuration, 2);
}, 'TimedItem startTime, endTime, duration, activeDuration are sensible for a simple keyframeEffect');
test(function() {
var keyframeEffect = new KeyframeEffect(element, keyframes, {duration: 3, iterations: 4, delay: 5});
assert_equals(keyframeEffect.computedTiming.startTime, 0);
assert_equals(keyframeEffect.computedTiming.endTime, 17);
assert_equals(keyframeEffect.computedTiming.duration, 3);
assert_equals(keyframeEffect.computedTiming.activeDuration, 12);
}, 'TimedItem startTime, endTime, duration, activeDuration are sensible for keyframeEffects with delays and iterations');
test(function() {
var keyframeEffect = new KeyframeEffect(element, keyframes, {delay: 1});
assert_equals(keyframeEffect.computedTiming.duration, 0);
}, 'TimedItem duration is calculated when no duration is specified');
test(function() {
var timing = new KeyframeEffect(element, keyframes).timing;
for (var attr of ['delay', 'endDelay', 'iterationStart', 'playbackRate']) {
assert_throws(new TypeError, function() { timing[attr] = NaN; }, attr);
assert_throws(new TypeError, function() { timing[attr] = Infinity; }, attr);
}
}, 'Restricted double attributes on the Timing interface throws for non-finite values.');
</script>