88 lines
2.6 KiB
Python
88 lines
2.6 KiB
Python
""" Handle the initiator navigation request and attach the received client info
|
|
to the returned page.
|
|
"""
|
|
|
|
|
|
import textwrap
|
|
|
|
html_template = """
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>echo client hints on prerendering page</title>
|
|
</head>
|
|
<script src="/speculation-rules/prerender/resources/utils.js"></script>
|
|
<body>
|
|
<script>
|
|
|
|
// Allow generator to add the received CH information into this script.
|
|
%s
|
|
const params = new URLSearchParams(location.search);
|
|
const uid = params.get('uid');
|
|
|
|
// Performs the check below on initiator pages:
|
|
// 1. The client did not send server_received_full_version_list when fetching
|
|
// the initiator page.
|
|
// If the check fails, it will ask the main test page to terminate the test.
|
|
// Otherwise, it will:
|
|
// 1. Initiate a prerendering action. And the prerendering page will perform
|
|
// some checks.
|
|
// 2. Wait for the prerendering page to pass all checks and send a signal back.
|
|
// 3. Activate the prerendered page.
|
|
async function load_as_initiator_page() {
|
|
if (!server_received_bitness || server_received_full_version_list) {
|
|
// The initial headers are not as expected. Terminate the test.
|
|
failTest(
|
|
`unexpected initial headers.
|
|
bitness: ${server_received_bitness},
|
|
full_version: ${server_received_full_version_list}`,
|
|
uid);
|
|
return;
|
|
}
|
|
const prerendering_url =
|
|
`./echo-prerender-page-client-hints-received.py?uid=${uid}`;
|
|
// Wait for the prerendered page to be ready for activation.
|
|
const bc = new PrerenderChannel('prerender-channel', uid);
|
|
const gotMessage = new Promise(resolve => {
|
|
bc.addEventListener('message', e => {
|
|
resolve(e.data);
|
|
}, {once: true});
|
|
});
|
|
startPrerendering(prerendering_url);
|
|
|
|
data = await gotMessage;
|
|
if (data == 'ready for activation') {
|
|
window.location = prerendering_url;
|
|
} else {
|
|
failTest(`Initial page received unexpected result: ${data}`, uid);
|
|
}
|
|
}
|
|
|
|
load_as_initiator_page();
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|
|
"""
|
|
|
|
def translate_to_js(val: bool) -> str:
|
|
if isinstance(val, bool):
|
|
return "true" if val else "false"
|
|
return ""
|
|
|
|
def main(request, response):
|
|
response.status = 200
|
|
|
|
# Insert the received hints into script.
|
|
content = html_template % (
|
|
textwrap.dedent(
|
|
f"""
|
|
const server_received_bitness =
|
|
{translate_to_js(b"sec-ch-ua-bitness" in request.headers)};
|
|
const server_received_full_version_list =
|
|
{translate_to_js(b"sec-ch-ua-full-version-list" in
|
|
request.headers)};
|
|
"""
|
|
)
|
|
)
|
|
response.content = content.encode("utf-8")
|