1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
<!DOCTYPE html>
<html>
<head>
<title>View transitions: Resizing viewport skips the transition</title>
<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
<link rel="author" href="mailto:bokan@chromium.org">
<script src="/common/rendering-utils.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script>
function waitForAtLeastOneFrame(win) {
return new Promise(resolve => {
win.requestAnimationFrame(() => {
win.requestAnimationFrame(() => {
resolve();
});
});
});
}
promise_test(async t => {
assert_implements(document.startViewTransition, "Missing document.startViewTransition");
await waitForAtLeastOneFrame(window);
let popupWin;
// Open a popup window that we'll use to start a transition
await test_driver.bless('Open a popup in a new window', () => {
popupWin = window.open('about:blank', 'popup', 'width=300,height=300');
t.add_cleanup(() => popupWin.close());
});
// Wait until the popup window is loaded to make sure the document we update
// below is the right one.
if (!popupWin.document || popupWin.document.readyState != 'complete') {
await new Promise(resolve => {
popupWin.addEventListener('load', resolve, { once: true });
});
}
let popupDoc = popupWin.document;
popupDoc.documentElement.innerHTML = `
<style>
html {background-color: red;}
html.new {background-color: limegreen;}
/* Set a no-op animation to show the old snapshot indefinitely. */
html::view-transition-group(*) {animation-duration: 10s;}
html::view-transition-new(*) {animation: unset;opacity: 0;}
html::view-transition-old(*) {animation-duration: 10s;opacity: 1;}
</style>`;
if (popupDoc.visibilityState == "hidden") {
await new Promise((resolve) => {
popupDoc.addEventListener("visibilitychange", resolve, { once: true });
});
}
// Start a transition inside the popup.
let transition = popupDoc.startViewTransition(() => {
popupDoc.documentElement.classList.add('new');
});
let finishResolved = false;
transition.finished.then(() => {
finishResolved = true;
});
// Wait for the transition to start animating.
await transition.ready;
await waitForAtLeastOneFrame(popupWin);
await waitForAtLeastOneFrame(popupWin);
// Resize the popup window.
popupWin.resizeTo(popupWin.innerWidth/2, popupWin.innerHeight/2);
// Wait until we get the event to avoid any intermittent failures.
// Note: this may cause TIMEOUT in some environments, e.g. mobile, because it
// might not resize the window.
await new Promise(resolve => {
popupWin.addEventListener('resize', resolve, {once: true});
});
await waitForAtLeastOneFrame(popupWin);
// `finish` should have resolved as resizing the transition after capture
// should cause it to skip.
assert_true(finishResolved, "Transition must be finished by the window resize");
});
</script>
</head>
</html>
|