Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

// META: script=/common/get-host-info.sub.js
// META: script=/common/utils.js
// META: script=/common/dispatcher/dispatcher.js
// META: script=/speculation-rules/prefetch/resources/utils.sub.js
// META: script=resources/utils.js
// META: timeout=long
const port = get_host_info().HTTPS_PORT_ELIDED;
const SUCCESS = true;
const FAILURE = false;
function prerender_test(origin, expectation) {
promise_test(
async t => {
const key = token();
const value = 'hello';
const params = new URLSearchParams();
params.set('key', key);
params.set('value', value);
const url = `${origin}${STORE_URL}?${params.toString()}`;
insertSpeculationRules({
prerender: [{source: 'list', urls: [url], eagerness: 'immediate'}]
});
if (expectation === SUCCESS) {
const result = await nextValueFromServer(key);
assert_equals(result, value);
} else {
const result = await Promise.race([
new Promise(r => t.step_timeout(r, 1000)), nextValueFromServer(key)
]);
assert_true(typeof result === 'undefined');
}
},
`Prerender to ${origin} ${
expectation === SUCCESS ? 'succeeds' : 'fails'}.`);
}
// Note: SpeculationRules API currently does not support cross-site prerender.
// Only same-site prerender is tested. See crbug.com/1176054.
const test_cases = [
// Page loads originate from `http://hosts[][]`; prerendering this origin
// succeeds, while subdomains fail except `https://{{hosts[][www1]}}` which is
// allowed by the allowlist.
{origin: 'https://{{hosts[][]}}' + port, expectation: SUCCESS},
{origin: 'https://{{hosts[][www]}}' + port, expectation: FAILURE},
{origin: 'https://{{hosts[][www1]}}' + port, expectation: SUCCESS},
{origin: 'https://{{hosts[][www2]}}' + port, expectation: FAILURE},
{origin: 'https://{{hosts[][天気の良い日]}}' + port, expectation: FAILURE},
{origin: 'https://{{hosts[][élève]}}' + port, expectation: FAILURE},
];
for (let i = 0; i < test_cases.length; i++) {
prerender_test(test_cases[i].origin, test_cases[i].expectation);
}