| <!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> |