tor-browser

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

browser_test_APZ.js (3401B)


      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 Services.scriptloader.loadSubScript(
      8  "chrome://mochitests/content/browser/gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js",
      9  this
     10 );
     11 
     12 /**
     13 * Test accessible is has correct offscreen state before and after
     14 * APZ.
     15 */
     16 addAccessibleTask(
     17  `
     18  <div id="test" style="background:green; height: 100px; width: 100px;">I am square</div>
     19  <div style="height: 70vh;">hello world I am large</div><br>
     20  <h1 id="heading" style="display: inline-block;">I am a heading</h1>
     21  `,
     22  async function (browser, accDoc) {
     23    const test = findAccessibleChildByID(accDoc, "test");
     24    const heading = findAccessibleChildByID(accDoc, "heading");
     25 
     26    info("Verifying offscreen state");
     27    await untilCacheOk(() => {
     28      const [states] = getStates(test);
     29      return (states & STATE_OFFSCREEN) == 0;
     30    }, "test div should be ON screen");
     31    await untilCacheOk(() => {
     32      const [states] = getStates(heading);
     33      return (states & STATE_OFFSCREEN) == 0;
     34    }, "heading should be ON screen");
     35 
     36    info("Pinch zooming...");
     37    await SpecialPowers.spawn(browser, [], async () => {
     38      const visualScrollPromise = new Promise(resolve => {
     39        content.window.visualViewport.addEventListener("scroll", resolve, {
     40          once: true,
     41        });
     42      });
     43      const utils = SpecialPowers.getDOMWindowUtils(content.window);
     44      utils.setResolutionAndScaleTo(2);
     45      utils.scrollToVisual(
     46        200,
     47        200,
     48        utils.UPDATE_TYPE_MAIN_THREAD,
     49        utils.SCROLL_MODE_INSTANT
     50      );
     51      await visualScrollPromise;
     52    });
     53    info("Verifying offscreen state");
     54    await untilCacheOk(() => {
     55      const [states] = getStates(test);
     56      return (states & STATE_OFFSCREEN) != 0;
     57    }, "test div should be OFF screen");
     58    await untilCacheOk(() => {
     59      const [states] = getStates(heading);
     60      return (states & STATE_OFFSCREEN) != 0;
     61    }, "heading should be OFF screen");
     62 
     63    info("Scrolling to bottom of page...");
     64    // We have to use the APZ scroll util here, we can't rely on
     65    // body.scrollTo, because the thing that we've created scroll
     66    // bars on is the visual viewport "element".
     67    await SpecialPowers.spawn(browser, [], async () => {
     68      const visualScrollPromise = new Promise(resolve => {
     69        content.window.visualViewport.addEventListener("scroll", resolve, {
     70          once: true,
     71        });
     72      });
     73      const utils = SpecialPowers.getDOMWindowUtils(content.window);
     74      utils.scrollToVisual(
     75        0,
     76        content.visualViewport.height,
     77        utils.UPDATE_TYPE_MAIN_THREAD,
     78        utils.SCROLL_MODE_INSTANT
     79      );
     80      await visualScrollPromise;
     81    });
     82 
     83    info("Verifying offscreen state");
     84    await untilCacheOk(() => {
     85      const [states] = getStates(test);
     86      return (states & STATE_OFFSCREEN) != 0;
     87    }, "test div should be OFF screen");
     88 
     89    await untilCacheOk(() => {
     90      const [states] = getStates(heading);
     91      return (states & STATE_OFFSCREEN) == 0;
     92    }, "heading should be ON screen");
     93  },
     94  // APZ only happens on the top-level document, which means iframe tests
     95  // will assert differently than classic remote doc tests.
     96  { iframe: false, remoteIframe: false }
     97 );