Parcourir la source

LibWeb: Convert DOM::Element::m_classes to the new AK::FlyString

This makes selector matching significantly faster by not forcing us to
convert from FlyString to DeprecatedFlyString when matching class
selectors. :^)
Andreas Kling il y a 2 ans
Parent
commit
2042993997

+ 1 - 1
Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp

@@ -354,7 +354,7 @@ static inline bool matches(CSS::Selector::SimpleSelector const& component, DOM::
     case CSS::Selector::SimpleSelector::Type::Id:
         return component.name() == element.attribute(HTML::AttributeNames::id).view();
     case CSS::Selector::SimpleSelector::Type::Class:
-        return element.has_class(component.name().bytes_as_string_view());
+        return element.has_class(component.name());
     case CSS::Selector::SimpleSelector::Type::TagName:
         // See https://html.spec.whatwg.org/multipage/semantics-other.html#case-sensitivity-of-selectors
         if (element.document().document_type() == DOM::Document::Type::HTML)

+ 2 - 2
Userland/Libraries/LibWeb/DOM/Document.cpp

@@ -1030,9 +1030,9 @@ JS::NonnullGCPtr<HTMLCollection> Document::get_elements_by_name(DeprecatedString
 
 JS::NonnullGCPtr<HTMLCollection> Document::get_elements_by_class_name(DeprecatedFlyString const& class_names)
 {
-    Vector<DeprecatedFlyString> list_of_class_names;
+    Vector<FlyString> list_of_class_names;
     for (auto& name : class_names.view().split_view(' ')) {
-        list_of_class_names.append(name);
+        list_of_class_names.append(FlyString::from_utf8(name).release_value_but_fixme_should_propagate_errors());
     }
     return HTMLCollection::create(*this, [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) {

+ 5 - 5
Userland/Libraries/LibWeb/DOM/Element.cpp

@@ -271,7 +271,7 @@ Vector<DeprecatedString> Element::get_attribute_names() const
     return names;
 }
 
-bool Element::has_class(DeprecatedFlyString const& class_name, CaseSensitivity case_sensitivity) const
+bool Element::has_class(FlyString const& class_name, CaseSensitivity case_sensitivity) const
 {
     if (case_sensitivity == CaseSensitivity::CaseSensitive) {
         return any_of(m_classes, [&](auto& it) {
@@ -279,7 +279,7 @@ bool Element::has_class(DeprecatedFlyString const& class_name, CaseSensitivity c
         });
     } else {
         return any_of(m_classes, [&](auto& it) {
-            return it.equals_ignoring_case(class_name);
+            return it.equals_ignoring_ascii_case(class_name);
         });
     }
 }
@@ -347,7 +347,7 @@ void Element::parse_attribute(DeprecatedFlyString const& name, DeprecatedString
         m_classes.clear();
         m_classes.ensure_capacity(new_classes.size());
         for (auto& new_class : new_classes) {
-            m_classes.unchecked_append(new_class);
+            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);
@@ -580,9 +580,9 @@ bool Element::is_active() const
 
 JS::NonnullGCPtr<HTMLCollection> Element::get_elements_by_class_name(DeprecatedFlyString const& class_names)
 {
-    Vector<DeprecatedFlyString> list_of_class_names;
+    Vector<FlyString> list_of_class_names;
     for (auto& name : class_names.view().split_view_if(Infra::is_ascii_whitespace)) {
-        list_of_class_names.append(name);
+        list_of_class_names.append(FlyString::from_utf8(name).release_value_but_fixme_should_propagate_errors());
     }
     return HTMLCollection::create(*this, [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) {

+ 3 - 3
Userland/Libraries/LibWeb/DOM/Element.h

@@ -101,8 +101,8 @@ public:
         }
     }
 
-    bool has_class(DeprecatedFlyString const&, CaseSensitivity = CaseSensitivity::CaseSensitive) const;
-    Vector<DeprecatedFlyString> const& class_names() const { return m_classes; }
+    bool has_class(FlyString const&, CaseSensitivity = CaseSensitivity::CaseSensitive) const;
+    Vector<FlyString> const& class_names() const { return m_classes; }
 
     virtual void apply_presentational_hints(CSS::StyleProperties&) const { }
     virtual void parse_attribute(DeprecatedFlyString const& name, DeprecatedString const& value);
@@ -284,7 +284,7 @@ private:
     RefPtr<CSS::StyleProperties> m_computed_css_values;
     HashMap<DeprecatedFlyString, CSS::StyleProperty> m_custom_properties;
 
-    Vector<DeprecatedFlyString> m_classes;
+    Vector<FlyString> m_classes;
 
     Array<JS::GCPtr<Layout::Node>, to_underlying(CSS::Selector::PseudoElement::PseudoElementCount)> m_pseudo_element_nodes;
 };