root-margin-root-element.html (2634B)
1 <!DOCTYPE html> 2 <script src="/resources/testharness.js"></script> 3 <script src="/resources/testharnessreport.js"></script> 4 <script src="./resources/intersection-observer-test-utils.js"></script> 5 6 <style> 7 pre, #log { 8 position: absolute; 9 top: 0; 10 left: 200px; 11 } 12 .spacer { 13 height: calc(100vh + 100px); 14 } 15 #root { 16 display: inline-block; 17 overflow-y: scroll; 18 height: 200px; 19 border: 3px solid black; 20 } 21 #target { 22 width: 100px; 23 height: 100px; 24 background-color: green; 25 } 26 </style> 27 28 <div class="spacer"></div> 29 <div id="root"> 30 <div style="height: 300px;"></div> 31 <div id="target"></div> 32 </div> 33 <div class="spacer"></div> 34 35 <script> 36 var vw = document.documentElement.clientWidth; 37 var vh = document.documentElement.clientHeight; 38 39 var entries = []; 40 var root, target; 41 42 runTestCycle(function() { 43 target = document.getElementById("target"); 44 assert_true(!!target, "target exists"); 45 root = document.getElementById("root"); 46 assert_true(!!root, "root exists"); 47 var observer = new IntersectionObserver(function(changes) { 48 entries = entries.concat(changes) 49 }, { root: root, rootMargin: "10px 20% 40% 30px" }); 50 observer.observe(target); 51 entries = entries.concat(observer.takeRecords()); 52 assert_equals(entries.length, 0, "No initial notifications."); 53 runTestCycle(step0, "First rAF"); 54 }, "Root margin with explicit root."); 55 56 function step0() { 57 document.scrollingElement.scrollTop = vh; 58 runTestCycle(step1, "document.scrollingElement.scrollTop = window.innerHeight."); 59 checkLastEntry(entries, 0, [ 11, 111, vh + 411, vh + 511, 0, 0, 0, 0, -19, 131, vh + 101, vh + 391, false]); 60 } 61 62 function step1() { 63 root.scrollTop = 50; 64 runTestCycle(step2, "root.scrollTop = 50, putting target into root margin"); 65 assert_equals(entries.length, 1, "No notifications after scrolling frame."); 66 } 67 68 function step2() { 69 document.scrollingElement.scrollTop = 0; 70 runTestCycle(step3, "document.scrollingElement.scrollTop = 0."); 71 checkLastEntry(entries, 1, [11, 111, 361, 461, 11, 111, 361, 391, -19, 131, 101, 391, true]); 72 } 73 74 function step3() { 75 root.scrollTop = 0; 76 runTestCycle(step4, "root.scrollTop = 0"); 77 checkLastEntry(entries, 1); 78 } 79 80 function step4() { 81 root.scrollTop = 50; 82 runTestCycle(step5, "root.scrollTop = 50 with root scrolled out of view."); 83 checkLastEntry(entries, 2, [ 11, 111, vh + 411, vh + 511, 0, 0, 0, 0, -19, 131, vh + 101, vh + 391, false]); 84 } 85 86 // This tests that notifications are generated even when the root element is off screen. 87 function step5() { 88 checkLastEntry(entries, 3, [11, 111, vh + 361, vh + 461, 11, 111, vh + 361, vh + 391, -19, 131, vh + 101, vh + 391, true]); 89 } 90 </script>