Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

// META: script=/common/utils.js
// META: script=/common/get-host-info.sub.js
// Because apache decrements the Keep-Alive max value on each request, the
// transferSize will vary slightly between requests for the same resource.
const fuzzFactor = 3; // bytes
const {HTTP_REMOTE_ORIGIN} = get_host_info();
const url = new URL('/resource-timing/resources/preflight.py',
HTTP_REMOTE_ORIGIN).href;
// The header bytes are expected to be > |minHeaderSize| and
// < |maxHeaderSize|. If they are outside this range the test will fail.
const minHeaderSize = 100;
const maxHeaderSize = 1024;
promise_test(async () => {
const checkCorsAllowed = response => response.arrayBuffer();
const requirePreflight = {headers: {'X-Require-Preflight' : '1'}};
const collectEntries = new Promise(resolve => {
let entriesSeen = [];
new PerformanceObserver(entryList => {
entriesSeen = entriesSeen.concat(entryList.getEntries());
if (entriesSeen.length > 2) {
throw new Error(`Saw too many PerformanceResourceTiming entries ` +
`(${entriesSeen.length})`);
}
if (entriesSeen.length == 2) {
resolve(entriesSeen);
}
}).observe({"type": "resource"});
});
// Although this fetch doesn't send a pre-flight request, the server response
// will allow cross-origin requests explicitly with the
// Access-Control-Allow-Origin header.
await fetch(url).then(checkCorsAllowed);
// This fetch will send a pre-flight request to do the CORS handshake
// explicitly.
await fetch(url, requirePreflight).then(checkCorsAllowed);
const entries = await collectEntries;
assert_greater_than(entries[0].transferSize, 0, 'No-preflight transferSize');
const lowerBound = entries[0].transferSize - fuzzFactor;
const upperBound = entries[0].transferSize + fuzzFactor;
assert_between_exclusive(entries[1].transferSize, lowerBound, upperBound,
'Preflighted transferSize');
}, 'PerformanceResourceTiming sizes fetch with preflight test');