tor-browser

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

test_pointerrawupdate_event_count_touch.html (6485B)


      1 <!doctype html>
      2 <html>
      3 <head>
      4  <meta charset="utf-8">
      5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
      6  <title>Test for number of pointerrawupdate events of touch</title>
      7  <script src="/tests/SimpleTest/EventUtils.js"></script>
      8  <script src="/tests/SimpleTest/SimpleTest.js"></script>
      9  <script src="/tests/gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js"></script>
     10  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
     11 </head>
     12 <body>
     13 <div id="target0" style="margin: 50px; width: 50px; height: 50px; background: green"></div>
     14 <script>
     15 "use strict";
     16 
     17 SimpleTest.waitForExplicitFinish();
     18 SimpleTest.requestCompleteLog();
     19 
     20 if (!window.opener) {
     21  // the utils function in apz can't not be used in remote iframe, so run the
     22  // test in a new tab.
     23  info("run tests in a new tab");
     24  window.open("test_pointerrawupdate_event_count_touch.html");
     25 } else {
     26  async function runTests() {
     27    const target0 = window.document.getElementById("target0");
     28    const utils = SpecialPowers.getDOMWindowUtils(window);
     29    utils.advanceTimeAndRefresh(0);
     30    const allEvents = [];
     31    const pointerRawUpdateEvents = [];
     32    const coalescedPointerMoveEvents = [];
     33 
     34    function stringifyPointerEvent(event) {
     35      return `{ screenX: ${event.screenX}, screenY: ${
     36        event.screenY
     37      }, clientX: ${event.clientX}, clientY:${event.clientY}, buttons:${
     38        event.buttons
     39      }, pointerId: ${event.pointerId}, pointerType:"${event.pointerType}" }`;
     40    }
     41 
     42    SimpleTest.executeSoon(async () => {
     43      function putEventToAllEvents(event) {
     44        allEvents.push(event);
     45      }
     46      const allEventsToLog = [
     47        "pointerdown",
     48        "pointerup",
     49        "pointermove",
     50        "pointerrawupdate",
     51        "pointerover",
     52        "pointerenter",
     53        "pointerout",
     54        "pointerleave",
     55        "pointercancel",
     56      ];
     57      for (const type of allEventsToLog) {
     58        target0.addEventListener(type, putEventToAllEvents, {capture: true});
     59      }
     60      function onPointerRawUpdate(event) {
     61        // Windows may notify unexpected mouse move when multiple pointers are
     62        // used even without the user actually moves the mouse.  Let's ignore
     63        // the events since they are not what we're checking in this test.
     64        if (event.pointerType != "touch") {
     65          return;
     66        }
     67        pointerRawUpdateEvents.push(event);
     68        // Currently, we need to compute the coordinates of the coalesced events
     69        // while the host event is being dispatched. See bug 1960530.
     70        event.getCoalescedEvents();
     71      }
     72      target0.addEventListener("pointerrawupdate", onPointerRawUpdate);
     73      const waitForPointerMove = new Promise(resolve => {
     74        function onPointerMove(event) {
     75          // Windows may notify unexpected mouse move when multiple pointers are
     76          // used even without the user actually moves the mouse.  Let's ignore
     77          // the events since they are not what we're checking in this test.
     78          if (event.pointerType != "touch") {
     79            return;
     80          }
     81          for (const coalescedEvent of event.getCoalescedEvents()) {
     82            coalescedPointerMoveEvents.push(coalescedEvent);
     83          }
     84          if (pointerRawUpdateEvents.length > 1) {
     85            target0.removeEventListener("pointermove", onPointerMove);
     86            target0.removeEventListener("pointerrawupdate", onPointerRawUpdate);
     87            for (const type of allEventsToLog) {
     88              target0.removeEventListener(type, putEventToAllEvents, {capture: true});
     89            }
     90            resolve();
     91          }
     92        }
     93        target0.addEventListener("pointermove", onPointerMove);
     94      });
     95 
     96      target0.addEventListener("pointerup", async event => {
     97        utils.restoreNormalRefresh();
     98        await waitForPointerMove;
     99        for (const event of allEvents) {
    100          info(`${event.type}: ${stringifyPointerEvent(event)}`);
    101        }
    102        opener.ok(!!pointerRawUpdateEvents.length, "At least one pointerrawupdate event should be fired");
    103        {
    104          let i = 0;
    105          for (const pointerRawUpdateEvent of pointerRawUpdateEvents) {
    106            const coalescedEvents = pointerRawUpdateEvent.getCoalescedEvents();
    107            opener.is(
    108              coalescedEvents.length,
    109              1,
    110              `pointerrawupdate(${i}): should have only one coalesced event`
    111            );
    112            opener.is(
    113              `${coalescedEvents[0].type}: ${stringifyPointerEvent(coalescedEvents[0])}`,
    114              `${pointerRawUpdateEvent.type}: ${stringifyPointerEvent(pointerRawUpdateEvent)}`,
    115              `pointerrawupdate(${i++}): the coalesced event should have same values as the host event`
    116            );
    117          }
    118        }
    119        for (let i = 0; i < Math.min(pointerRawUpdateEvents.length, coalescedPointerMoveEvents.length); i++) {
    120          opener.is(
    121            stringifyPointerEvent(pointerRawUpdateEvents[i]),
    122            stringifyPointerEvent(coalescedPointerMoveEvents[i]),
    123            `pointerrawupdate(${i}): should have same values as coalesced pointermove events`
    124          );
    125        }
    126        if (pointerRawUpdateEvents.length < coalescedPointerMoveEvents.length) {
    127          for (let i = pointerRawUpdateEvents.length; i < coalescedPointerMoveEvents.length; i++) {
    128            opener.is(
    129              "{}",
    130              stringifyPointerEvent(coalescedPointerMoveEvents[i]),
    131              `coalescedPointerMoveEvents(${i++}): should not be there`
    132            );
    133          }
    134        } else if (pointerRawUpdateEvents.length > coalescedPointerMoveEvents.length) {
    135          for (let i = coalescedPointerMoveEvents.length; i < pointerRawUpdateEvents.length; i++) {
    136            opener.is(
    137              stringifyPointerEvent(pointerRawUpdateEvents[i]),
    138              "{}",
    139              `pointerrawupdate(${i++}): should not be there`
    140            );
    141          }
    142        }
    143        opener.SimpleTest.finish();
    144        window.close();
    145      }, { once: true });
    146 
    147      let positions = [];
    148      for (let i = 10; i <= 40; i+=5) {
    149        positions.push([{ x: i, y: i }]);
    150      }
    151 
    152      await synthesizeNativeTouchSequences(target0, positions);
    153    });
    154  }
    155 
    156  SimpleTest.waitForFocus(() => {
    157    SpecialPowers.pushPrefEnv({"set": [
    158      ["dom.event.pointer.rawupdate.enabled", true],
    159      ["dom.events.coalesce.touchmove", true],
    160      ["dom.events.compress.touchmove", false],
    161    ]}, runTests);
    162  });
    163 }
    164 
    165 </script>
    166 </body>
    167 </html>