browser_test_scroll_hittest.js (6401B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 add_setup(async function () { 8 await SpecialPowers.pushPrefEnv({ 9 set: [["test.wait300msAfterTabSwitch", true]], 10 }); 11 }); 12 13 /** 14 * Verify that hit testing returns the proper accessible when one accessible 15 * covers another accessible due to scroll clipping. See Bug 1819741. 16 */ 17 addAccessibleTask( 18 ` 19 <div id="container" style="height: 100%; position: absolute; flex-direction: column; display: flex;"> 20 <div id="title-bar" style="height: 500px; background-color: red;"></div> 21 <div id="message-container" style="overflow-y: hidden; display: flex;"> 22 <div style="overflow-y: auto;" id="message-scrollable"> 23 <p style="white-space: pre-line;"> 24 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec dictum luctus molestie. Nam in libero mi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. 25 26 Praesent aliquet semper libero, eu ullamcorper tortor vestibulum ac. Sed non pharetra sem. Quisque sodales ipsum a ipsum condimentum porttitor. Integer luctus pellentesque ipsum, eu dignissim nunc fermentum in. 27 28 Etiam blandit nisl vitae dolor molestie faucibus. In euismod, massa vitae commodo bibendum, urna augue pharetra nibh, et sagittis libero est in ligula. Mauris tincidunt risus ornare, rutrum augue in, blandit ligula. Aenean ultrices vel risus sit amet varius. 29 30 Vivamus pretium ultricies nisi a cursus. Integer cursus quam a metus ultricies, vel pulvinar nunc varius. Quisque facilisis lorem eget ipsum vehicula, laoreet congue lorem viverra. 31 32 Praesent dignissim, diam sed semper ultricies, diam ex laoreet justo, ac euismod massa metus pharetra nunc. Vestibulum sapien erat, consequat at eleifend id, suscipit sit amet mi. 33 34 Curabitur sed mauris vitae justo rutrum convallis ac sed justo. Ut nec est sed nisi feugiat egestas. Mauris accumsan mi eget nibh fermentum, in dignissim odio feugiat. 35 36 Maecenas augue dolor, gravida ut ultrices ultricies, condimentum et dui. In sed augue fermentum, posuere velit et, pulvinar tellus. Morbi id fermentum quam, at varius arcu. 37 38 Duis elementum vitae sapien id tincidunt. Aliquam velit ligula, sollicitudin eget placerat non, aliquam at erat. Pellentesque non porta metus. Mauris vel finibus sem, nec ullamcorper leo. 39 40 Nulla sit amet lorem vitae diam consectetur porttitor a cursus massa. Sed id ornare lorem. Sed placerat facilisis ipsum et ultricies. Sed eu semper enim, ut aliquet odio. 41 42 Sed nulla ex, pharetra vel porttitor congue, dictum et purus. Suspendisse vel risus sit amet nulla volutpat ullamcorper. Morbi et ullamcorper est. Pellentesque eget porta risus. Nullam non felis elementum, auctor massa et, consectetur neque. 43 44 Fusce sit amet arcu finibus, ornare sem sed, tempus nibh. Donec rutrum odio eget bibendum pulvinar. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. 45 46 Phasellus sed risus diam. Vivamus mollis, risus ac feugiat pellentesque, ligula tortor finibus libero, et venenatis turpis lectus et justo. Suspendisse euismod mi at lectus sagittis dignissim. Mauris a ornare enim. 47 </p> 48 </div> 49 </div> 50 <div id="footer-bar" style="height: 500px; background-color: blue;"></div> 51 </div> 52 `, 53 async function (browser, docAcc) { 54 const container = findAccessibleChildByID(docAcc, "container"); 55 const scrollable = findAccessibleChildByID(docAcc, "message-scrollable"); 56 const titleBar = findAccessibleChildByID(docAcc, "title-bar"); 57 const footerBar = findAccessibleChildByID(docAcc, "footer-bar"); 58 const dpr = await getContentDPR(browser); 59 const [, , , titleBarHeight] = Layout.getBounds(titleBar, dpr); 60 const [, , , scrollableHeight] = Layout.getBounds(scrollable, dpr); 61 62 // Verify that the child at this point is not the underlying paragraph. 63 info( 64 "Testing that the deepest child at this point is the overlaid section, not the paragraph beneath it." 65 ); 66 await testChildAtPoint( 67 dpr, 68 1, 69 titleBarHeight - 1, 70 container, 71 titleBar, 72 titleBar 73 ); 74 await testChildAtPoint( 75 dpr, 76 1, 77 titleBarHeight + scrollableHeight + 1, 78 container, 79 footerBar, 80 footerBar 81 ); 82 83 await invokeContentTask(browser, [], () => { 84 // Scroll the text down. 85 let elem = content.document.getElementById("message-scrollable"); 86 elem.scrollTo(0, elem.scrollHeight); 87 }); 88 await waitForContentPaint(browser); 89 90 info( 91 "Testing that the deepest child at this point is still the overlaid section, after scrolling the paragraph." 92 ); 93 await testChildAtPoint( 94 dpr, 95 1, 96 titleBarHeight - 1, 97 container, 98 titleBar, 99 titleBar 100 ); 101 await testChildAtPoint( 102 dpr, 103 1, 104 titleBarHeight + scrollableHeight + 1, 105 container, 106 footerBar, 107 footerBar 108 ); 109 }, 110 { chrome: true, iframe: true, remoteIframe: true } 111 ); 112 113 addAccessibleTask( 114 `<style> 115 html, body { 116 height: 100%; 117 margin: 0; 118 } 119 120 html { 121 overflow: hidden; 122 } 123 124 body { 125 overflow: hidden auto; 126 } 127 128 button { 129 display: block; 130 height: 100vh; 131 width: 100%; 132 } 133 </style> 134 <button id="btn1">Hello</button> 135 <button id="btn2">World</button>`, 136 async function (browser, accDoc) { 137 const dpr = await getContentDPR(browser); 138 139 let btn1 = findAccessibleChildByID(accDoc, "btn1"); 140 let btn2 = findAccessibleChildByID(accDoc, "btn2"); 141 142 let [, , width, height] = Layout.getBounds(accDoc, dpr); 143 144 await testChildAtPoint( 145 dpr, 146 width / 2, 147 height / 2, 148 accDoc, 149 accDoc.firstChild, 150 btn1 151 ); 152 153 await invokeContentTask(browser, [], async () => { 154 content.document.documentElement.style.overflow = "initial"; 155 await new Promise(resolve => { 156 content.requestAnimationFrame(() => { 157 content.scrollTo(0, content.scrollMaxY); 158 resolve(); 159 }); 160 }); 161 }); 162 163 await testChildAtPoint( 164 dpr, 165 width / 2, 166 height / 2, 167 accDoc, 168 accDoc.firstChild, 169 btn2 170 ); 171 } 172 );