1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 01:17:34 +00:00

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. :^)
This commit is contained in:
Andreas Kling 2023-03-07 19:54:01 +01:00
parent 629b6462dc
commit 2042993997
4 changed files with 11 additions and 11 deletions

View file

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

View file

@ -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) 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(' ')) { 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) { 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) { for (auto& name : list_of_class_names) {

View file

@ -271,7 +271,7 @@ Vector<DeprecatedString> Element::get_attribute_names() const
return names; 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) { if (case_sensitivity == CaseSensitivity::CaseSensitive) {
return any_of(m_classes, [&](auto& it) { return any_of(m_classes, [&](auto& it) {
@ -279,7 +279,7 @@ bool Element::has_class(DeprecatedFlyString const& class_name, CaseSensitivity c
}); });
} else { } else {
return any_of(m_classes, [&](auto& it) { 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.clear();
m_classes.ensure_capacity(new_classes.size()); m_classes.ensure_capacity(new_classes.size());
for (auto& new_class : new_classes) { 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) if (m_class_list)
m_class_list->associated_attribute_changed(value); 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) 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)) { 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) { 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) { for (auto& name : list_of_class_names) {

View file

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