<!DOCTYPE html>
<html>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/">
<style>
@keyframes bg {
from { background-color: rgb(254, 0, 0); }
to { background-color: rgb(0 254, 0); }
}
.item {
flex-grow: 1;
width: 2em;
height: 2em;
background: #888;
animation: bg linear;
animation-timeline: view();
animation-range: contain;
}
.inline .item {
animation-timeline: view(inline);
}
.scroller {
width: 10em;
height: 10em;
outline: 1px solid;
margin: 1em;
overflow: auto;
display: inline-flex;
vertical-align: top;
flex-direction: column;
gap: 1em;
resize: vertical;
}
.inline {
resize: horizontal;
flex-direction: row;
}
.block .spacer {
height: 20em;
width: 1em;
}
.inline .spacer {
width: 20em;
height: 1em;
}
</style>
<body>
<div class="scroller block">
<div class="item" id="a"></div>
<div class="item" id="b"></div>
<div class="item" id="c"></div>
</div>
<div class="scroller inline">
<div class="item" id="d"></div>
<div class="item" id="e"></div>
<div class="item" id="f"></div>
</div>
<br>
<div class="scroller block">
<div class="item" id="g"></div>
<div class="item" id="h"></div>
</div>
<div class="scroller inline">
<div class="item" id="i"></div>
<div class="item" id="j"></div>
</div>
</body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/web-animations/testcommon.js"></script>
<script type="text/javascript">
promise_test(async t => {
let anims = document.getAnimations();
await Promise.all(anims.map(anim => anim.ready));
await waitForNextFrame();
const expected_results = [
{ id: "a", progress: 1.0, bg: 'rgb(0, 254, 0)' },
{ id: "b", progress: 0.5, bg: 'rgb(127, 127, 0)' },
{ id: "c", progress: 0.0, bg: 'rgb(254, 0, 0)' },
{ id: "d", progress: 1.0, bg: 'rgb(0, 254, 0)' },
{ id: "e", progress: 0.5, bg: 'rgb(127, 127, 0)' },
{ id: "f", progress: 0.0, bg: 'rgb(254, 0, 0)' },
{ id: "g", progress: 1.0, bg: 'rgb(0, 254, 0)' },
{ id: "h", progress: 0.0, bg: 'rgb(254, 0, 0)' },
{ id: "i", progress: 1.0, bg: 'rgb(0, 254, 0)' },
{ id: "j", progress: 0.0, bg: 'rgb(254, 0, 0)' }
];
expected_results.forEach(result => {
const element = document.getElementById(result.id);
const anim = element.getAnimations()[0];
assert_approx_equals(anim.effect.getComputedTiming().progress,
result.progress, 1e-3,
`${result.id}: Unexpected progress`);
assert_equals(getComputedStyle(element).backgroundColor,
result.bg, `${result.id}: Mismatched background color`);
});
}, 'Stability of animated elements aligned to the bounds of a contain region');
</script>
</html>