tor-browser

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

pointerevent_setpointercapture_to_same_element_twice.html (3404B)


      1 <!DOCTYPE HTML>
      2 <title>Repeated setPointerCapture calls on the capturing element</title>
      3 <meta name="variant" content="?mouse">
      4 <meta name="variant" content="?pen">
      5 <meta name="variant" content="?touch">
      6 <link rel="help" href="https://github.com/w3c/pointerevents/issues/534">
      7 <meta name="viewport" content="width=device-width">
      8 <script src="/resources/testharness.js"></script>
      9 <script src="/resources/testharnessreport.js"></script>
     10 <script src="/resources/testdriver.js"></script>
     11 <script src="/resources/testdriver-actions.js"></script>
     12 <script src="/resources/testdriver-vendor.js"></script>
     13 <script src="pointerevent_support.js"></script>
     14 
     15 <style>
     16  div {
     17    width: 50px;
     18    height: 50px;
     19    touch-action: none;
     20    user-select: none;
     21  }
     22 </style>
     23 
     24 <div id="target"></div>
     25 <div id="other"></div>
     26 <div id="done"></div>
     27 
     28 <script>
     29  'use strict';
     30  const pointer_type = location.search.substring(1);
     31 
     32  const target = document.getElementById("target");
     33  const other = document.getElementById("other");
     34  const done = document.getElementById("done");
     35 
     36  let event_log = [];
     37  function logEvent(e) {
     38    if (e.type === "pointermove" && e.buttons == 0) {
     39      // Move events w/o button pressed are irrelevant, and could be noisy too.
     40      return;
     41    }
     42    event_log.push(e.type + "@" + e.target.id);
     43  }
     44 
     45  const logged_events = [
     46    "pointerdown", "pointermove", "pointerup", "gotpointercapture", "lostpointercapture"
     47  ];
     48  logged_events.forEach(ename => {
     49    [target, other].forEach(div => div.addEventListener(ename, logEvent));
     50  });
     51 
     52  target.addEventListener("pointerdown", e => {
     53    other.setPointerCapture(e.pointerId);
     54  });
     55 
     56  const expected_events = [
     57    "pointerdown@target", "gotpointercapture@other",
     58    "pointermove@other", "pointerup@other",
     59    "lostpointercapture@other"
     60  ];
     61 
     62  promise_test(async () => {
     63    event_log = [];
     64 
     65    target.addEventListener("pointermove", e => {
     66      target.setPointerCapture(e.pointerId);
     67    });
     68 
     69    let done_click_promise = getEvent("click", done);
     70 
     71    let actions = new test_driver.Actions()
     72        .addPointer("TestPointer", pointer_type)
     73        .pointerMove(0, 0, {origin: target})
     74        .pointerDown()
     75        .pointerMove(10, 10, {origin: target})
     76        .pointerUp()
     77        .pointerMove(0, 0, {origin: done})
     78        .pointerDown()
     79        .pointerUp();
     80 
     81    await actions.send();
     82    await done_click_promise;
     83 
     84    assert_array_equals(event_log, expected_events, "events received");
     85  }, "A repeated setPointerCapture call does not redispatch capture events");
     86 
     87  promise_test(async () => {
     88    event_log = [];
     89 
     90    target.addEventListener("pointermove", e => {
     91      try {
     92        // Pick a non-existent random pointerId to force this call to fail.
     93        other.setPointerCapture(e.pointerId + 4321);
     94      } catch (error) {}
     95    });
     96 
     97    let done_click_promise = getEvent("click", done);
     98 
     99    let actions = new test_driver.Actions()
    100        .addPointer("TestPointer", pointer_type)
    101        .pointerMove(0, 0, {origin: target})
    102        .pointerDown()
    103        .pointerMove(10, 10, {origin: target})
    104        .pointerUp()
    105        .pointerMove(0, 0, {origin: done})
    106        .pointerDown()
    107        .pointerUp();
    108 
    109    await actions.send();
    110    await done_click_promise;
    111 
    112    assert_array_equals(event_log, expected_events, "events received");
    113  }, "A failed setPointerCapture call does not affect existing capture");
    114 </script>