| <!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> |