Test modulepreload in link header (#34328)

diff --git a/preload/link-header-modulepreload.html b/preload/link-header-modulepreload.html
new file mode 100644
index 0000000..fd759f6
--- /dev/null
+++ b/preload/link-header-modulepreload.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Makes sure that Link headers support modulepreload</title>
+<meta name="timeout" content="long">
+<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>
+    promise_test(async t => {
+        const id = token();
+        const moduleLink = getAbsoluteURL('./resources/module1.js');
+        const params = new URLSearchParams();
+        params.set('link', `<${moduleLink}>;rel=modulepreload`);
+        params.set('type', 'text/html');
+        params.set('file', 'modulepreload-iframe.html')
+        const docURL = getAbsoluteURL(`./resources/echo-preload-header.py?${params.toString()}`);
+        const iframe = document.createElement('iframe');
+        t.add_cleanup(() => iframe.remove());
+        iframe.src = docURL;
+        const messageReceived = new Promise(resolve => window.addEventListener('message', m => {
+            resolve(m.data);
+        }))
+        document.body.appendChild(iframe);
+        const result = await messageReceived;
+        assert_equals(result, 1);
+    }, 'test that a header-preloaded module is loaded and consumed');
+</script>
+</body>
diff --git a/preload/resources/modulepreload-iframe.html b/preload/resources/modulepreload-iframe.html
new file mode 100644
index 0000000..1d3d21f
--- /dev/null
+++ b/preload/resources/modulepreload-iframe.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<body>
+    <script>
+        const m = new URL('module1.js', location.href).toString();
+        const observer = new PerformanceObserver(l => {
+            const entries = l.getEntriesByName(m);
+            if (entries.length === 1) {
+                import(m).then(() => {
+                    observer.disconnect();
+                    const all = performance.getEntriesByName(m);
+                    window.parent.postMessage(all.length, '*');
+                });
+            }
+        });
+
+        observer.observe({type: 'resource', buffered: true});
+
+
+    </script>
+</body>
\ No newline at end of file