59 lines
2.5 KiB
HTML
59 lines
2.5 KiB
HTML
<!DOCTYPE html>
|
|
<meta charset=utf-8>
|
|
<title>Makes sure that Link headers preload resources in non-HTML documents</title>
|
|
<meta name="timeout" content="long">
|
|
<script src="resources/dummy.js?link-header-preload2"></script>
|
|
<script src="/common/utils.js"></script>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="/preload/resources/preload_helper.js"></script>
|
|
<body>
|
|
<script>
|
|
|
|
function test_document_type(options, desc) {
|
|
promise_test(async t => {
|
|
const id = token();
|
|
const preloadLink = `/html/semantics/document-metadata/the-link-element/stylesheet.py?id=${id}`;
|
|
const params = new URLSearchParams();
|
|
for (const opt in options)
|
|
params.set(opt, options[opt]);
|
|
params.set('link', `<${preloadLink}>;rel=preload;as=style`);
|
|
|
|
const docURL = getAbsoluteURL(`./resources/echo-preload-header.py?${params.toString()}`);
|
|
const iframe = document.createElement('iframe');
|
|
t.add_cleanup(() => iframe.remove());
|
|
iframe.src = docURL;
|
|
document.body.appendChild(iframe);
|
|
await new Promise(resolve => iframe.addEventListener('load', resolve));
|
|
const timeout = 5000;
|
|
const interval = 25;
|
|
let count = 0;
|
|
const before = performance.now();
|
|
|
|
while (performance.now() < before + timeout) {
|
|
// count=true returns the number of times the resource was accessed
|
|
const res = await fetch(preloadLink + '&count=true');
|
|
|
|
// If count is positive, the resource was accessed.
|
|
count = Number(await res.text());
|
|
if (count > 0)
|
|
break;
|
|
|
|
await new Promise(resolve => t.step_timeout(resolve, interval));
|
|
}
|
|
|
|
assert_equals(count, 1, "verify that request was issued exactly once");
|
|
}, `${desc} documents should respect preload Link headers`);
|
|
}
|
|
|
|
test_document_type({
|
|
type: 'application/xml',
|
|
content: `<?xml version="1.0" encoding="utf-8"?>
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
</html>`}, "XHTML");
|
|
test_document_type({content: 'Hello', type: 'text/plain'}, 'plain text');
|
|
test_document_type({file: 'square.png', type: 'image/png'}, 'image');
|
|
test_document_type({file: 'white.mp4', type: 'video/mp4'}, 'media');
|
|
test_document_type({content: 'dummy', type: 'image/png'}, 'invalid image');
|
|
</script>
|
|
</body>
|