Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test has a WPT meta file that expects 1 subtest issues.
 - This WPT test may be referenced by the following Test IDs:
            
- /pointerevents/bugs/events_after_lostpointercapture_remove_setcapture_node.html - WPT Dashboard Interop Dashboard
 
 
<!doctype html>
<html>
    <head>
        <title>Lostpointercapture removing new capture element prevents the new capture</title>
        <meta name="viewport" content="width=device-width">
        <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="/resources/testdriver.js"></script>
        <script src="/resources/testdriver-actions.js"></script>
        <script src="/resources/testdriver-vendor.js"></script>
        <script src="../pointerevent_support.js"></script>
    </head>
    <body>
        <input type="button" id="button" value="Set Capture"><br>
        <div id="target0"></div>
        <div id="target1"></div>
        <script type='text/javascript'>
          "use strict";
          let target0 = document.getElementById('target0');
          let target1 = document.getElementById('target1');
          let captureButton = document.getElementById('button');
          let targets = [target0, target1, captureButton];
          promise_test(async (test) => {
            captureButton.focus();
            let events = [];
            let logEvent = event => events.push(`${event.type}@${event.target.id}`);
            document.addEventListener('lostpointercapture', logEvent);
            for (const target of targets) {
              target.addEventListener('lostpointercapture', logEvent);
              target.addEventListener('pointerup', logEvent);
            }
            let finishPromise = getEvent('pointerup', captureButton, test);
            getEvent('pointerdown', captureButton, test).then((event) => {
              target0.setPointerCapture(event.pointerId);
            });
            // On the first captured move, we'll set capture to target1.
            getEvent('pointermove', target0, test).then((event) => {
              target1.setPointerCapture(event.pointerId);
            });
            // But remove the new capture target when we lose capture.
            getEvent('lostpointercapture', target0, test).then((event) => {
              target1.remove();
            });
            // Inject mouse inputs.
            new test_driver.Actions()
                .pointerMove(0, 0, {origin: captureButton})
                .pointerDown()
                .pointerMove(10, 0, {origin: captureButton})
                .pointerUp()
                .pointerDown()
                .pointerUp()
                .send();
            await finishPromise;
            // TODO(crbug.com/40942362): Blink shows two bugs for this test:
            // - sends the pointerup to deleted target1, and
            // - sends lostpointercapture to target0 twice only when the document
            //   event listener above is present.
            assert_equals(events.join(", "), [
              "lostpointercapture@target0", "pointerup@button", "pointerup@button"
            ].join(", "));
          }, "setPointerCapture target removed by lostpointercapture");
        </script>
    </body>
</html>