Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test has a WPT meta file that expects 4 subtest issues.
- This WPT test may be referenced by the following Test IDs:
- /scroll-animations/css/scroll-timeline-name-shadow.html - WPT Dashboard Interop Dashboard
<!DOCTYPE html>
<title>scroll-timeline-name and tree-scoped references</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/web-animations/testcommon.js"></script>
<main id=main></main>
<script>
function inflate(t, template) {
t.add_cleanup(() => main.replaceChildren());
main.append(template.content.cloneNode(true));
main.offsetTop;
}
</script>
<style>
@keyframes anim {
from { z-index: 100; }
to { z-index: 100; }
}
</style>
<template id=scroll_timeline_host>
<style>
.target {
animation: anim 10s linear;
animation-timeline: --timeline;
}
main > .scroller {
scroll-timeline: --timeline x;
}
</style>
<div class=scroller>
<div class=scroller>
<template shadowrootmode=open shadowrootclonable>
<style>
:host {
scroll-timeline: --timeline y;
}
</style>
<slot></slot>
</template>
<div class=target></div>
</div>
</div>
<style>
</style>
</template>
<script>
promise_test(async (t) => {
inflate(t, scroll_timeline_host);
let target = main.querySelector('.target');
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
assert_equals(anim.timeline.axis, 'y');
}, 'Outer animation can see scroll timeline defined by :host');
</script>
<template id=scroll_timeline_slotted>
<style>
.target {
animation: anim 10s linear;
animation-timeline: --timeline;
}
.host {
scroll-timeline: --timeline x;
}
</style>
<div class=host>
<template shadowrootmode=open shadowrootclonable>
<style>
::slotted(.scroller) {
scroll-timeline: --timeline y;
}
</style>
<slot></slot>
</template>
<div class=scroller>
<div class=target></div>
</div>
</div>
<style>
</style>
</template>
<script>
promise_test(async (t) => {
inflate(t, scroll_timeline_slotted);
let target = main.querySelector('.target');
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
assert_equals(anim.timeline.axis, 'y');
}, 'Outer animation can see scroll timeline defined by ::slotted');
</script>
<template id=scroll_timeline_part>
<style>
.host {
scroll-timeline: --timeline y;
}
.host::part(foo) {
scroll-timeline: --timeline x;
}
</style>
<div class=host>
<template shadowrootmode=open shadowrootclonable>
<style>
@keyframes anim2 {
from { z-index: 100; background-color: green; }
to { z-index: 100; background-color: green; }
}
.target {
animation: anim2 10s linear;
animation-timeline: --timeline;
}
</style>
<div part=foo>
<div class=target></div>
</div>
</template>
</div>
<style>
</style>
</template>
<script>
promise_test(async (t) => {
inflate(t, scroll_timeline_part);
let target = main.querySelector('.host').shadowRoot.querySelector('.target');
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
assert_equals(anim.timeline.axis, 'x');
}, 'Inner animation can see scroll timeline defined by ::part');
</script>
<template id=scroll_timeline_shadow>
<style>
.target {
animation: anim 10s linear;
animation-timeline: --timeline;
}
.host {
scroll-timeline: --timeline x;
}
</style>
<div class=scroller>
<div class=host>
<template shadowrootmode=open shadowrootclonable>
<style>
div {
scroll-timeline: --timeline y;
}
</style>
<div>
<slot></slot>
</div>
</template>
<div class=target></div>
</div>
</div>
<style>
</style>
</template>
<script>
promise_test(async (t) => {
inflate(t, scroll_timeline_shadow);
let target = main.querySelector('.target');
assert_equals(target.getAnimations().length, 1);
let anim = target.getAnimations()[0];
assert_not_equals(anim.timeline, null);
assert_equals(anim.timeline.axis, 'y');
}, 'Slotted element can see scroll timeline within the shadow');
</script>