summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2021-02-08 01:06:20 +0100
committerAndreas Kling <kling@serenityos.org>2021-02-08 17:59:04 +0100
commit2a38f008bf95989e2d70cf7160b92d3fe5e2da71 (patch)
tree681fdfb14b0f5844ab986f182e386d6b8fae984e
parent5a9094a70a89204c9c7b3efcc3bef8a4532b356f (diff)
downloadserenity-2a38f008bf95989e2d70cf7160b92d3fe5e2da71.zip
LibWeb: Make getElementsByClassName() case-insensitive in quirks mode
From https://dom.spec.whatwg.org/#concept-getelementsbyclassname: The comparisons for the classes must be done in an ASCII case- insensitive manner if root’s node document’s mode is "quirks", and in an identical to manner otherwise.
-rw-r--r--Userland/Libraries/LibWeb/DOM/Document.cpp2
-rw-r--r--Userland/Libraries/LibWeb/DOM/Element.cpp8
-rw-r--r--Userland/Libraries/LibWeb/DOM/Element.h2
3 files changed, 8 insertions, 4 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/Document.cpp b/Userland/Libraries/LibWeb/DOM/Document.cpp
index d636e90d40..cb648297d2 100644
--- a/Userland/Libraries/LibWeb/DOM/Document.cpp
+++ b/Userland/Libraries/LibWeb/DOM/Document.cpp
@@ -505,7 +505,7 @@ NonnullRefPtrVector<Element> Document::get_elements_by_class_name(const FlyStrin
{
NonnullRefPtrVector<Element> elements;
for_each_in_subtree_of_type<Element>([&](auto& element) {
- if (element.has_class(class_name))
+ if (element.has_class(class_name, in_quirks_mode() ? CaseSensitivity::CaseInsensitive : CaseSensitivity::CaseSensitive))
elements.append(element);
return IterationDecision::Continue;
});
diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp
index 8381a88585..a9896f386c 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.cpp
+++ b/Userland/Libraries/LibWeb/DOM/Element.cpp
@@ -103,9 +103,13 @@ void Element::remove_attribute(const FlyString& name)
m_attributes.remove_first_matching([&](auto& attribute) { return attribute.name() == name; });
}
-bool Element::has_class(const FlyString& class_name) const
+bool Element::has_class(const FlyString& class_name, CaseSensitivity case_sensitivity) const
{
- return any_of(m_classes.begin(), m_classes.end(), [&](auto& it) { return it == class_name; });
+ return any_of(m_classes.begin(), m_classes.end(), [&](auto& it) {
+ return case_sensitivity == CaseSensitivity::CaseSensitive
+ ? it == class_name
+ : it.to_lowercase() == class_name.to_lowercase();
+ });
}
RefPtr<Layout::Node> Element::create_layout_node()
diff --git a/Userland/Libraries/LibWeb/DOM/Element.h b/Userland/Libraries/LibWeb/DOM/Element.h
index ae5c53f16a..c442d183ae 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.h
+++ b/Userland/Libraries/LibWeb/DOM/Element.h
@@ -73,7 +73,7 @@ public:
callback(attribute.name(), attribute.value());
}
- bool has_class(const FlyString&) const;
+ bool has_class(const FlyString&, CaseSensitivity = CaseSensitivity::CaseSensitive) const;
const Vector<FlyString>& class_names() const { return m_classes; }
virtual void apply_presentational_hints(CSS::StyleProperties&) const { }