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
This commit is contained in:
Khaled Lakehal 2025-05-26 09:34:12 +02:00 committed by Shannon Booth
commit 9a071c9e89
Notes: github-actions[bot] 2025-05-27 06:59:29 +00:00
3 changed files with 13 additions and 3 deletions

View file

@ -574,6 +574,16 @@ void HTMLSelectElement::form_associated_element_was_inserted()
create_shadow_tree_if_needed(); create_shadow_tree_if_needed();
} }
void HTMLSelectElement::form_associated_element_attribute_changed(FlyString const& name, Optional<String> const& value, Optional<FlyString> 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() void HTMLSelectElement::computed_properties_changed()
{ {
// Hide chevron icon when appearance is none // Hide chevron icon when appearance is none

View file

@ -98,6 +98,7 @@ public:
virtual void activation_behavior(DOM::Event const&) override; virtual void activation_behavior(DOM::Event const&) override;
virtual void form_associated_element_was_inserted() override; virtual void form_associated_element_was_inserted() override;
virtual void form_associated_element_attribute_changed(FlyString const&, Optional<String> const&, Optional<FlyString> const&) override;
void did_select_item(Optional<u32> const& id); void did_select_item(Optional<u32> const& id);

View file

@ -2,8 +2,7 @@ Harness status: OK
Found 3 tests Found 3 tests
2 Pass 3 Pass
1 Fail
Pass multiple selected options exist, both set from markup Pass multiple selected options exist, both set from markup
Pass multiple selected options exist, one set from script Pass multiple selected options exist, one set from script
Fail Removing multiple attribute reduces the number of selected OPTIONs to 1 Pass Removing multiple attribute reduces the number of selected OPTIONs to 1