tor-browser

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

test_getCoalescedEvents.html (5473B)


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