| <!DOCTYPE html> | |
| <title>Ensures that prefetch respects HTTP cache semantics</title> | |
| <meta name="timeout" content="long"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/common/utils.js"></script> | |
| <script src="resources/prefetch-helper.js"></script> | |
| <script src="/common/get-host-info.sub.js"></script> | |
| <body> | |
| <script> | |
| const {REMOTE_ORIGIN} = get_host_info(); | |
| async function prefetch(link, uid, t) { | |
| link.rel = "prefetch"; | |
| document.head.appendChild(link); | |
| const event = new Promise(resolve => { | |
| link.addEventListener("error", () => resolve("error")); | |
| link.addEventListener("load", () => resolve("load")); | |
| t.step_timeout(() => resolve("timeout"), 1000); | |
| }); | |
| return await event; | |
| } | |
| promise_test(async t => { | |
| const uid = token(); | |
| const link = document.createElement("link"); | |
| link.href = `/preload/resources/prefetch-info.py?key=${uid}`; | |
| const event = await prefetch(link, uid, t); | |
| assert_equals(event, "load"); | |
| }, "Prefetch should fire the load event"); | |
| promise_test(async t => { | |
| const uid = token(); | |
| const link = document.createElement("link"); | |
| link.href = `${REMOTE_ORIGIN}/preload/resources/prefetch-info.py?key=${uid}`; | |
| const event = await prefetch(link, uid, t); | |
| assert_equals(event, "load"); | |
| }, "Cross-origin prefetch should fire the load event"); | |
| promise_test(async t => { | |
| const uid = token(); | |
| const link = document.createElement("link"); | |
| link.href = `/preload/resources/prefetch-info.py?key=${uid}&status=404`; | |
| const event = await prefetch(link, uid, t); | |
| assert_equals(event, "load"); | |
| }, "Prefetch should fire the load event for 404"); | |
| promise_test(async t => { | |
| const uid = token(); | |
| const link = document.createElement("link"); | |
| link.href = `${REMOTE_ORIGIN}/preload/resources/prefetch-info.py?key=${uid}&status=404`; | |
| const event = await prefetch(link, uid, t); | |
| assert_equals(event, "load"); | |
| }, "Prefetch should fire the load event for 404 (cross-origin)"); | |
| promise_test(async t => { | |
| const uid = token(); | |
| const link = document.createElement("link"); | |
| link.href = `/preload/resources/prefetch-info.py?key=${uid}&status=500`; | |
| const event = await prefetch(link, uid, t); | |
| assert_equals(event, "load"); | |
| }, "Prefetch should fire the load event for 500"); | |
| promise_test(async t => { | |
| const uid = token(); | |
| const link = document.createElement("link"); | |
| link.href = `${REMOTE_ORIGIN}/preload/resources/prefetch-info.py?key=${uid}&status=500`; | |
| const event = await prefetch(link, uid, t); | |
| assert_equals(event, "load"); | |
| }, "Cross-origin prefetch should fire the load event for 500"); | |
| promise_test(async t => { | |
| const uid = token(); | |
| const link = document.createElement("link"); | |
| link.crossOrigin = "anonymous"; | |
| link.href = `${REMOTE_ORIGIN}/preload/resources/prefetch-info.py?key=${uid}&cors=false`; | |
| const event = await prefetch(link, uid, t); | |
| assert_equals(event, "error"); | |
| }, "Prefetch should fire the error event for network errors"); | |
| promise_test(async t => { | |
| const uid = token(); | |
| const link = document.createElement("link"); | |
| link.crossOrigin = "anonymous"; | |
| const event = await prefetch(link, uid, t); | |
| assert_equals(event, "timeout"); | |
| }, "Prefetch should do nothing with an empty href"); | |
| promise_test(async t => { | |
| const uid = token(); | |
| const link = document.createElement("link"); | |
| link.href = "https://example.com\u0000mozilla.org"; | |
| link.crossOrigin = "anonymous"; | |
| const event = await prefetch(link, uid, t); | |
| assert_equals(event, "timeout"); | |
| }, "Prefetch should do nothing with an invalid href"); | |
| </script> | |
| </body> |