Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

// META: global=window,worker
// META: script=/common/get-host-info.sub.js
// META: script=/resource-timing/resources/resource-loaders.js
// TODO(crbug/1358591): Rename this file from "tentative" once
// `w3c/resource-timing#343` is merged.
const {REMOTE_ORIGIN, ORIGIN} = get_host_info();
const redirectBase = new URL(
'/resource-timing/resources/redirect-cors.py', REMOTE_ORIGIN).href;
const cacheAndValidatedBase = new URL(
'/resource-timing/resources/cacheable-and-validated.py?content=content',
ORIGIN).href;
const mustRevalidate = {headers: {'Cache-Control': 'max-age=0'}};
const fetchAndEatBody = (url, fetchOption) => {
return fetch(url, fetchOption).then(response => response.arrayBuffer());
};
const accumulateEntries = () => {
return new Promise(resolve => {
const po = new PerformanceObserver(list => {
resolve(list);
});
po.observe({type: "resource", buffered: true});
});
};
const checkDeliveryTypeBase =
(list, lookupURL, deliveryTypeForCachedResources) => {
const entries = list.getEntriesByName(lookupURL);
assert_equals(entries.length, 3, 'Wrong number of entries');
// 200 response (`cacheMode` is an empty string)
assert_equals(entries[0].deliveryType, "",
"Expect empty deliveryType for 200 response.");
// Cached response (`cacheMode` is "local") or 304 response (`cacheMode` is
// "validated").
assert_equals(entries[1].deliveryType, deliveryTypeForCachedResources,
`Expect "${deliveryTypeForCachedResources}" deliveryType for a
cached response.`);
assert_equals(entries[2].deliveryType, deliveryTypeForCachedResources,
`Expect "${deliveryTypeForCachedResources}" deliveryType for a
revalidated response.`);
};
promise_test(() => {
// Use a different URL every time so that the cache behaviour does not depend
// on execution order.
const initialURL = load.cache_bust(cacheAndValidatedBase);
const checkDeliveryType =
list => checkDeliveryTypeBase(list, initialURL, "cache");
return fetchAndEatBody(initialURL, {}) // 200.
.then(() => fetchAndEatBody(initialURL, {})) // Cached.
.then(() => fetchAndEatBody(initialURL, mustRevalidate)) // 304.
.then(accumulateEntries)
.then(checkDeliveryType);
}, 'PerformanceResourceTiming deliveryType test, same origin.');
promise_test(() => {
const cacheAndValidatedURL = load.cache_bust(
cacheAndValidatedBase + '&timing_allow_origin=*');
const redirectURL = redirectBase
+ "?timing_allow_origin=*"
+ `&allow_origin=${encodeURIComponent(ORIGIN)}`
+ `&location=${encodeURIComponent(cacheAndValidatedURL)}`;
const checkDeliveryType =
list => checkDeliveryTypeBase(list, redirectURL, "cache");
return fetchAndEatBody(redirectURL, {}) // 200.
.then(() => fetchAndEatBody(redirectURL, {})) // Cached.
.then(() => fetchAndEatBody(redirectURL, mustRevalidate)) // 304.
.then(accumulateEntries)
.then(checkDeliveryType);
}, 'PerformanceResourceTiming deliveryType test, cross origin, TAO passes.');
promise_test(() => {
const cacheAndValidatedURL = load.cache_bust(cacheAndValidatedBase);
const redirectURL = redirectBase
+ `?allow_origin=${encodeURIComponent(ORIGIN)}`
+ `&location=${encodeURIComponent(cacheAndValidatedURL)}`;
const checkDeliveryType =
list => checkDeliveryTypeBase(list, redirectURL, "");
return fetchAndEatBody(redirectURL, {}) // 200.
.then(() => fetchAndEatBody(redirectURL, {})) // Cached.
.then(() => fetchAndEatBody(redirectURL, mustRevalidate)) // 304.
.then(accumulateEntries)
.then(checkDeliveryType);
}, 'PerformanceResourceTiming deliveryType test, cross origin, TAO fails.');