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