tor-browser

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

test_getCoalescedEvents_during_button_press.html (5460B)


      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 getCoalescedEvents() while a button is pressed</title>
      7  <script src="/tests/SimpleTest/EventUtils.js"></script>
      8  <script src="/tests/SimpleTest/SimpleTest.js"></script>
      9  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css">
     10 </head>
     11 <body>
     12 <!-- DO NOT PUT any text before the test target to avoid fractional coordinates! -->
     13 <div id="target0" style="width: 50px; height: 50px; background: green"></div>
     14 <script>
     15 "use strict";
     16 
     17 SimpleTest.waitForExplicitFinish();
     18 SimpleTest.waitForFocus(async () => {
     19  await SpecialPowers.pushPrefEnv({"set": [
     20    ["dom.events.coalesce.mousemove", true],
     21    ["test.events.async.enabled", true],
     22  ]});
     23 
     24  const target0 = window.document.getElementById("target0");
     25  const utils = SpecialPowers.getDOMWindowUtils(window);
     26  utils.advanceTimeAndRefresh(0);
     27 
     28  await new Promise(resolve => SimpleTest.executeSoon(resolve));
     29 
     30  const waitForPointerMove = new Promise(resolve => {
     31    target0.addEventListener("pointermove", (ev) => {
     32      let length = ev.getCoalescedEvents().length;
     33      ok(length >= 1, "Coalesced events should >= 1, got " + length);
     34 
     35      let rect = target0.getBoundingClientRect();
     36      let prevOffsetX = undefined;
     37      let prevOffsetY = undefined;
     38 
     39      function isExpectedOffset(aNewOffset, aPrevOffset) {
     40        if (aPrevOffset === undefined) {
     41          const roundedOffset = 5 * Math.max(Math.round(aNewOffset / 5), 1);
     42          return aNewOffset >= roundedOffset - 1 && aNewOffset <= roundedOffset + 1;
     43        }
     44        let candidateOffset = aPrevOffset + 5;
     45        const toleranceError = navigator.userAgent.includes("Android") ? 0.31 : 0.1;
     46        while (candidateOffset < 25) {
     47          if (
     48            aNewOffset >= candidateOffset - toleranceError &&
     49            aNewOffset <= candidateOffset + toleranceError
     50          ) {
     51            return true;
     52          }
     53          candidateOffset += 5;
     54        }
     55        return false;
     56      }
     57 
     58      for (let i = 0; i < length; ++i) {
     59        let coalescedEvent = ev.getCoalescedEvents()[i];
     60        isnot(coalescedEvent.timeStamp, 0, "getCoalescedEvents()[" + i + "].timeStamp");
     61        is(coalescedEvent.type, "pointermove", "getCoalescedEvents()[" + i + "].type");
     62        is(coalescedEvent.pointerId, ev.pointerId, "getCoalescedEvents()[" + i + "].pointerId");
     63        is(coalescedEvent.pointerType, ev.pointerType, "getCoalescedEvents()[" + i + "].pointerType");
     64        is(coalescedEvent.isPrimary, ev.isPrimary, "getCoalescedEvents()[" + i + "].isPrimary");
     65        is(coalescedEvent.target, ev.target, "getCoalescedEvents()[" + i + "].target");
     66        is(coalescedEvent.currentTarget, null, "getCoalescedEvents()[" + i + "].currentTarget");
     67        is(coalescedEvent.eventPhase, Event.NONE, "getCoalescedEvents()[" + i + "].eventPhase");
     68        is(coalescedEvent.cancelable, false, "getCoalescedEvents()[" + i + "].cancelable");
     69        is(coalescedEvent.bubbles, false, "getCoalescedEvents()[" + i + "].bubbles");
     70        is(coalescedEvent.buttons, 1, `getCoalescedEvents()[${i}].buttons should be 1`);
     71        is(coalescedEvent.pressure, 0.5, `getCoalescedEvents()[${i}].pressure should be 0.5 when buttons is not 0`);
     72 
     73        ok(
     74          isExpectedOffset(coalescedEvent.offsetX, prevOffsetX),
     75          `getCoalescedEvents()[${i}].offsetX (${
     76            coalescedEvent.offsetX
     77          }) should be 5 * n + previous offsetX (${prevOffsetX})`
     78        );
     79        ok(
     80          isExpectedOffset(coalescedEvent.offsetY, prevOffsetY),
     81          `getCoalescedEvents()[${i}].offsetY (${
     82            coalescedEvent.offsetY
     83          }) should be 5 * n + previous offsetY (${prevOffsetY})`
     84        );
     85 
     86        prevOffsetX = coalescedEvent.offsetX;
     87        prevOffsetY = coalescedEvent.offsetY;
     88 
     89        let x = rect.left + prevOffsetX;
     90        let y = rect.top + prevOffsetY;
     91        // coordinates may change slightly due to rounding
     92        ok((coalescedEvent.clientX <= x+2) && (coalescedEvent.clientX >= x-2), "getCoalescedEvents()[" + i + "].clientX");
     93        ok((coalescedEvent.clientY <= y+2) && (coalescedEvent.clientY >= y-2), "getCoalescedEvents()[" + i + "].clientY");
     94      }
     95      resolve();
     96    }, { once: true });
     97  });
     98 
     99  info(`mozInnerScreen={${SpecialPowers.wrap(window).mozInnerScreenX}, ${SpecialPowers.wrap(window).mozInnerScreenY}}`);
    100  info(`devicePixelRatio=${window.devicePixelRatio}`);
    101  try {
    102    info(`top.mozInnerScreen={${SpecialPowers.wrap(window.top).mozInnerScreenX}, ${SpecialPowers.wrap(window.top).mozInnerScreenY}}`);
    103    info(`top.getResolution()=${SpecialPowers.wrap(window.top).windowUtils.getResolution()}`);
    104  } catch (e) {}
    105  info(`target0.getBoundingClientRect()={${target0.getBoundingClientRect().x}, ${target0.getBoundingClientRect().y}}`);
    106 
    107  info("Synthesizing mouse moves....");
    108  synthesizeMouse(target0, 5, 5, {type: "mousemove", buttons: 1});
    109  synthesizeMouse(target0, 10, 10, {type: "mousemove", buttons: 1});
    110  synthesizeMouse(target0, 15, 15, {type: "mousemove", buttons: 1});
    111  synthesizeMouse(target0, 20, 20, {type: "mousemove", buttons: 1});
    112  utils.restoreNormalRefresh();
    113  await waitForPointerMove;
    114 
    115  target0.addEventListener("pointerup", (ev) => {
    116    SimpleTest.finish();
    117  }, { once: true });
    118 
    119  info("Synthesizing a click....");
    120  synthesizeMouse(target0, 20, 20, {});
    121 });
    122 
    123 </script>
    124 </body>
    125 </html>