| <!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', 'timeout'], |
| 'Changing a prefetch crossorigin attribute does not trigger a fetch'); |
| |
| </script> |
| </body> |