LibWeb: Cache the qualified layer name in CSSRule

This makes cascade layer filtering take <2% of CPU time when loading
https://vercel.com instead of 30%.
This commit is contained in:
Andreas Kling 2024-09-07 11:45:50 +02:00 committed by Andreas Kling
commit 44e4ea3d7a
Notes: github-actions[bot] 2024-09-07 11:24:51 +00:00
4 changed files with 33 additions and 31 deletions

View file

@ -71,8 +71,7 @@ String CSSLayerBlockRule::serialized() const
FlyString CSSLayerBlockRule::internal_qualified_name(Badge<StyleComputer>) const FlyString CSSLayerBlockRule::internal_qualified_name(Badge<StyleComputer>) const
{ {
// TODO: Cache this? auto const& parent_name = parent_layer_internal_qualified_name();
auto parent_name = parent_layer_internal_qualified_name();
if (parent_name.is_empty()) if (parent_name.is_empty())
return m_name_internal; return m_name_internal;
return MUST(String::formatted("{}.{}", parent_name, m_name_internal)); return MUST(String::formatted("{}.{}", parent_name, m_name_internal));

View file

@ -42,10 +42,9 @@ String CSSLayerStatementRule::serialized() const
Vector<FlyString> CSSLayerStatementRule::internal_qualified_name_list(Badge<StyleComputer>) const Vector<FlyString> CSSLayerStatementRule::internal_qualified_name_list(Badge<StyleComputer>) const
{ {
// TODO: Cache these?
Vector<FlyString> qualified_layer_names; Vector<FlyString> qualified_layer_names;
auto qualified_parent_layer_name = parent_layer_internal_qualified_name(); auto const& qualified_parent_layer_name = parent_layer_internal_qualified_name();
if (qualified_parent_layer_name.is_empty()) if (qualified_parent_layer_name.is_empty())
return m_name_list; return m_name_list;

View file

@ -48,9 +48,9 @@ void CSSRule::set_parent_style_sheet(CSSStyleSheet* parent_style_sheet)
m_parent_style_sheet = parent_style_sheet; m_parent_style_sheet = parent_style_sheet;
} }
String CSSRule::parent_layer_internal_qualified_name() const FlyString const& CSSRule::parent_layer_internal_qualified_name() const
{ {
// TODO: Cache this? if (!m_cached_layer_name.has_value()) {
Vector<FlyString> layer_names; Vector<FlyString> layer_names;
for (auto* rule = parent_rule(); rule; rule = rule->parent_rule()) { for (auto* rule = parent_rule(); rule; rule = rule->parent_rule()) {
switch (rule->type()) { switch (rule->type()) {
@ -78,7 +78,9 @@ String CSSRule::parent_layer_internal_qualified_name() const
} }
} }
return MUST(String::join("."sv, layer_names.in_reverse())); m_cached_layer_name = MUST(String::join("."sv, layer_names.in_reverse()));
}
return m_cached_layer_name.value();
} }
} }

View file

@ -58,10 +58,12 @@ protected:
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;
String parent_layer_internal_qualified_name() const; FlyString const& parent_layer_internal_qualified_name() const;
JS::GCPtr<CSSRule> m_parent_rule; JS::GCPtr<CSSRule> m_parent_rule;
JS::GCPtr<CSSStyleSheet> m_parent_style_sheet; JS::GCPtr<CSSStyleSheet> m_parent_style_sheet;
mutable Optional<FlyString> m_cached_layer_name;
}; };
} }