From 9a071c9e893689cd1b3a8a97a4ff9c7bb1eac816 Mon Sep 17 00:00:00 2001 From: Khaled Lakehal Date: Mon, 26 May 2025 09:34:12 +0200 Subject: [PATCH] LibWeb/HTML: Fix behavior when removing `multiple` from select element This change ensures correct behavior when the `multiple` attribute is removed from a `select` element, reducing the number of selected `option` elements to one. Fixes a failing WPT test: https://wpt.live/html/semantics/forms/the-select-element/select-multiple.html --- Libraries/LibWeb/HTML/HTMLSelectElement.cpp | 10 ++++++++++ Libraries/LibWeb/HTML/HTMLSelectElement.h | 1 + .../forms/the-select-element/select-multiple.txt | 5 ++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Libraries/LibWeb/HTML/HTMLSelectElement.cpp b/Libraries/LibWeb/HTML/HTMLSelectElement.cpp index 87fdf1ac5df..d4854f24030 100644 --- a/Libraries/LibWeb/HTML/HTMLSelectElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLSelectElement.cpp @@ -574,6 +574,16 @@ void HTMLSelectElement::form_associated_element_was_inserted() create_shadow_tree_if_needed(); } +void HTMLSelectElement::form_associated_element_attribute_changed(FlyString const& name, Optional const& value, Optional const&) +{ + if (name == HTML::AttributeNames::multiple) { + // If the multiple attribute is absent then update the selectedness of the option elements. + if (!value.has_value()) { + update_selectedness(); + } + } +} + void HTMLSelectElement::computed_properties_changed() { // Hide chevron icon when appearance is none diff --git a/Libraries/LibWeb/HTML/HTMLSelectElement.h b/Libraries/LibWeb/HTML/HTMLSelectElement.h index f43abea356a..8f7aad95e65 100644 --- a/Libraries/LibWeb/HTML/HTMLSelectElement.h +++ b/Libraries/LibWeb/HTML/HTMLSelectElement.h @@ -98,6 +98,7 @@ public: virtual void activation_behavior(DOM::Event const&) override; virtual void form_associated_element_was_inserted() override; + virtual void form_associated_element_attribute_changed(FlyString const&, Optional const&, Optional const&) override; void did_select_item(Optional const& id); diff --git a/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/the-select-element/select-multiple.txt b/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/the-select-element/select-multiple.txt index 96371cc2c98..ab20a8330e2 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/the-select-element/select-multiple.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/html/semantics/forms/the-select-element/select-multiple.txt @@ -2,8 +2,7 @@ Harness status: OK Found 3 tests -2 Pass -1 Fail +3 Pass Pass multiple selected options exist, both set from markup Pass multiple selected options exist, one set from script -Fail Removing multiple attribute reduces the number of selected OPTIONs to 1 \ No newline at end of file +Pass Removing multiple attribute reduces the number of selected OPTIONs to 1 \ No newline at end of file