Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>startViewTranstion cancels active transition</title>
</head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
:root {
view-transition-name: none;
}
#target {
width: 100px;
height: 100px;
background: blue;
contain: paint;
view-transition-name: target;
}
#target.update-1 {
height: 150px;
}
#target.update-2 {
height: 200px;
}
</style>
<body>
<div id="target"></div>
</body>
<script>
promise_test(async t => {
let rejected_promise_tally = 0;
const target = document.getElementById("target");
assert_implements(document.startViewTransition,
"Missing document.startViewTransition");
const verifyAbortedTransition = (promise) => {
return promise.then(
() => { assert_not_reached('transition aborted') },
(reason) => {
assert_true(reason instanceof DOMException);
assert_equals(reason.code, DOMException.ABORT_ERR);
rejected_promise_tally++;
});
};
const vt1 = document.startViewTransition(() => {
target.className = 'update-1';
});
const vt2 = document.startViewTransition(() => {
assert_equals(target.className, 'update-1');
target.className = 'update-2';
});
const vt3 = document.startViewTransition(() => {
assert_equals(target.className, 'update-2');
});
await verifyAbortedTransition(vt1.ready);
await verifyAbortedTransition(vt2.ready);
await vt3.ready;
assert_equals(rejected_promise_tally, 2,
'first 2 transitions are skipped');
const sizeTransformAnimations = document.getAnimations().filter(a => {
return 'height' in a.effect.getKeyframes()[0];
});
assert_equals(sizeTransformAnimations.length, 1);
const startingHeight =
sizeTransformAnimations[0].effect.getKeyframes()[0].height;
assert_equals(startingHeight, '200px',
'Height change applied before capture');
}, 'Synchronously starting a view transition skips the previously active ' +
' transition.');
</script>
</html>