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(); }