Source code

Revision control

Copy as Markdown

Other Tools

function expect_fetched_onload(uuid, expectation) {
return new Promise(resolve => {
addEventListener('load', resolve);
}).then(async () => {
const result = await get_result(uuid);
if (expectation) {
assert_not_equals(result, '', 'speculative case did not fetch');
} else {
assert_equals(result, '', 'speculative case incorrectly fetched');
}
return result;
});
}
function compare_with_nonspeculative(uuid, title, test_nonspeculative) {
return function(speculative_result) {
if (!test_nonspeculative) {
return Promise.resolve();
}
return new Promise(resolve => {
const iframe = document.createElement('iframe');
iframe.onload = resolve;
iframe.src = `../resources/${title}-nonspeculative.sub.html?uuid=${uuid}`;
document.body.appendChild(iframe);
}).then(async () => {
const result = await get_result(uuid);
if (speculative_result === '') {
assert_equals(result, '', 'non-speculative case incorrectly fetched')
} else {
assert_not_equals(result, '', 'non-speculative case did not fetch');
const speculative_headers = speculative_result.trim().split("\n");
const nonspeculative_headers = result.trim().split("\n");
assert_equals(speculative_headers.length, nonspeculative_headers.length, 'expected the same number of headers between speculative and non-speculative')
for (let i = 0; i < speculative_headers.length; ++i) {
let [s_header, s_value] = split_header(speculative_headers[i]);
let [ns_header, ns_value] = split_header(nonspeculative_headers[i]);
assert_equals(s_header, ns_header, 'expected the order of headers to match between speculative and non-speculative');
assert_equals(s_value, ns_value, `expected \`${s_header}\` values to match between speculative and non-speculative`);
}
}
});
}
}
function split_header(line) {
let [header, value] = line.split(': ');
header = header.toLowerCase();
value = value.trim();
if (header === 'referer') {
value = value.replace(/\/generated\/.+$/, '/generated/...');
}
return [header, value];
}
async function get_result(uuid) {
const response = await fetch(`/html/syntax/speculative-parsing/resources/stash.py?action=take&uuid=${uuid}`);
return await response.text();
}