| // META: global=window,worker |
| // META: script=/resource-timing/resources/sizes-helper.js |
| // META: script=/resource-timing/resources/resource-loaders.js |
| |
| let url = new URL( |
| '/resource-timing/resources/cacheable-and-validated.py' + |
| '?content=loremipsumblablabla', |
| location.href).href; |
| const bodySize = 19; |
| |
| const accumulateEntries = () => { |
| return new Promise(resolve => { |
| const po = new PerformanceObserver(list => { |
| resolve(list); |
| }); |
| po.observe({type: "resource", buffered: true}); |
| }); |
| }; |
| |
| const checkResourceSizes = list => { |
| const entries = list.getEntriesByName(url); |
| assert_equals(entries.length, 3, 'Wrong number of entries'); |
| let seenCount = 0; |
| for (let entry of entries) { |
| if (seenCount === 0) { |
| // 200 response |
| checkSizeFields(entry, bodySize, bodySize + headerSize); |
| } else if (seenCount === 1) { |
| // from cache |
| checkSizeFields(entry, bodySize, 0); |
| } else if (seenCount === 2) { |
| // 304 response |
| checkSizeFields(entry, bodySize, headerSize); |
| } else { |
| assert_unreached('Too many matching entries'); |
| } |
| ++seenCount; |
| } |
| }; |
| |
| promise_test(() => { |
| // Use a different URL every time so that the cache behaviour does not |
| // depend on execution order. |
| url = load.cache_bust(url); |
| const eatBody = response => response.arrayBuffer(); |
| const mustRevalidate = {headers: {'Cache-Control': 'max-age=0'}}; |
| return fetch(url) |
| .then(eatBody) |
| .then(() => fetch(url)) |
| .then(eatBody) |
| .then(() => fetch(url, mustRevalidate)) |
| .then(eatBody) |
| .then(accumulateEntries) |
| .then(checkResourceSizes); |
| }, 'PerformanceResourceTiming sizes caching test'); |