summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-03-13 16:28:20 +0100
committerAndreas Kling <kling@serenityos.org>2022-03-13 18:09:43 +0100
commitf88d65d9cb225b563c637aa2fc21edb666f5d056 (patch)
tree5adfad60f0a7d40dc0ea2084963f32274615ca85 /Userland/Libraries
parentf5c2e87965d8e3eab783228f6045efe8838a035c (diff)
downloadserenity-f88d65d9cb225b563c637aa2fc21edb666f5d056.zip
LibWeb: Cache CSS::Selector's pseudo element at construction time
Computing the pseudo element of a CSS::Selector was very hot when mousing around on GitHub in Browser. A profile had it at ~10%. After these changes, it's totally gone from the profile. :^)
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibWeb/CSS/Selector.cpp23
-rw-r--r--Userland/Libraries/LibWeb/CSS/Selector.h3
2 files changed, 12 insertions, 14 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/Selector.cpp b/Userland/Libraries/LibWeb/CSS/Selector.cpp
index a81edfe313..14bac1c4e3 100644
--- a/Userland/Libraries/LibWeb/CSS/Selector.cpp
+++ b/Userland/Libraries/LibWeb/CSS/Selector.cpp
@@ -13,25 +13,22 @@ namespace Web::CSS {
Selector::Selector(Vector<CompoundSelector>&& compound_selectors)
: m_compound_selectors(move(compound_selectors))
{
+ // Note: This assumes that only one pseudo-element is allowed in a selector, and that it appears at the end.
+ // This is true currently, and there are no current proposals to change this, but you never know!
+ if (!m_compound_selectors.is_empty()) {
+ for (auto const& simple_selector : m_compound_selectors.last().simple_selectors) {
+ if (simple_selector.type == SimpleSelector::Type::PseudoElement) {
+ m_pseudo_element = simple_selector.pseudo_element;
+ break;
+ }
+ }
+ }
}
Selector::~Selector()
{
}
-Optional<Selector::PseudoElement> Selector::pseudo_element() const
-{
- // Note: This assumes that only one pseudo-element is allowed in a selector, and that it appears at the end.
- // This is true currently, and there are no current proposals to change this, but you never know!
- if (compound_selectors().is_empty())
- return {};
- for (auto const& simple_selector : compound_selectors().last().simple_selectors) {
- if (simple_selector.type == SimpleSelector::Type::PseudoElement)
- return simple_selector.pseudo_element;
- }
- return {};
-}
-
// https://www.w3.org/TR/selectors-4/#specificity-rules
u32 Selector::specificity() const
{
diff --git a/Userland/Libraries/LibWeb/CSS/Selector.h b/Userland/Libraries/LibWeb/CSS/Selector.h
index 9ee035730f..8d05b6e312 100644
--- a/Userland/Libraries/LibWeb/CSS/Selector.h
+++ b/Userland/Libraries/LibWeb/CSS/Selector.h
@@ -135,7 +135,7 @@ public:
~Selector();
Vector<CompoundSelector> const& compound_selectors() const { return m_compound_selectors; }
- Optional<PseudoElement> pseudo_element() const;
+ Optional<PseudoElement> pseudo_element() const { return m_pseudo_element; }
u32 specificity() const;
String serialize() const;
@@ -144,6 +144,7 @@ private:
Vector<CompoundSelector> m_compound_selectors;
mutable Optional<u32> m_specificity;
+ Optional<Selector::PseudoElement> m_pseudo_element;
};
constexpr StringView pseudo_element_name(Selector::PseudoElement pseudo_element)