// META: global=window,worker
// META: script=/common/get-host-info.sub.js
// META: script=/resource-timing/resources/sizes-helper.js
const baseUrl =
new URL('/resource-timing/resources/TAOResponse.py?tao=wildcard', location.href).href;
const expectedSize = 4;
const hostInfo = get_host_info();
performance.clearResourceTimings();
const accumulateEntry = () => {
return new Promise(resolve => {
const po = new PerformanceObserver(list => {
resolve(list);
});
po.observe({type: "resource", buffered: true});
});
};
const checkResourceSizes = () => {
const entries = performance.getEntriesByType('resource');
for (let entry of entries) {
checkSizeFields(entry, expectedSize, expectedSize + headerSize);
}
}
const redirectUrl = (redirectSourceOrigin, allowOrigin, targetUrl) => {
return redirectSourceOrigin +
'/resource-timing/resources/redirect-cors.py?allow_origin=' +
encodeURIComponent(allowOrigin) +
'&timing_allow_origin=*' +
'&location=' + encodeURIComponent(targetUrl);
}
promise_test(() => {
// Use a different URL every time so that the cache behaviour does not
// depend on execution order.
const directUrl = cacheBustUrl(baseUrl);
const sameOriginRedirect = redirectUrl(hostInfo.ORIGIN, '*', directUrl);
const crossOriginRedirect = redirectUrl(hostInfo.REMOTE_ORIGIN,
hostInfo.ORIGIN, directUrl);
const mixedRedirect = redirectUrl(hostInfo.REMOTE_ORIGIN,
hostInfo.ORIGIN, sameOriginRedirect);
const complexRedirect = redirectUrl(hostInfo.ORIGIN,
hostInfo.REMOTE_ORIGIN, mixedRedirect);
let eatBody = response => response.arrayBuffer();
return fetch(directUrl)
.then(eatBody)
.then(() => fetch(sameOriginRedirect))
.then(eatBody)
.then(() => fetch(crossOriginRedirect))
.then(eatBody)
.then(() => fetch(mixedRedirect))
.then(eatBody)
.then(() => fetch(complexRedirect))
.then(eatBody)
.then(accumulateEntry)
.then(checkResourceSizes);
}, 'PerformanceResourceTiming sizes Fetch with redirect test');
done();