Add test for preload headers in non-html documents (#32878)

* Add test for preload headers in xhtml/plain-text/media
diff --git a/preload/link-header-preload-non-html.html b/preload/link-header-preload-non-html.html
new file mode 100644
index 0000000..c990e61
--- /dev/null
+++ b/preload/link-header-preload-non-html.html
@@ -0,0 +1,59 @@
+<!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>
diff --git a/preload/resources/echo-preload-header.py b/preload/resources/echo-preload-header.py
new file mode 100644
index 0000000..5cfb9e8
--- /dev/null
+++ b/preload/resources/echo-preload-header.py
@@ -0,0 +1,16 @@
+import os
+from wptserve.utils import isomorphic_encode
+
+def main(request, response):
+    response.headers.set(b"Content-Type", request.GET.first(b"type"))
+    link = request.GET.first(b"link")
+    response.headers.set(b"Access-Control-Allow-Origin", b"*")
+    response.headers.set(b"Access-Control-Allow-Credentials", b"true")
+    if link is not None:
+        response.headers.set(b"Link", link)
+
+    if b"file" in request.GET:
+        path = os.path.join(os.path.dirname(isomorphic_encode(__file__)), request.GET.first(b"file"));
+        response.content = open(path, mode=u'rb').read();
+    else:
+        return request.GET.first(b"content")