diff --git a/Tests/LibWeb/Text/expected/DOM/getElementsByClassName-empty-string.txt b/Tests/LibWeb/Text/expected/DOM/getElementsByClassName-empty-string.txt new file mode 100644 index 00000000000..732230c7f2a --- /dev/null +++ b/Tests/LibWeb/Text/expected/DOM/getElementsByClassName-empty-string.txt @@ -0,0 +1 @@ + document.getElementsByClassName("").length: 0 diff --git a/Tests/LibWeb/Text/input/DOM/getElementsByClassName-empty-string.html b/Tests/LibWeb/Text/input/DOM/getElementsByClassName-empty-string.html new file mode 100644 index 00000000000..3b804e515fe --- /dev/null +++ b/Tests/LibWeb/Text/input/DOM/getElementsByClassName-empty-string.html @@ -0,0 +1,8 @@ + + +
+ diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp index 85be7b80e48..8823003ac80 100644 --- a/Userland/Libraries/LibWeb/DOM/Element.cpp +++ b/Userland/Libraries/LibWeb/DOM/Element.cpp @@ -471,14 +471,18 @@ void Element::attribute_changed(FlyString const& name, Optional const&, document().element_name_changed({}, *this); } else if (name == HTML::AttributeNames::class_) { - auto new_classes = value_or_empty.bytes_as_string_view().split_view_if(Infra::is_ascii_whitespace); - m_classes.clear(); - m_classes.ensure_capacity(new_classes.size()); - for (auto& new_class : new_classes) { - m_classes.unchecked_append(FlyString::from_utf8(new_class).release_value_but_fixme_should_propagate_errors()); + if (value_or_empty.is_empty()) { + m_classes.clear(); + } else { + auto new_classes = value_or_empty.bytes_as_string_view().split_view_if(Infra::is_ascii_whitespace); + m_classes.clear(); + m_classes.ensure_capacity(new_classes.size()); + for (auto& new_class : new_classes) { + m_classes.unchecked_append(FlyString::from_utf8(new_class).release_value_but_fixme_should_propagate_errors()); + } + if (m_class_list) + m_class_list->associated_attribute_changed(value_or_empty); } - if (m_class_list) - m_class_list->associated_attribute_changed(value_or_empty); } else if (name == HTML::AttributeNames::style) { if (!value.has_value()) { if (m_inline_style) { diff --git a/Userland/Libraries/LibWeb/DOM/ParentNode.cpp b/Userland/Libraries/LibWeb/DOM/ParentNode.cpp index 28ec79d6bd5..8a017eed4f3 100644 --- a/Userland/Libraries/LibWeb/DOM/ParentNode.cpp +++ b/Userland/Libraries/LibWeb/DOM/ParentNode.cpp @@ -234,10 +234,10 @@ JS::NonnullGCPtr ParentNode::get_elements_by_class_name(StringVi } return HTMLCollection::create(*this, HTMLCollection::Scope::Descendants, [list_of_class_names = move(list_of_class_names), quirks_mode = document().in_quirks_mode()](Element const& element) { for (auto& name : list_of_class_names) { - if (!element.has_class(name, quirks_mode ? CaseSensitivity::CaseInsensitive : CaseSensitivity::CaseSensitive)) - return false; + if (element.has_class(name, quirks_mode ? CaseSensitivity::CaseInsensitive : CaseSensitivity::CaseSensitive)) + return true; } - return true; + return false; }); }