From c00c0846c0b82135496541f1c9c8b335764fb8df Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 15 Apr 2025 12:01:07 +0100 Subject: [PATCH] LibWeb: Don't double-dispatch click events on a label's child input If the user clicked directly on the input inside a label, then it already received a click event. Dispatching a second one via the label is redundant, and means that if the input is a checkbox, it gets its value toggled twice. --- Libraries/LibWeb/Page/EventHandler.cpp | 2 +- ...ox-inside-label-element-not-duplicated.txt | 2 + ...x-inside-label-element-not-duplicated.html | 51 +++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Text/expected/UIEvents/click-event-on-checkbox-inside-label-element-not-duplicated.txt create mode 100644 Tests/LibWeb/Text/input/UIEvents/click-event-on-checkbox-inside-label-element-not-duplicated.html diff --git a/Libraries/LibWeb/Page/EventHandler.cpp b/Libraries/LibWeb/Page/EventHandler.cpp index 0b694386f3c..9a3b2ae2839 100644 --- a/Libraries/LibWeb/Page/EventHandler.cpp +++ b/Libraries/LibWeb/Page/EventHandler.cpp @@ -555,7 +555,7 @@ EventResult EventHandler::handle_mouseup(CSSPixelPoint viewport_position, CSSPix } if (auto* input_control = input_control_associated_with_ancestor_label_element(*paintable)) { - if (button == UIEvents::MouseButton::Primary) { + if (button == UIEvents::MouseButton::Primary && input_control != node) { input_control->dispatch_event(UIEvents::MouseEvent::create_from_platform_event(node->realm(), UIEvents::EventNames::click, screen_position, page_offset, viewport_position, offset, {}, button, buttons, modifiers).release_value_but_fixme_should_propagate_errors()); } } diff --git a/Tests/LibWeb/Text/expected/UIEvents/click-event-on-checkbox-inside-label-element-not-duplicated.txt b/Tests/LibWeb/Text/expected/UIEvents/click-event-on-checkbox-inside-label-element-not-duplicated.txt new file mode 100644 index 00000000000..062e0983fb7 --- /dev/null +++ b/Tests/LibWeb/Text/expected/UIEvents/click-event-on-checkbox-inside-label-element-not-duplicated.txt @@ -0,0 +1,2 @@ +click event on input#radio1 +click event on input#radio2 diff --git a/Tests/LibWeb/Text/input/UIEvents/click-event-on-checkbox-inside-label-element-not-duplicated.html b/Tests/LibWeb/Text/input/UIEvents/click-event-on-checkbox-inside-label-element-not-duplicated.html new file mode 100644 index 00000000000..ecba85e0e49 --- /dev/null +++ b/Tests/LibWeb/Text/input/UIEvents/click-event-on-checkbox-inside-label-element-not-duplicated.html @@ -0,0 +1,51 @@ + + + + + +
+ + + +
+ + +