function stashPutUrl(token) { return `/preload/resources/stash-put.py?key=${token}`; } function encodedStashPutUrl(token) { return encodeURIComponent(stashPutUrl(token)); } async function hasArrivedAtServer(token) { const res = await fetch(`/preload/resources/stash-take.py?key=${token}`); assert_true(res.status === 200 || res.status === 404, 'status must be either 200 or 404'); return res.status === 200; } function verifyPreloadAndRTSupport() { var link = window.document.createElement("link"); assert_true(link.relList && link.relList.supports("preload"), "Preload not supported"); assert_true(!!window.PerformanceResourceTiming, "ResourceTiming not supported"); } function getAbsoluteURL(url) { return new URL(url, location.href).href; } function verifyNumberOfResourceTimingEntries(url, number) { assert_equals(numberOfResourceTimingEntries(url), number, url); } function numberOfResourceTimingEntries(url) { return performance.getEntriesByName(getAbsoluteURL(url)).length; } // Verifies that the resource is loaded, but not downloaded from network // more than once. This can be used to verify that a preloaded resource is // not downloaded again when used. function verifyLoadedAndNoDoubleDownload(url) { var entries = performance.getEntriesByName(getAbsoluteURL(url)); // UA may create separate RT entries for preload and normal load, // so we just check (entries.length > 0). assert_greater_than(entries.length, 0, url + ' should be loaded'); var numDownloads = 0; entries.forEach(entry => { // transferSize is zero if the resource is loaded from cache. if (entry.transferSize > 0) { numDownloads++; } }); // numDownloads can be zero if the resource was already cached before running // the test (for example, when the test is running repeatedly without // clearing cache between runs). assert_less_than_equal( numDownloads, 1, url + ' should be downloaded from network at most once'); }