content-visibility-038.html (3243B)
1 <!doctype HTML> 2 <html> 3 <meta charset="utf8"> 4 <title>Content Visibility: measure layout</title> 5 <link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> 6 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> 7 <meta name="assert" content="content-visibility hidden element layout is correct"> 8 <meta name="assert" content="content-visibility hidden element's subtree layout is correct"> 9 10 <style> 11 #container { 12 background: lightgreen; 13 contain: layout; 14 } 15 .hidden { 16 content-visibility: hidden; 17 } 18 #sizer { 19 width: 100px; 20 height: 100px; 21 } 22 .child { 23 width: 20px; 24 height: 20%; 25 background: cyan; 26 } 27 #spacer { 28 width: 150px; 29 height: 150px; 30 background: green; 31 } 32 </style> 33 34 <div id="parent"></div> 35 <div id="spacer"></div> 36 37 <script src="/resources/testharness.js"></script> 38 <script src="/resources/testharnessreport.js"></script> 39 40 <script> 41 async_test((t) => { 42 function createChild(id) { 43 const child = document.createElement("div"); 44 child.classList = "child"; 45 child.id = id; 46 return child; 47 } 48 49 function measureForced() { 50 t.step(() => { 51 // Ensure children are laid out; this forces a layout if it wasn't done. 52 assert_equals(document.getElementById("0").offsetTop, 0, "0 forced"); 53 assert_equals(document.getElementById("1").offsetTop, 20, "1 forced"); 54 assert_equals(document.getElementById("2").offsetTop, 40, "2 forced"); 55 // Both parent should be 0 height, since it's hidden. Both parent and spacers 56 // should have 8 offsetTop. 57 assert_equals(document.getElementById("parent").offsetTop, 8, "parent forced"); 58 assert_equals(document.getElementById("spacer").offsetTop, 8, "spacer forced"); 59 }); 60 } 61 62 function measureWhenVisible() { 63 t.step(() => { 64 // Ensure children are still laid out. 65 assert_equals(document.getElementById("0").offsetTop, 0, "0 when visible"); 66 assert_equals(document.getElementById("1").offsetTop, 20, "1 when visible"); 67 assert_equals(document.getElementById("2").offsetTop, 40, "2 when visible"); 68 // Now the parent should encompass a container, so spacer is pushed down. 69 assert_equals(document.getElementById("parent").offsetTop, 8, "parent when visible"); 70 assert_equals(document.getElementById("spacer").offsetTop, 108, "spacer when visible"); 71 }); 72 } 73 74 function construct(container) { 75 const sizer = document.createElement("div"); 76 sizer.id = "sizer"; 77 container.appendChild(sizer); 78 sizer.appendChild(createChild("0")); 79 sizer.appendChild(createChild("1")); 80 sizer.appendChild(createChild("2")); 81 } 82 83 async function runTest() { 84 const container = document.createElement("div"); 85 container.id = "container"; 86 87 document.getElementById("parent").appendChild(container); 88 container.classList.add("hidden"); 89 requestAnimationFrame(() => { 90 construct(container); 91 measureForced(); 92 93 container.classList.remove("hidden"); 94 requestAnimationFrame(() => requestAnimationFrame(() => { 95 measureWhenVisible(); 96 t.done(); 97 })); 98 }); 99 } 100 101 window.onload = function() { 102 requestAnimationFrame(() => requestAnimationFrame(runTest)); 103 }; 104 }, "Measure Forced Layout"); 105 </script> 106 107 </html>