Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!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>