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;
});
}