image-loading-lazy.html (4827B)
1 <!DOCTYPE html> 2 <head> 3 <title>Images with loading='lazy' load only when in the viewport</title> 4 <link rel="author" title="Dom Farolino" href="mailto:dom@chromium.org"> 5 <link rel="author" title="Scott Little" href="mailto:sclittle@chromium.org"> 6 <link rel="help" href="https://github.com/scott-little/lazyload"> 7 <script src="/resources/testharness.js"></script> 8 <script src="/resources/testharnessreport.js"></script> 9 </head> 10 11 <script> 12 const in_viewport_test = 13 async_test("In-viewport loading=lazy images load immediately but do not " + 14 "block the window load event"); 15 const below_viewport_test = 16 async_test("Below-viewport loading=lazy images only load when in the " + 17 "viewport and do not block the window load event"); 18 const below_viewport_data_url_test = 19 async_test("Below-viewport data:url images only load when in the " + 20 "viewport and do not block the window load event"); 21 const below_viewport_blob_url_test = 22 async_test("Below-viewport blob URL images only load when in the " + 23 "viewport and do not block the window load event"); 24 25 document.addEventListener('DOMContentLoaded', e => { 26 const img = document.querySelector('#below_viewport_blob_url'); 27 28 // Blob URL helper. 29 // Source: https://bl.ocks.org/nolanlawson/0eac306e4dac2114c752. 30 function fixBinary(bin) { 31 const length = bin.length; 32 const buf = new ArrayBuffer(length); 33 const arr = new Uint8Array(buf); 34 for (var i = 0; i < length; i++) { 35 arr[i] = bin.charCodeAt(i); 36 } 37 38 return buf; 39 } 40 41 const base64 = 42 "R0lGODlhDAAMAKIFAF5LAP/zxAAAANyuAP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOaGcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA"; 43 const binary = fixBinary(atob(base64)); 44 const blob = new Blob([binary], {type: 'image/png'}); 45 const url = URL.createObjectURL(blob); 46 img.src = url; 47 }) // DOMContentLoaded. 48 49 let has_window_load_fired = false; 50 let has_in_viewport_loaded = false; 51 52 window.onload = e => { 53 has_window_load_fired = true; 54 } 55 56 // Helper assertion messages for the below tests. 57 const kScrollAssertion = "images only load when scrolled into view"; 58 const kWindowLoadAssertion = "images do not block the load event"; 59 60 const in_viewport_img_onload = in_viewport_test.step_func_done(() => { 61 has_in_viewport_loaded = true; 62 document.querySelector('#bottom').scrollIntoView(); 63 assert_true(has_window_load_fired, 64 "In-viewport loading=lazy images do not block the window " + 65 "load event"); 66 }); 67 68 const below_viewport_img_onload = below_viewport_test.step_func_done(() => { 69 assert_true(has_in_viewport_loaded, 70 "Below-viewport loading=lazy images only load once loaded " + 71 "into the viewport"); 72 assert_true(has_window_load_fired, 73 "Below-viewport loading=lazy images should not block the " + 74 "window load event"); 75 }); 76 77 const below_viewport_data_url_img_onload = below_viewport_data_url_test.step_func_done(() => { 78 assert_true(has_in_viewport_loaded, 79 "Below-viewport loading=lazy data: url images " + 80 kScrollAssertion); 81 assert_true(has_window_load_fired, 82 "Below-viewport loading=lazy data: url images " + 83 kWindowLoadAssertion); 84 }); 85 86 const below_viewport_blob_url_img_onload = below_viewport_blob_url_test.step_func_done(() => { 87 assert_true(has_in_viewport_loaded, 88 "Below-viewport loading=lazy blob url images " + 89 kScrollAssertion); 90 assert_true(has_window_load_fired, 91 "Below-viewport loading=lazy blob url images " + 92 kWindowLoadAssertion); 93 }); 94 </script> 95 96 <body> 97 <!-- |in_viewport| takes 2 seconds to load, so that in browsers that don't 98 support lazy loading, |below_viewport| finishes before |in_viewport|, and 99 the test will dependably fail without relying on a timeout. --> 100 <img id="in_viewport" loading="lazy" src="resources/image.png?image-loading-lazy-first&pipe=trickle(d2)" 101 onload="in_viewport_img_onload()"> 102 <div style="height:1000vh;"></div> 103 <img id="below_viewport" loading="lazy" src="resources/image.png?image-loading-lazy-second" 104 onload="below_viewport_img_onload()"> 105 <img id="below_viewport_data_url" loading="lazy" 106 src="data:image/png;base64,R0lGODlhDAAMAKIFAF5LAP/zxAAAANyuAP/gaP///wAAAAAAACH5BAEAAAUALAAAAAAMAAwAAAMlWLPcGjDKFYi9lxKBOaGcF35DhWHamZUW0K4mAbiwWtuf0uxFAgA" 107 onload="below_viewport_data_url_img_onload()"> 108 <!-- This image has its `src` set to a blob URL dynamically above --> 109 <img id="below_viewport_blob_url" loading="lazy" 110 onload="below_viewport_blob_url_img_onload()"> 111 <div id="bottom"></div> 112 </body>