LibWeb: Prevent default on pointerdown/mousedown should skip focus steps

Fixes a bug in the ChatGPT model dropdown where clicking it immediately
closes the menu because focus is being stolen.
This commit is contained in:
Aliaksandr Kalenik 2025-11-21 01:59:17 +01:00 committed by Andreas Kling
parent d5d37abfa5
commit 2a18b6b802
Notes: github-actions[bot] 2025-11-21 07:32:06 +00:00
3 changed files with 46 additions and 2 deletions

View file

@ -667,8 +667,10 @@ EventResult EventHandler::handle_mousedown(CSSPixelPoint visual_viewport_positio
auto offset = compute_mouse_event_offset(page_offset, *layout_node->first_paintable());
auto pointer_event = UIEvents::PointerEvent::create_from_platform_event(node->realm(), m_navigable->active_window_proxy(), UIEvents::EventNames::pointerdown, screen_position, page_offset, viewport_position, offset, {}, button, buttons, modifiers).release_value_but_fixme_should_propagate_errors();
light_dismiss_activities(pointer_event, node);
node->dispatch_event(pointer_event);
node->dispatch_event(UIEvents::MouseEvent::create_from_platform_event(node->realm(), m_navigable->active_window_proxy(), UIEvents::EventNames::mousedown, screen_position, page_offset, viewport_position, offset, {}, button, buttons, modifiers).release_value_but_fixme_should_propagate_errors());
if (!node->dispatch_event(pointer_event))
return EventResult::Cancelled;
if (!node->dispatch_event(UIEvents::MouseEvent::create_from_platform_event(node->realm(), m_navigable->active_window_proxy(), UIEvents::EventNames::mousedown, screen_position, page_offset, viewport_position, offset, {}, button, buttons, modifiers).release_value_but_fixme_should_propagate_errors()))
return EventResult::Cancelled;
}
// NOTE: Dispatching an event may have disturbed the world.

View file

@ -0,0 +1,4 @@
pointerdown
pointerup
mouseup
click

View file

@ -0,0 +1,38 @@
<!DOCTYPE html>
<button id="test-button" style="width: 100px; height: 100px">Test button</button>
<script src="include.js"></script>
<script>
asyncTest(done => {
const button = document.getElementById("test-button");
const eventsToLog = [
"mousedown",
"mouseup",
"click",
"dblclick",
"pointerdown",
"pointerup",
"focus",
"blur",
"focusin",
"focusout",
];
eventsToLog.forEach(type => {
button.addEventListener(type, event => {
if (type === "pointerdown" || type === "mousedown") event.preventDefault();
println(`${type}`, {
key: event.key,
code: event.code,
button: event.button,
pointerType: event.pointerType,
eventPhase: event.eventPhase,
timeStamp: event.timeStamp,
});
if (type === "click") done();
});
});
internals.click(50, 50);
});
</script>