| <!doctype html> | |
| <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="/common/get-host-info.sub.js"></script> | |
| <script src="/preload/resources/preload_helper.js"></script> | |
| <body> | |
| <script> | |
| const {REMOTE_ORIGIN} = get_host_info(); | |
| function test_prefetch_change(before, after, expected, label) { | |
| promise_test(async t => { | |
| const link = document.createElement('link'); | |
| link.rel = 'prefetch'; | |
| t.add_cleanup(() => link.remove()); | |
| const loadErrorOrTimeout = () => new Promise(resolve => { | |
| const timeoutMillis = 1000; | |
| link.addEventListener('load', () => resolve('load')); | |
| link.addEventListener('error', () => resolve('error')); | |
| t.step_timeout(() => resolve('timeout'), timeoutMillis); | |
| }); | |
| for (const attr in before) | |
| link.setAttribute(attr, before[attr]); | |
| document.head.appendChild(link); | |
| const result1 = await loadErrorOrTimeout(); | |
| for (const attr in after) { | |
| if (attr in before && after[attr] === null) | |
| link.removeAttribute(attr); | |
| else | |
| link.setAttribute(attr, after[attr]); | |
| } | |
| const result2 = await loadErrorOrTimeout(); | |
| assert_array_equals([result1, result2], expected); | |
| }, label); | |
| } | |
| test_prefetch_change( | |
| {href: '/common/square.png?1'}, | |
| {href: '/common/square.png?2'}, | |
| ['load', 'load'], | |
| 'Changing a prefetch href should trigger a fetch'); | |
| test_prefetch_change( | |
| {href: `${REMOTE_ORIGIN}/common/square.png?pipe=header(Access-Control-Allow-Origin, *)`}, | |
| {href: `${REMOTE_ORIGIN}/common/square.png?pipe=header(Access-Control-Allow-Origin, *)`, crossorigin: 'anonymous'}, | |
| ['load', 'load'], | |
| 'Changing a prefetch crossorigin attribute should trigger a fetch'); | |
| </script> | |
| </body> |