content-visibility-auto-relevancy-updates.html (3552B)
1 <!doctype html> 2 <meta charset="utf-8"> 3 <title>Content Visibility: relevancy updates</title> 4 <link rel="author" title="Frédéric Wang" href="mailto:fwang@igalia.com"> 5 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> 6 <link rel="help" href="https://drafts.csswg.org/css-contain/#relevant-to-the-user"> 7 <link rel="help" href="https://drafts.csswg.org/css-contain/#cv-notes"> 8 <meta name="assert" content="Verify relevancy is properly updated for content-visibility: auto elements."> 9 10 <script src="/resources/testharness.js"></script> 11 <script src="/resources/testharnessreport.js"></script> 12 13 <style> 14 #spacer { 15 height: 300vh; 16 } 17 #contentVisibilityAuto { 18 content-visibility: auto; 19 border: solid; 20 } 21 </style> 22 <div> 23 <div id="log"></div> 24 <div tabindex="1" id="spacer"></div> 25 <div tabindex="2" id="contentVisibilityAuto"> 26 <span>Hello, World!</span> 27 </div> 28 </div> 29 30 <script> 31 function tick() { 32 return new Promise(r => { 33 requestAnimationFrame(() => requestAnimationFrame(r)); 34 }); 35 } 36 37 function contentVisibilityAutoElementIsRelevant() { 38 // A content-visibility: auto element that is not relevant skips its contents, 39 // which do not contribute to the result of innerText. 40 return contentVisibilityAuto.innerText.length > 0; 41 } 42 43 function clearRelevancyReasons() { 44 window.scrollTo(0, 0); 45 spacer.focus({preventScroll: true}); 46 window.getSelection().empty(); 47 } 48 49 promise_test(async function(t) { 50 // Wait for page load. 51 await new Promise(resolve => { window.addEventListener("load", resolve); }); 52 53 // Register cleanup method to reset relevancy. 54 t.add_cleanup(clearRelevancyReasons); 55 56 // Element should initially not be relevant. 57 await tick(); 58 assert_false(contentVisibilityAutoElementIsRelevant(), "initial relevancy"); 59 60 // Make element close to the viewport. 61 contentVisibilityAuto.firstElementChild.scrollIntoView(); 62 await tick(); 63 assert_true(contentVisibilityAutoElementIsRelevant(), "close to viewport"); 64 65 // Scroll away from the element again. 66 window.scrollTo(0, 0); 67 await tick(); 68 assert_false(contentVisibilityAutoElementIsRelevant(), "far from viewport"); 69 }, "Relevancy updated after changing proximity to the viewport."); 70 71 promise_test(async function(t) { 72 // Register cleanup method to reset relevancy. 73 t.add_cleanup(clearRelevancyReasons); 74 75 // Element should initially not be relevant. 76 await tick(); 77 assert_false(contentVisibilityAutoElementIsRelevant(), "initial relevancy"); 78 79 // Focus the element. 80 contentVisibilityAuto.focus({preventScroll: true}); 81 await tick(); 82 assert_true(contentVisibilityAutoElementIsRelevant(), "focused"); 83 84 // Unfocus the element again. 85 spacer.focus({preventScroll: true}); 86 await tick(); 87 assert_false(contentVisibilityAutoElementIsRelevant(), "unfocused"); 88 }, "Relevancy updated after being focused/unfocused."); 89 90 promise_test(async function(t) { 91 // Register cleanup method to reset relevancy. 92 t.add_cleanup(clearRelevancyReasons); 93 94 // Element should initially not be relevant. 95 await tick(); 96 assert_false(contentVisibilityAutoElementIsRelevant(), "initial relevancy"); 97 98 // Select the contents of the element. 99 window.getSelection().selectAllChildren(contentVisibilityAuto); 100 await tick(); 101 assert_true(contentVisibilityAutoElementIsRelevant(), "selected"); 102 103 // Unselect the contents of the element. 104 window.getSelection().empty(); 105 await tick(); 106 assert_false(contentVisibilityAutoElementIsRelevant(), "unselected"); 107 }, "Relevancy updated after being selected/unselected."); 108 109 </script>