tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 );