Skip to content

Commit bc5b242

Browse files
Clqsin45chromium-wpt-export-bot
authored andcommitted
[prerender] defer SharedStorage worklet creation on prerendering pages
This CL is a follow-up for I7b79bdfc021842f9a803892a1a294e20ffdf8a01, which defers the write operations. Before this CL, prerendering pages will be discarded if JS attempts to create a worklet for SharedStorage. After this CL, the creation will be deferred until page activation. Bug: 390136190 Change-Id: I898a63403728eb8fd716ddc6ab029cabeee48127 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6360936 Reviewed-by: Hiroki Nakagawa <[email protected]> Commit-Queue: Lingqi Chi <[email protected]> Reviewed-by: Yao Xiao <[email protected]> Cr-Commit-Position: refs/heads/main@{#1434598}
1 parent 03c7a06 commit bc5b242

File tree

3 files changed

+76
-2
lines changed

3 files changed

+76
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class ReadOperation {
2+
async run() {
3+
return await this.sharedStorage.get("prerender");
4+
}
5+
}

speculation-rules/prerender/resources/shared-storage.https.html

+13-2
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,20 @@
1919
loadInitiatorPage();
2020
} else {
2121
const prerenderEventCollector = new PrerenderEventCollector();
22-
prerenderEventCollector.start(
23-
window.sharedStorage.set('prerender', 'yes'), 'window.sharedStorage.set');
22+
23+
if (params.get('type') === 'worklet') {
24+
async function register() {
25+
return window.sharedStorage.worklet.addModule(
26+
"shared-storage-worklet.js");
27+
}
28+
prerenderEventCollector.start(
29+
register(), 'window.sharedStorage.worklet.addModule');
30+
} else {
31+
prerenderEventCollector.start(
32+
window.sharedStorage.set('prerender', 'yes'),
33+
'window.sharedStorage.set');
2434
}
35+
}
2536

2637
</script>
2738

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<!DOCTYPE html>
2+
<title>Worklet operations to Shared Storage API is deferred</title>
3+
<meta name="timeout" content="long">
4+
<script src="/resources/testharness.js"></script>
5+
<script src="/resources/testharnessreport.js"></script>
6+
<script src="/common/utils.js"></script>
7+
<script src="../resources/utils.js"></script>
8+
<script src="resources/utils.js"></script>
9+
10+
<body>
11+
<script>
12+
setup(() => assertSpeculationRulesIsSupported());
13+
promise_test(async t => {
14+
const uid = token();
15+
const bc = new PrerenderChannel('test-channel', uid);
16+
17+
const gotMessage = new Promise(resolve => {
18+
bc.addEventListener('message', e => {
19+
resolve(e.data);
20+
}, {
21+
once: true
22+
});
23+
});
24+
25+
const url =
26+
`resources/shared-storage.https.html?uid=${uid}&type=worklet`;
27+
window.open(url, '_blank', 'noopener');
28+
29+
const result = await gotMessage;
30+
const expected = [
31+
{
32+
event: 'started waiting window.sharedStorage.worklet.addModule',
33+
prerendering: true
34+
},
35+
{
36+
event: 'prerendering change',
37+
prerendering: false
38+
},
39+
{
40+
event: 'finished waiting window.sharedStorage.worklet.addModule',
41+
prerendering: false
42+
}
43+
];
44+
assert_equals(result.length, expected.length);
45+
for (let i = 0; i < result.length; i++) {
46+
assert_equals(result[i].event, expected[i].event,
47+
`event[${i}]`);
48+
assert_equals(result[i].prerendering, expected[i].prerendering,
49+
`prerendering[${i}]`);
50+
}
51+
bc.close();
52+
53+
// Send a close signal to PrerenderEventCollector on the prerendered page.
54+
new PrerenderChannel('close', uid).postMessage('');
55+
},
56+
`add module for the Shared Storage API should be deferred until the
57+
prerendered page is activated`);
58+
</script>

0 commit comments

Comments
 (0)