Title: [281742] trunk/Source/WebCore
Revision
281742
Author
[email protected]
Date
2021-08-29 06:52:20 -0700 (Sun, 29 Aug 2021)

Log Message

[CSS Cascade Layers] Factor RuleSet building into a Builder type
https://bugs.webkit.org/show_bug.cgi?id=229655

Reviewed by Alan Bujtas.

Factor build time state into a stack-allocate type.

* style/RuleSet.cpp:
(WebCore::Style::RuleSet::addRule):
(WebCore::Style::RuleSet::addRulesFromSheet):
(WebCore::Style::RuleSet::Builder::addChildRules):
(WebCore::Style::RuleSet::Builder::addRulesFromSheet):
(WebCore::Style::RuleSet::Builder::addStyleRule):
(WebCore::Style::RuleSet::Builder::pushCascadeLayer):
(WebCore::Style::RuleSet::Builder::popCascadeLayer):
(WebCore::Style::RuleSet::addChildRules): Deleted.
(WebCore::Style::RuleSet::addStyleRule): Deleted.
* style/RuleSet.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (281741 => 281742)


--- trunk/Source/WebCore/ChangeLog	2021-08-29 09:50:28 UTC (rev 281741)
+++ trunk/Source/WebCore/ChangeLog	2021-08-29 13:52:20 UTC (rev 281742)
@@ -1,3 +1,24 @@
+2021-08-29  Antti Koivisto  <[email protected]>
+
+        [CSS Cascade Layers] Factor RuleSet building into a Builder type
+        https://bugs.webkit.org/show_bug.cgi?id=229655
+
+        Reviewed by Alan Bujtas.
+
+        Factor build time state into a stack-allocate type.
+
+        * style/RuleSet.cpp:
+        (WebCore::Style::RuleSet::addRule):
+        (WebCore::Style::RuleSet::addRulesFromSheet):
+        (WebCore::Style::RuleSet::Builder::addChildRules):
+        (WebCore::Style::RuleSet::Builder::addRulesFromSheet):
+        (WebCore::Style::RuleSet::Builder::addStyleRule):
+        (WebCore::Style::RuleSet::Builder::pushCascadeLayer):
+        (WebCore::Style::RuleSet::Builder::popCascadeLayer):
+        (WebCore::Style::RuleSet::addChildRules): Deleted.
+        (WebCore::Style::RuleSet::addStyleRule): Deleted.
+        * style/RuleSet.h:
+
 2021-08-29  Philippe Normand  <[email protected]>
 
         [GStreamer] Track handling refactoring

Modified: trunk/Source/WebCore/style/RuleSet.cpp (281741 => 281742)


--- trunk/Source/WebCore/style/RuleSet.cpp	2021-08-29 09:50:28 UTC (rev 281741)
+++ trunk/Source/WebCore/style/RuleSet.cpp	2021-08-29 13:52:20 UTC (rev 281742)
@@ -83,15 +83,15 @@
     return leftmostSelector->match() == CSSSelector::PseudoClass && leftmostSelector->pseudoClassType() == CSSSelector::PseudoClassHost;
 }
 
-void RuleSet::addRule(const StyleRule& rule, unsigned selectorIndex, unsigned selectorListIndex, MediaQueryCollector* mediaQueryCollector)
+void RuleSet::addRule(const StyleRule& rule, unsigned selectorIndex, unsigned selectorListIndex, unsigned cascadeLayerOrder, MediaQueryCollector* mediaQueryCollector)
 {
     RuleData ruleData(rule, selectorIndex, selectorListIndex, m_ruleCount++);
 
-    if (m_cascadeLayerOrder) {
+    if (cascadeLayerOrder) {
         auto oldSize = m_cascadeLayerOrderForPosition.size();
         m_cascadeLayerOrderForPosition.grow(m_ruleCount);
         std::fill(m_cascadeLayerOrderForPosition.begin() + oldSize, m_cascadeLayerOrderForPosition.end(), 0);
-        m_cascadeLayerOrderForPosition.last() = m_cascadeLayerOrder;
+        m_cascadeLayerOrderForPosition.last() = cascadeLayerOrder;
     }
 
     m_features.collectFeatures(ruleData);
@@ -271,26 +271,65 @@
     m_pageRules.append(&rule);
 }
 
-void RuleSet::addChildRules(const Vector<RefPtr<StyleRuleBase>>& rules, MediaQueryCollector& mediaQueryCollector, Resolver* resolver, AddRulesMode mode)
+void RuleSet::addRulesFromSheet(const StyleSheetContents& sheet, const MediaQueryEvaluator& evaluator)
 {
+    Builder builder { *this, MediaQueryCollector { evaluator } };
+    builder.addRulesFromSheet(sheet);
+
+    if (m_autoShrinkToFitEnabled)
+        shrinkToFit();
+}
+
+void RuleSet::addRulesFromSheet(const StyleSheetContents& sheet, const MediaQuerySet* sheetQuery, const MediaQueryEvaluator& evaluator, Style::Resolver& resolver)
+{
+    auto canUseDynamicMediaQueryResolution = [&] {
+        Builder builder { *this, MediaQueryCollector { evaluator, true }, nullptr, Builder::Mode::ResolverMutationScan };
+        if (builder.mediaQueryCollector.pushAndEvaluate(sheetQuery))
+            builder.addRulesFromSheet(sheet);
+        builder.mediaQueryCollector.pop(sheetQuery);
+        return !builder.mediaQueryCollector.didMutateResolverWithinDynamicMediaQuery;
+    }();
+
+    Builder builder { *this, MediaQueryCollector { evaluator, canUseDynamicMediaQueryResolution }, &resolver };
+
+    if (builder.mediaQueryCollector.pushAndEvaluate(sheetQuery))
+        builder.addRulesFromSheet(sheet);
+    builder.mediaQueryCollector.pop(sheetQuery);
+
+    m_hasViewportDependentMediaQueries = builder.mediaQueryCollector.hasViewportDependentMediaQueries;
+
+    if (!builder.mediaQueryCollector.dynamicMediaQueryRules.isEmpty()) {
+        auto firstNewIndex = m_dynamicMediaQueryRules.size();
+        m_dynamicMediaQueryRules.appendVector(WTFMove(builder.mediaQueryCollector.dynamicMediaQueryRules));
+
+        // Set the initial values.
+        evaluateDynamicMediaQueryRules(evaluator, firstNewIndex);
+    }
+
+    if (m_autoShrinkToFitEnabled)
+        shrinkToFit();
+}
+
+void RuleSet::Builder::addChildRules(const Vector<RefPtr<StyleRuleBase>>& rules)
+{
     for (auto& rule : rules) {
-        if (mode == AddRulesMode::ResolverMutationScan && mediaQueryCollector.didMutateResolverWithinDynamicMediaQuery)
+        if (mode == Mode::ResolverMutationScan && mediaQueryCollector.didMutateResolverWithinDynamicMediaQuery)
             break;
 
         if (is<StyleRule>(*rule)) {
-            if (mode == AddRulesMode::Normal)
-                addStyleRule(downcast<StyleRule>(*rule), mediaQueryCollector);
+            if (mode == Mode::Normal)
+                addStyleRule(downcast<StyleRule>(*rule));
             continue;
         }
         if (is<StyleRulePage>(*rule)) {
-            if (mode == AddRulesMode::Normal)
-                addPageRule(downcast<StyleRulePage>(*rule));
+            if (mode == Mode::Normal)
+                ruleSet->addPageRule(downcast<StyleRulePage>(*rule));
             continue;
         }
         if (is<StyleRuleMedia>(*rule)) {
             auto& mediaRule = downcast<StyleRuleMedia>(*rule);
             if (mediaQueryCollector.pushAndEvaluate(&mediaRule.mediaQueries()))
-                addChildRules(mediaRule.childRules(), mediaQueryCollector, resolver, mode);
+                addChildRules(mediaRule.childRules());
             mediaQueryCollector.pop(&mediaRule.mediaQueries());
             continue;
         }
@@ -306,7 +345,7 @@
             }
             // Block syntax.
             pushCascadeLayer(layerRule.name());
-            addChildRules(layerRule.childRules(), mediaQueryCollector, resolver, mode);
+            addChildRules(layerRule.childRules());
             popCascadeLayer(layerRule.name());
             continue;
         }
@@ -326,66 +365,27 @@
             continue;
         }
         if (is<StyleRuleSupports>(*rule) && downcast<StyleRuleSupports>(*rule).conditionIsSupported()) {
-            addChildRules(downcast<StyleRuleSupports>(*rule).childRules(), mediaQueryCollector, resolver, mode);
+            addChildRules(downcast<StyleRuleSupports>(*rule).childRules());
             continue;
         }
     }
 }
 
-void RuleSet::addRulesFromSheet(StyleSheetContents& sheet, const MediaQueryEvaluator& evaluator)
+void RuleSet::Builder::addRulesFromSheet(const StyleSheetContents& sheet)
 {
-    auto mediaQueryCollector = MediaQueryCollector { evaluator };
-    addRulesFromSheet(sheet, mediaQueryCollector, nullptr, AddRulesMode::Normal);
-
-    if (m_autoShrinkToFitEnabled)
-        shrinkToFit();
-}
-
-void RuleSet::addRulesFromSheet(StyleSheetContents& sheet, MediaQuerySet* sheetQuery, const MediaQueryEvaluator& evaluator, Style::Resolver& resolver)
-{
-    auto canUseDynamicMediaQueryResolution = [&] {
-        auto mediaQueryCollector = MediaQueryCollector { evaluator, true };
-        if (mediaQueryCollector.pushAndEvaluate(sheetQuery))
-            addRulesFromSheet(sheet, mediaQueryCollector, nullptr, AddRulesMode::ResolverMutationScan);
-        mediaQueryCollector.pop(sheetQuery);
-        return !mediaQueryCollector.didMutateResolverWithinDynamicMediaQuery;
-    }();
-
-    auto mediaQueryCollector = MediaQueryCollector { evaluator, canUseDynamicMediaQueryResolution };
-
-    if (mediaQueryCollector.pushAndEvaluate(sheetQuery))
-        addRulesFromSheet(sheet, mediaQueryCollector, &resolver, AddRulesMode::Normal);
-    mediaQueryCollector.pop(sheetQuery);
-
-    m_hasViewportDependentMediaQueries = mediaQueryCollector.hasViewportDependentMediaQueries;
-
-    if (!mediaQueryCollector.dynamicMediaQueryRules.isEmpty()) {
-        auto firstNewIndex = m_dynamicMediaQueryRules.size();
-        m_dynamicMediaQueryRules.appendVector(WTFMove(mediaQueryCollector.dynamicMediaQueryRules));
-
-        // Set the initial values.
-        evaluateDynamicMediaQueryRules(evaluator, firstNewIndex);
-    }
-
-    if (m_autoShrinkToFitEnabled)
-        shrinkToFit();
-}
-
-void RuleSet::addRulesFromSheet(StyleSheetContents& sheet, MediaQueryCollector& mediaQueryCollector, Resolver* resolver, AddRulesMode mode)
-{
     for (auto& rule : sheet.importRules()) {
         if (!rule->styleSheet())
             continue;
 
         if (mediaQueryCollector.pushAndEvaluate(rule->mediaQueries()))
-            addRulesFromSheet(*rule->styleSheet(), mediaQueryCollector, resolver, mode);
+            addRulesFromSheet(*rule->styleSheet());
         mediaQueryCollector.pop(rule->mediaQueries());
     }
 
-    addChildRules(sheet.childRules(), mediaQueryCollector, resolver, mode);
+    addChildRules(sheet.childRules());
 }
 
-void RuleSet::addStyleRule(const StyleRule& rule, MediaQueryCollector& mediaQueryCollector)
+void RuleSet::Builder::addStyleRule(const StyleRule& rule)
 {
     auto& selectorList = rule.selectorList();
     if (selectorList.isEmpty())
@@ -392,9 +392,41 @@
         return;
     unsigned selectorListIndex = 0;
     for (size_t selectorIndex = 0; selectorIndex != notFound; selectorIndex = selectorList.indexOfNextSelectorAfter(selectorIndex))
-        addRule(rule, selectorIndex, selectorListIndex++, &mediaQueryCollector);
+        ruleSet->addRule(rule, selectorIndex, selectorListIndex++, cascadeLayerOrder, &mediaQueryCollector);
 }
 
+void RuleSet::Builder::pushCascadeLayer(const CascadeLayerName& name)
+{
+    if (mode != Mode::Normal)
+        return;
+    auto nameResolvingAnonymous = [&] {
+        if (name.isEmpty()) {
+            // Make unique name for an anonymous layer.
+            unsigned long long random = randomNumber() * std::numeric_limits<unsigned long long>::max();
+            return CascadeLayerName { "anon_"_s + String::number(random) };
+        }
+        return name;
+    };
+
+    // For hierarchical names we register the containing layers individually first.
+    for (auto& nameSegment : nameResolvingAnonymous()) {
+        resolvedCascadeLayerName.append(nameSegment);
+        cascadeLayerOrder = ruleSet->m_cascadeLayerOrderMap.ensure(resolvedCascadeLayerName, [&] {
+            // FIXME: This is not correct when adding a sublayer to an already registered layer after it has gained siblings.
+            return ruleSet->m_cascadeLayerOrderMap.size() + 1;
+        }).iterator->value;
+    }
+}
+
+void RuleSet::Builder::popCascadeLayer(const CascadeLayerName& name)
+{
+    if (mode != Mode::Normal)
+        return;
+    auto size = name.isEmpty() ? 1 : name.size();
+    resolvedCascadeLayerName.shrink(resolvedCascadeLayerName.size() - size);
+    cascadeLayerOrder = resolvedCascadeLayerName.isEmpty() ? 0 : ruleSet->m_cascadeLayerOrderMap.get(resolvedCascadeLayerName);
+}
+
 template<typename Function>
 void RuleSet::traverseRuleDatas(Function&& function)
 {
@@ -492,34 +524,6 @@
     return collectedChanges;
 }
 
-void RuleSet::pushCascadeLayer(const CascadeLayerName& name)
-{
-    auto nameResolvingAnonymous = [&] {
-        if (name.isEmpty()) {
-            // Make unique name for an anonymous layer.
-            unsigned long long random = randomNumber() * std::numeric_limits<unsigned long long>::max();
-            return CascadeLayerName { "anon_"_s + String::number(random) };
-        }
-        return name;
-    };
-
-    // For hierarchical names we register the containing layers individually first.
-    for (auto& nameSegment : nameResolvingAnonymous()) {
-        m_resolvedCascadeLayerName.append(nameSegment);
-        m_cascadeLayerOrder = m_cascadeLayerOrderMap.ensure(m_resolvedCascadeLayerName, [&] {
-            // FIXME: This is not correct when adding a sublayer to an already registered layer after it has gained siblings.
-            return m_cascadeLayerOrderMap.size() + 1;
-        }).iterator->value;
-    }
-}
-
-void RuleSet::popCascadeLayer(const CascadeLayerName& name)
-{
-    auto size = name.isEmpty() ? 1 : name.size();
-    m_resolvedCascadeLayerName.shrink(m_resolvedCascadeLayerName.size() - size);
-    m_cascadeLayerOrder = m_resolvedCascadeLayerName.isEmpty() ? 0 : m_cascadeLayerOrderMap.get(m_resolvedCascadeLayerName);
-}
-
 static inline void shrinkMapVectorsToFit(RuleSet::AtomRuleMap& map)
 {
     for (auto& vector : map.values())

Modified: trunk/Source/WebCore/style/RuleSet.h (281741 => 281742)


--- trunk/Source/WebCore/style/RuleSet.h	2021-08-29 09:50:28 UTC (rev 281741)
+++ trunk/Source/WebCore/style/RuleSet.h	2021-08-29 13:52:20 UTC (rev 281742)
@@ -108,12 +108,12 @@
         void addRuleIfNeeded(const RuleData&);
     };
 
-    void addRulesFromSheet(StyleSheetContents&, const MediaQueryEvaluator&);
-    void addRulesFromSheet(StyleSheetContents&, MediaQuerySet* sheetQuery, const MediaQueryEvaluator&, Style::Resolver&);
+    void addRulesFromSheet(const StyleSheetContents&, const MediaQueryEvaluator&);
+    void addRulesFromSheet(const StyleSheetContents&, const MediaQuerySet* sheetQuery, const MediaQueryEvaluator&, Style::Resolver&);
 
-    void addStyleRule(const StyleRule&, MediaQueryCollector&);
-    void addRule(const StyleRule&, unsigned selectorIndex, unsigned selectorListIndex, MediaQueryCollector* = nullptr);
+    void addRule(const StyleRule&, unsigned selectorIndex, unsigned selectorListIndex, unsigned cascadeLayerOrder = 0, MediaQueryCollector* = nullptr);
     void addPageRule(StyleRulePage&);
+
     void addToRuleSet(const AtomString& key, AtomRuleMap&, const RuleData&);
     void shrinkToFit();
     void disableAutoShrinkToFit() { m_autoShrinkToFitEnabled = false; }
@@ -150,9 +150,26 @@
 private:
     RuleSet();
 
-    enum class AddRulesMode { Normal, ResolverMutationScan };
-    void addRulesFromSheet(StyleSheetContents&, MediaQueryCollector&, Style::Resolver*, AddRulesMode);
-    void addChildRules(const Vector<RefPtr<StyleRuleBase>>&, MediaQueryCollector&, Style::Resolver*, AddRulesMode);
+    struct Builder {
+        enum class Mode { Normal, ResolverMutationScan };
+
+        Ref<RuleSet> ruleSet;
+        MediaQueryCollector mediaQueryCollector;
+        Style::Resolver* resolver { nullptr };
+        Mode mode { Mode::Normal };
+        CascadeLayerName resolvedCascadeLayerName { };
+        unsigned cascadeLayerOrder { 0 };
+
+        void addRulesFromSheet(const StyleSheetContents&);
+        
+    private:
+        void addChildRules(const Vector<RefPtr<StyleRuleBase>>&);
+        void addStyleRule(const StyleRule&);
+
+        void pushCascadeLayer(const CascadeLayerName&);
+        void popCascadeLayer(const CascadeLayerName&);
+    };
+
     struct CollectedMediaQueryChanges {
         bool requiredFullReset { false };
         Vector<size_t> changedQueryIndexes { };
@@ -160,9 +177,6 @@
     };
     CollectedMediaQueryChanges evaluateDynamicMediaQueryRules(const MediaQueryEvaluator&, size_t startIndex);
 
-    void pushCascadeLayer(const CascadeLayerName&);
-    void popCascadeLayer(const CascadeLayerName&);
-
     template<typename Function> void traverseRuleDatas(Function&&);
 
     AtomRuleMap m_idRules;
@@ -192,10 +206,6 @@
     bool m_hasHostPseudoClassRulesMatchingInShadowTree { false };
     bool m_autoShrinkToFitEnabled { true };
     bool m_hasViewportDependentMediaQueries { false };
-
-    // FIXME: These should be in stack.
-    CascadeLayerName m_resolvedCascadeLayerName;
-    unsigned m_cascadeLayerOrder { 0 };
 };
 
 inline const RuleSet::RuleDataVector* RuleSet::tagRules(const AtomString& key, bool isHTMLName) const
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to