blob: 5d7f5a121694029f521d3095fcdf0e45295edb70 [file] [log] [blame]
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<body></body>
<script>
function assertAnimationEffect({keyframes, expect}) {
var target = document.createElement('target');
document.body.appendChild(target);
var animation = target.animate(keyframes, {duration: 1, fill: 'forwards'});
animation.pause();
for (var {at, is} of expect) {
animation.currentTime = at;
for (var property in is)
assert_equals(getComputedStyle(target)[property], is[property], `${property} is ${is[property]} at ${at}`);
}
target.remove();
}
function createIterable(iterations) {
return {
[Symbol.iterator]() {
var i = 0;
return {next: () => iterations[i++]};
},
};
}
test(() => {
assertAnimationEffect({
keyframes: createIterable([
{done: false, value: {left: '100px'}},
{done: false, value: {left: '300px'}},
{done: false, value: {left: '200px'}},
{done: true},
]),
expect: [
{at: 0, is: {left: '100px'}},
{at: 0.25, is: {left: '200px'}},
{at: 0.5, is: {left: '300px'}},
{at: 0.75, is: {left: '250px'}},
{at: 1, is: {left: '200px'}},
],
});
}, 'Custom iterator with basic keyframes.');
test(() => {
assertAnimationEffect({
keyframes: {
left: createIterable([
{done: false, value: '100px'},
{done: false, value: '300px'},
{done: false, value: '200px'},
{done: true},
]),
},
expect: [
{at: 0, is: {left: '100px'}},
{at: 0.25, is: {left: '200px'}},
{at: 0.5, is: {left: '300px'}},
{at: 0.75, is: {left: '250px'}},
{at: 1, is: {left: '200px'}},
],
});
}, 'Custom iterator in property indexed keyframes.');
test(() => {
var keyframes = createIterable([
{done: false, value: {left: '100px'}},
{done: false, value: {left: '300px'}},
{done: false, value: {left: '200px'}},
{done: true},
]);
keyframes.easing = 'ease-in-out';
keyframes.offset = '0.1';
assertAnimationEffect({
keyframes,
expect: [
{at: 0, is: {left: '100px'}},
{at: 0.25, is: {left: '200px'}},
{at: 0.5, is: {left: '300px'}},
{at: 0.75, is: {left: '250px'}},
{at: 1, is: {left: '200px'}},
],
});
}, 'easing and offset are ignored on iterable objects.');
test(() => {
assertAnimationEffect({
keyframes: createIterable([
{done: false, value: {left: '100px', top: '200px'}},
{done: false, value: {left: '300px'}},
{done: false, value: {left: '200px', top: '100px'}},
{done: true},
]),
expect: [
{at: 0, is: {left: '100px', top: '200px'}},
{at: 0.25, is: {left: '200px', top: '175px'}},
{at: 0.5, is: {left: '300px', top: '150px'}},
{at: 0.75, is: {left: '250px', top: '125px'}},
{at: 1, is: {left: '200px', top: '100px'}},
],
});
}, 'Custom iterator with multiple properties specified.');
test(() => {
assertAnimationEffect({
keyframes: createIterable([
{done: false, value: {left: '100px'}},
{done: false, value: {left: '250px', offset: 0.75}},
{done: false, value: {left: '200px'}},
{done: true},
]),
expect: [
{at: 0, is: {left: '100px'}},
{at: 0.25, is: {left: '150px'}},
{at: 0.5, is: {left: '200px'}},
{at: 0.75, is: {left: '250px'}},
{at: 1, is: {left: '200px'}},
],
});
}, 'Custom iterator with offset specified.');
test(() => {
assert_throws_js(TypeError, () => {
assertAnimationEffect({
keyframes: createIterable([
{done: false, value: {left: '100px'}},
{done: false, value: 1234},
{done: false, value: {left: '200px'}},
{done: true},
]),
expect: [],
});
});
}, 'Custom iterator with non object keyframe should throw.');
test(() => {
assert_throws_js(TypeError, () => {
assertAnimationEffect({
keyframes: {
left: createIterable([
{done: false, value: {toString: null}},
{done: true},
]),
},
expect: [],
});
});
}, 'Custom iterator in property indexed keyframes with null toString method should throw.');
</script>