Ver código fonte

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.
Linus Groh 4 anos atrás
pai
commit
2a38f008bf

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

+ 6 - 2
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()

+ 1 - 1
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 { }