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