Skip to content

Commit 2a18b6b

Browse files
kalenikaliaksandrawesomekling
authored andcommitted
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.
1 parent d5d37ab commit 2a18b6b

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

Libraries/LibWeb/Page/EventHandler.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -667,8 +667,10 @@ EventResult EventHandler::handle_mousedown(CSSPixelPoint visual_viewport_positio
667667
auto offset = compute_mouse_event_offset(page_offset, *layout_node->first_paintable());
668668
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();
669669
light_dismiss_activities(pointer_event, node);
670-
node->dispatch_event(pointer_event);
671-
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());
670+
if (!node->dispatch_event(pointer_event))
671+
return EventResult::Cancelled;
672+
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()))
673+
return EventResult::Cancelled;
672674
}
673675

674676
// NOTE: Dispatching an event may have disturbed the world.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
pointerdown
2+
pointerup
3+
mouseup
4+
click
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<!DOCTYPE html>
2+
<button id="test-button" style="width: 100px; height: 100px">Test button</button>
3+
<script src="include.js"></script>
4+
<script>
5+
asyncTest(done => {
6+
const button = document.getElementById("test-button");
7+
8+
const eventsToLog = [
9+
"mousedown",
10+
"mouseup",
11+
"click",
12+
"dblclick",
13+
"pointerdown",
14+
"pointerup",
15+
"focus",
16+
"blur",
17+
"focusin",
18+
"focusout",
19+
];
20+
21+
eventsToLog.forEach(type => {
22+
button.addEventListener(type, event => {
23+
if (type === "pointerdown" || type === "mousedown") event.preventDefault();
24+
println(`${type}`, {
25+
key: event.key,
26+
code: event.code,
27+
button: event.button,
28+
pointerType: event.pointerType,
29+
eventPhase: event.eventPhase,
30+
timeStamp: event.timeStamp,
31+
});
32+
if (type === "click") done();
33+
});
34+
});
35+
36+
internals.click(50, 50);
37+
});
38+
</script>

0 commit comments

Comments
 (0)