Skip to content

Commit c1c2d1d

Browse files
vmpstrchromium-wpt-export-bot
authored andcommitted
vt: Don't painthold while pre-rendering
If we do paint holding while pre-rendering then when the pre-render is actually activated, we assume becaues the paint holding is already running that we should just force it to show the first frame (and stop the paint holding). This breaks view transitions to pre-rendering pages. R=rakina@chromium.org Bug: 538634442 Change-Id: I2e8a209fb268e4c41c605ab017b9814d0753714b Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8265713 Commit-Queue: Vladimir Levin <vmpstr@chromium.org> Reviewed-by: Rakina Zata Amni <rakina@chromium.org> Cr-Commit-Position: refs/heads/main@{#1683158}
1 parent b5af458 commit c1c2d1d

3 files changed

Lines changed: 128 additions & 0 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<!DOCTYPE html>
2+
<title>View transitions: cross-document navigation to a prerender with COOP</title>
3+
<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/">
4+
<meta name="timeout" content="long">
5+
<script src="/resources/testharness.js"></script>
6+
<script src="/resources/testharnessreport.js"></script>
7+
<script src="/common/utils.js"></script>
8+
<script src="/speculation-rules/resources/utils.js"></script>
9+
<script src="/speculation-rules/prerender/resources/utils.js"></script>
10+
<script>
11+
setup(() => assertSpeculationRulesIsSupported('prerender'));
12+
13+
promise_test(async t => {
14+
const uid = token();
15+
const result = await new Promise(resolve => {
16+
const channel = new PrerenderChannel('result', uid);
17+
channel.addEventListener('message', e => resolve(e.data), {once: true});
18+
19+
const url = `resources/prerender-coop.html?mode=runner&uid=${uid}`;
20+
window.open(url, '_blank', 'noopener');
21+
});
22+
assert_equals(result, "pass");
23+
}, 'View transitions work for cross-document navigation to a prerender with COOP');
24+
</script>
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
<!DOCTYPE html>
2+
<title>View transitions: cross-document navigation to a prerender with COOP (helper)</title>
3+
<script src="/common/utils.js"></script>
4+
<script src="/speculation-rules/resources/utils.js"></script>
5+
<script src="/speculation-rules/prerender/resources/utils.js"></script>
6+
<style>
7+
@view-transition {
8+
navigation: auto;
9+
}
10+
::view-transition-old(root) {
11+
animation: 300ms ease-out both slide-out;
12+
}
13+
::view-transition-new(root) {
14+
animation: 300ms ease-out both slide-in;
15+
}
16+
@keyframes slide-out {
17+
to { transform: translateX(-100%); }
18+
}
19+
@keyframes slide-in {
20+
from { transform: translateX(100%); }
21+
}
22+
</style>
23+
<script>
24+
const params = new URLSearchParams(location.search);
25+
const uid = params.get('uid');
26+
const mode = params.get('mode');
27+
28+
if (mode === 'runner') {
29+
const ready_channel = new PrerenderChannel('ready-to-activate', uid);
30+
31+
onload = async () => {
32+
const next_url = new URL(`prerender-coop.html?mode=next&uid=${uid}`, window.location).href;
33+
34+
const ready_to_activate = new Promise(resolve => {
35+
ready_channel.addEventListener('message', resolve, {once: true});
36+
});
37+
38+
startPrerendering(next_url);
39+
40+
await ready_to_activate;
41+
42+
window.location.replace(new URL(next_url, window.location));
43+
};
44+
} else if (mode === 'next') {
45+
const ready_channel = new PrerenderChannel('ready-to-activate', uid);
46+
const result_channel = new PrerenderChannel('result', uid);
47+
const was_prerendered = document.prerendering;
48+
49+
let got_pagereveal = false;
50+
let has_view_transition = false;
51+
let transition_error = null;
52+
53+
addEventListener('pagereveal', e => {
54+
got_pagereveal = true;
55+
has_view_transition = !!e.viewTransition;
56+
if (e.viewTransition) {
57+
e.viewTransition.ready.catch(err => {
58+
transition_error = (err && err.message) ? err.message : String(err);
59+
});
60+
}
61+
});
62+
63+
if (document.prerendering) {
64+
document.addEventListener('prerenderingchange', () => {
65+
requestAnimationFrame(() => {
66+
requestAnimationFrame(async () => {
67+
let result = "pass";
68+
if (!got_pagereveal) {
69+
result = "fail: pagereveal did not fire";
70+
} else if (!has_view_transition) {
71+
result = "fail: no viewTransition in pagereveal";
72+
} else if (transition_error) {
73+
result = "fail: transition error: " + transition_error;
74+
}
75+
await result_channel.postMessage(result);
76+
result_channel.close();
77+
window.close();
78+
});
79+
});
80+
});
81+
ready_channel.postMessage('ready');
82+
ready_channel.close();
83+
} else {
84+
addEventListener('pagereveal', e => {
85+
requestAnimationFrame(() => {
86+
requestAnimationFrame(async () => {
87+
let result = "pass";
88+
if (!was_prerendered) {
89+
result = "fail: page was not prerendered";
90+
} else if (!has_view_transition) {
91+
result = "fail: no viewTransition in pagereveal";
92+
} else if (transition_error) {
93+
result = "fail: transition error: " + transition_error;
94+
}
95+
await result_channel.postMessage(result);
96+
result_channel.close();
97+
window.close();
98+
});
99+
});
100+
});
101+
}
102+
}
103+
</script>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Cross-Origin-Opener-Policy: same-origin

0 commit comments

Comments
 (0)