Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!DOCTYPE html>
<meta charset="utf-8">
<title>View Transition: cleanup is deferred after finished promise resolves</title>
<link rel="author" href="mailto:vmpstr@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
#target {
width: 100px;
height: 100px;
view-transition-name: target;
}
::view-transition-group(*) {
animation-duration: 0ms;
}
::view-transition-old(target) {
background-color: rgb(0, 255, 0);
}
</style>
<div id=target></div>
<script>
promise_test(async t => {
assert_implements(document.startViewTransition, "View Transitions are not supported");
const transition = document.startViewTransition(() => {});
// When we're ready, we request a new animation frame (in which the vt should be finished),
// and we post a task to run right after the update the rendering to verify that the view
// transition pseudos are still there. Wait until that happens.
await transition.ready.then(async () => {
await new Promise(resolve => {
requestAnimationFrame(() => {
t.step_timeout(() => {
assert_equals(getComputedStyle(document.documentElement, "::view-transition").display, "block");
assert_equals(getComputedStyle(document.documentElement, "::view-transition").position, "fixed");
resolve();
}, 0);
});
});
});
// From here, we expect that the finished promise will run before any new rAFs.
let success = true;
requestAnimationFrame(() => success = false);
// When the finished promise runs, verify that everything is cleaned up and that we didn't
// have a rAF between the timeout function and here.
transition.finished.then(t.step_func(() => {
assert_true(success);
assert_equals(getComputedStyle(document.documentElement, "::view-transition").display, "inline");
assert_equals(getComputedStyle(document.documentElement, "::view-transition").position, "static");
}));
}, "View transition cleanup is deferred until after the frame where `finished` promise resolves");
</script>