ソースを参照

LibWeb: Don't filter CSS rules into separate list based on @namespace

Instead, perform the filtering for each rule as we go. This avoids
creating a separate list of rules, which was ~5% of runtime when
mousing around on the Discord web interface.
Andreas Kling 1 年間 前
コミット
cf9565551a

+ 13 - 20
Userland/Libraries/LibWeb/CSS/StyleComputer.cpp

@@ -220,23 +220,14 @@ StyleComputer::RuleCache const& StyleComputer::rule_cache_for_cascade_origin(Cas
     }
     }
 }
 }
 
 
-Vector<MatchingRule> StyleComputer::filter_namespace_rules(DOM::Element const& element, Vector<MatchingRule> const& rules) const
+[[nodiscard]] static bool filter_namespace_rule(DOM::Element const& element, MatchingRule const& rule)
 {
 {
-    Vector<MatchingRule> filtered_rules;
-
-    for (auto const& rule : rules) {
-        auto namespace_uri = rule.sheet->default_namespace();
-        if (namespace_uri.has_value()) {
-            if (namespace_uri.value() == element.namespace_uri())
-                filtered_rules.append(rule);
-        } else {
-            filtered_rules.append(rule);
-        }
-    }
-
     // FIXME: Filter out non-default namespace using prefixes
     // FIXME: Filter out non-default namespace using prefixes
-
-    return filtered_rules;
+    auto namespace_uri = rule.sheet->default_namespace();
+    if (namespace_uri.has_value() && namespace_uri.value() != element.namespace_uri()) {
+        return false;
+    }
+    return true;
 }
 }
 
 
 Vector<MatchingRule> StyleComputer::collect_matching_rules(DOM::Element const& element, CascadeOrigin cascade_origin, Optional<CSS::Selector::PseudoElement> pseudo_element) const
 Vector<MatchingRule> StyleComputer::collect_matching_rules(DOM::Element const& element, CascadeOrigin cascade_origin, Optional<CSS::Selector::PseudoElement> pseudo_element) const
@@ -245,15 +236,17 @@ Vector<MatchingRule> StyleComputer::collect_matching_rules(DOM::Element const& e
 
 
     Vector<MatchingRule> rules_to_run;
     Vector<MatchingRule> rules_to_run;
     auto add_rules_to_run = [&](Vector<MatchingRule> const& rules) {
     auto add_rules_to_run = [&](Vector<MatchingRule> const& rules) {
-        Vector<MatchingRule> namespace_filtered_rules = filter_namespace_rules(element, rules);
-
+        rules_to_run.grow_capacity(rules_to_run.size() + rules.size());
         if (pseudo_element.has_value()) {
         if (pseudo_element.has_value()) {
-            for (auto& rule : namespace_filtered_rules) {
-                if (rule.contains_pseudo_element)
+            for (auto const& rule : rules) {
+                if (rule.contains_pseudo_element && filter_namespace_rule(element, rule))
                     rules_to_run.append(rule);
                     rules_to_run.append(rule);
             }
             }
         } else {
         } else {
-            rules_to_run.extend(namespace_filtered_rules);
+            for (auto const& rule : rules) {
+                if (filter_namespace_rule(element, rule))
+                    rules_to_run.append(rule);
+            }
         }
         }
     };
     };
 
 

+ 0 - 2
Userland/Libraries/LibWeb/CSS/StyleComputer.h

@@ -174,8 +174,6 @@ private:
     void build_rule_cache();
     void build_rule_cache();
     void build_rule_cache_if_needed() const;
     void build_rule_cache_if_needed() const;
 
 
-    Vector<MatchingRule> filter_namespace_rules(DOM::Element const&, Vector<MatchingRule> const&) const;
-
     JS::NonnullGCPtr<DOM::Document> m_document;
     JS::NonnullGCPtr<DOM::Document> m_document;
 
 
     struct AnimationKeyFrameSet {
     struct AnimationKeyFrameSet {