Modified: trunk/Source/WebCore/ChangeLog (280637 => 280638)
--- trunk/Source/WebCore/ChangeLog 2021-08-04 17:33:00 UTC (rev 280637)
+++ trunk/Source/WebCore/ChangeLog 2021-08-04 17:39:50 UTC (rev 280638)
@@ -1,3 +1,20 @@
+2021-08-04 Antti Koivisto <[email protected]>
+
+ Reduce Vector<> wasted capacity in some RuleSet code
+ https://bugs.webkit.org/show_bug.cgi?id=224160
+ <rdar://problem/76369555>
+
+ Unreviewed, reverting revert r279242.
+
+ Reland as this was not related to the crashes seen.
+
+ * style/RuleSet.cpp:
+ (WebCore::Style::RuleSet::addRulesFromSheet):
+ (WebCore::Style::RuleSet::evaluateDynamicMediaQueryRules):
+ (WebCore::Style::shrinkDynamicRules):
+ (WebCore::Style::RuleSet::shrinkToFit):
+ * style/RuleSet.h:
+
2021-08-04 Andres Gonzalez <[email protected]>
Add support for aria-selected value changes in table cells.
Modified: trunk/Source/WebCore/style/RuleSet.cpp (280637 => 280638)
--- trunk/Source/WebCore/style/RuleSet.cpp 2021-08-04 17:33:00 UTC (rev 280637)
+++ trunk/Source/WebCore/style/RuleSet.cpp 2021-08-04 17:39:50 UTC (rev 280638)
@@ -313,6 +313,9 @@
{
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)
@@ -333,14 +336,16 @@
m_hasViewportDependentMediaQueries = mediaQueryCollector.hasViewportDependentMediaQueries;
- if (mediaQueryCollector.dynamicMediaQueryRules.isEmpty())
- return;
+ if (!mediaQueryCollector.dynamicMediaQueryRules.isEmpty()) {
+ auto firstNewIndex = m_dynamicMediaQueryRules.size();
+ m_dynamicMediaQueryRules.appendVector(WTFMove(mediaQueryCollector.dynamicMediaQueryRules));
- auto firstNewIndex = m_dynamicMediaQueryRules.size();
- m_dynamicMediaQueryRules.appendVector(WTFMove(mediaQueryCollector.dynamicMediaQueryRules));
+ // Set the initial values.
+ evaluateDynamicMediaQueryRules(evaluator, firstNewIndex);
+ }
- // Set the initial values.
- evaluateDynamicMediaQueryRules(evaluator, firstNewIndex);
+ if (m_autoShrinkToFitEnabled)
+ shrinkToFit();
}
void RuleSet::addRulesFromSheet(StyleSheetContents& sheet, MediaQueryCollector& mediaQueryCollector, Resolver* resolver, AddRulesMode mode)
@@ -355,9 +360,6 @@
}
addChildRules(sheet.childRules(), mediaQueryCollector, resolver, mode);
-
- if (m_autoShrinkToFitEnabled && mode == AddRulesMode::Normal)
- shrinkToFit();
}
void RuleSet::addStyleRule(const StyleRule& rule, MediaQueryCollector& mediaQueryCollector)
@@ -415,6 +417,7 @@
for (auto& feature : *featureVector)
ruleSet->addRule(*feature.styleRule, feature.selectorIndex, feature.selectorListIndex);
}
+ ruleSet->shrinkToFit();
return ruleSet;
}).iterator->value;
@@ -472,6 +475,14 @@
vector->shrinkToFit();
}
+static inline void shrinkDynamicRules(Vector<RuleSet::DynamicMediaQueryRules>& dynamicRules)
+{
+ for (auto& rule : dynamicRules)
+ rule.shrinkToFit();
+
+ dynamicRules.shrinkToFit();
+}
+
void RuleSet::shrinkToFit()
{
shrinkMapVectorsToFit(m_idRules);
@@ -479,6 +490,7 @@
shrinkMapVectorsToFit(m_tagLocalNameRules);
shrinkMapVectorsToFit(m_tagLowercaseLocalNameRules);
shrinkMapVectorsToFit(m_shadowPseudoElementRules);
+
m_linkPseudoClassRules.shrinkToFit();
#if ENABLE(VIDEO)
m_cuePseudoRules.shrinkToFit();
@@ -485,10 +497,14 @@
#endif
m_hostPseudoClassRules.shrinkToFit();
m_slottedPseudoElementRules.shrinkToFit();
+ m_partPseudoElementRules.shrinkToFit();
m_focusPseudoClassRules.shrinkToFit();
m_universalRules.shrinkToFit();
+
m_pageRules.shrinkToFit();
m_features.shrinkToFit();
+
+ shrinkDynamicRules(m_dynamicMediaQueryRules);
}
RuleSet::MediaQueryCollector::~MediaQueryCollector() = default;
Modified: trunk/Source/WebCore/style/RuleSet.h (280637 => 280638)
--- trunk/Source/WebCore/style/RuleSet.h 2021-08-04 17:33:00 UTC (rev 280637)
+++ trunk/Source/WebCore/style/RuleSet.h 2021-08-04 17:39:50 UTC (rev 280638)
@@ -76,6 +76,13 @@
RuleFeatureVector ruleFeatures;
bool requiresFullReset { false };
bool result { true };
+
+ void shrinkToFit()
+ {
+ mediaQuerySets.shrinkToFit();
+ affectedRulePositions.shrinkToFit();
+ ruleFeatures.shrinkToFit();
+ }
};
struct MediaQueryCollector {
@@ -153,7 +160,6 @@
template<typename Function> void traverseRuleDatas(Function&&);
-
AtomRuleMap m_idRules;
AtomRuleMap m_classRules;
AtomRuleMap m_tagLocalNameRules;
@@ -169,13 +175,13 @@
RuleDataVector m_focusPseudoClassRules;
RuleDataVector m_universalRules;
Vector<StyleRulePage*> m_pageRules;
+ RuleFeatureSet m_features;
+ Vector<DynamicMediaQueryRules> m_dynamicMediaQueryRules;
+ HashMap<Vector<size_t>, Ref<const RuleSet>> m_mediaQueryInvalidationRuleSetCache;
unsigned m_ruleCount { 0 };
bool m_hasHostPseudoClassRulesMatchingInShadowTree { false };
bool m_autoShrinkToFitEnabled { true };
- RuleFeatureSet m_features;
bool m_hasViewportDependentMediaQueries { false };
- Vector<DynamicMediaQueryRules> m_dynamicMediaQueryRules;
- HashMap<Vector<size_t>, Ref<const RuleSet>> m_mediaQueryInvalidationRuleSetCache;
};
inline const RuleSet::RuleDataVector* RuleSet::tagRules(const AtomString& key, bool isHTMLName) const