| <!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="/preload/resources/preload_helper.js"></script> |
| <body> |
| <script> |
| |
| function test_preload_change(before, after, expected, label) { |
| promise_test(async t => { |
| const link = document.createElement('link'); |
| link.rel = 'preload'; |
| 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_preload_change( |
| {href: '/common/square.png?1', as: 'image'}, |
| {href: '/common/square.png?2'}, |
| ['load', 'load'], |
| 'Changing a preload href should trigger a fetch'); |
| |
| test_preload_change( |
| {href: '/common/square.png?3', as: 'style'}, |
| {as: 'image'}, |
| ['load', 'load'], |
| 'Changing a preload "as" from a previously non-matching destination should trigger a fetch'); |
| |
| test_preload_change( |
| {href: '/common/square.png?4', type: 'text/plain', as: 'image'}, |
| {type: 'image/png'}, |
| ['timeout', 'load'], |
| 'Changing a preload "type" (non-matching->matching) should trigger a fetch'); |
| |
| test_preload_change( |
| {href: '/common/square.png?4', type: 'text/plain', as: 'image'}, |
| {type: null}, |
| ['timeout', 'load'], |
| 'Removing a preload non-matching "type" should trigger a fetch'); |
| |
| |
| test_preload_change( |
| {href: '/common/square.png?4', type: 'image/png', as: 'image'}, |
| {type: null}, |
| ['load', 'timeout'], |
| 'Removing a preload matching "type" should not trigger a fetch'); |
| |
| test_preload_change( |
| {href: '/common/square.png?5', as: 'image', media: 'screen and (max-width: 10px)'}, |
| {media: 'screen and (max-width: 20000px)'}, |
| ['timeout', 'load'], |
| 'Changing a preload media attribute (non matching->matching) should trigger a fetch'); |
| |
| test_preload_change( |
| {href: '/common/square.png?6', as: 'image', media: 'screen and (max-width: 10px)'}, |
| {media: 'screen and (max-width: 20px)'}, |
| ['timeout', 'timeout'], |
| 'Changing a preload media attribute (non matching->non matching) should not trigger a fetch'); |
| |
| test_preload_change( |
| {href: '/common/square.png?7', as: 'image', media: 'screen and (max-width: 100000px)'}, |
| {media: 'screen and (max-width: 20000px)'}, |
| ['load', 'timeout'], |
| 'Changing a preload media attribute (matching->matching) should not trigger a new fetch'); |
| |
| test_preload_change( |
| {href: '/common/square.png?8', as: 'image', media: 'screen and (max-width: 100000px)'}, |
| {media: null}, |
| ['load', 'timeout'], |
| 'Removing a matching preload media attribute should not trigger a new fetch'); |
| |
| |
| test_preload_change( |
| {href: '/common/square.png?9', as: 'image', media: 'screen and (max-width: 10px)'}, |
| {media: null}, |
| ['timeout', 'load'], |
| 'Removing a non-matching preload media attribute should trigger a new fetch'); |
| |
| </script> |
| </body> |