Issue #2828 - Part 4: Move cache key storage to ResolvedRuleCascades

This commit is contained in:
Francis Dominic Fajardo 2025-07-19 22:29:50 +08:00 • committed by roytam1
commit aab9cdf9bd
3 changed files with 32 additions and 24 deletions

View file

@ -786,7 +786,7 @@ AtomSelector_CIMatchEntry(const PLDHashEntryHdr* hdr, const void* key)
AtomSelector_InitEntry AtomSelector_InitEntry
}; };
RuleCascadeData::RuleCascadeData(nsIAtom* aMedium, bool aQuirksMode) RuleCascadeData::RuleCascadeData(bool aQuirksMode)
: mRuleHash(aQuirksMode) : mRuleHash(aQuirksMode)
, mStateSelectors() , mStateSelectors()
, mSelectorDocumentStates(0) , mSelectorDocumentStates(0)
@ -803,7 +803,6 @@ RuleCascadeData::RuleCascadeData(nsIAtom* aMedium, bool aQuirksMode)
, mXULTreeRules(&RuleHash::TagTable_Ops, sizeof(RuleHashTagTableEntry)) , mXULTreeRules(&RuleHash::TagTable_Ops, sizeof(RuleHashTagTableEntry))
, mKeyframesRuleTable() , mKeyframesRuleTable()
, mCounterStyleRuleTable() , mCounterStyleRuleTable()
, mCacheKey(aMedium)
, mQuirksMode(aQuirksMode) , mQuirksMode(aQuirksMode)
{ {
memset(mPseudoElementRuleHashes, 0, sizeof(mPseudoElementRuleHashes)); memset(mPseudoElementRuleHashes, 0, sizeof(mPseudoElementRuleHashes));
@ -1559,7 +1558,8 @@ CascadeEnumData::CascadeEnumData(nsPresContext* aPresContext,
nsTArray<css::DocumentRule*>& aDocumentRules, nsTArray<css::DocumentRule*>& aDocumentRules,
nsDocumentRuleResultCacheKey& aDocumentKey, nsDocumentRuleResultCacheKey& aDocumentKey,
SheetType aSheetType, SheetType aSheetType,
bool aMustGatherDocumentRules) bool aMustGatherDocumentRules,
nsMediaQueryResultCacheKey& aCacheKey)
: mPresContext(aPresContext) : mPresContext(aPresContext)
, mName(aName) , mName(aName)
, mIsAnonymous(mName.IsEmpty()) , mIsAnonymous(mName.IsEmpty())
@ -1575,6 +1575,7 @@ CascadeEnumData::CascadeEnumData(nsPresContext* aPresContext,
, mSheetType(aSheetType) , mSheetType(aSheetType)
, mMustGatherDocumentRules(aMustGatherDocumentRules) , mMustGatherDocumentRules(aMustGatherDocumentRules)
, mRulesByWeight(&sRulesByWeightOps, sizeof(RuleByWeightEntry), 32) , mRulesByWeight(&sRulesByWeightOps, sizeof(RuleByWeightEntry), 32)
, mCacheKey(aCacheKey)
{ {
Initialize(); Initialize();
} }
@ -1584,7 +1585,8 @@ CascadeEnumData::CascadeEnumData(nsPresContext* aPresContext,
nsTArray<css::DocumentRule*>& aDocumentRules, nsTArray<css::DocumentRule*>& aDocumentRules,
nsDocumentRuleResultCacheKey& aDocumentKey, nsDocumentRuleResultCacheKey& aDocumentKey,
SheetType aSheetType, SheetType aSheetType,
bool aMustGatherDocumentRules) bool aMustGatherDocumentRules,
nsMediaQueryResultCacheKey& aCacheKey)
: mPresContext(aPresContext) : mPresContext(aPresContext)
, mContainer(aContainer) , mContainer(aContainer)
, mIsAnonymous(false) , mIsAnonymous(false)
@ -1599,6 +1601,7 @@ CascadeEnumData::CascadeEnumData(nsPresContext* aPresContext,
, mSheetType(aSheetType) , mSheetType(aSheetType)
, mMustGatherDocumentRules(aMustGatherDocumentRules) , mMustGatherDocumentRules(aMustGatherDocumentRules)
, mRulesByWeight(&sRulesByWeightOps, sizeof(RuleByWeightEntry), 32) , mRulesByWeight(&sRulesByWeightOps, sizeof(RuleByWeightEntry), 32)
, mCacheKey(aCacheKey)
{ {
Initialize(); Initialize();
} }
@ -1630,7 +1633,8 @@ CascadeEnumData::CreateNamedChildLayer(const nsTArray<nsString>& aPath)
mDocumentRules, mDocumentRules,
mDocumentCacheKey, mDocumentCacheKey,
mSheetType, mSheetType,
mMustGatherDocumentRules); mMustGatherDocumentRules,
mCacheKey);
mPreLayers.AppendElement(childLayer); mPreLayers.AppendElement(childLayer);
mLayers.Put(name, childLayer); mLayers.Put(name, childLayer);
} }
@ -1660,7 +1664,8 @@ CascadeEnumData::CreateAnonymousChildLayer()
mDocumentRules, mDocumentRules,
mDocumentCacheKey, mDocumentCacheKey,
mSheetType, mSheetType,
mMustGatherDocumentRules); mMustGatherDocumentRules,
mCacheKey);
mPreLayers.AppendElement(childLayer); mPreLayers.AppendElement(childLayer);
return childLayer; return childLayer;
} }
@ -1773,8 +1778,7 @@ CascadeEnumData::Flatten()
void void
CascadeEnumData::Initialize() CascadeEnumData::Initialize()
{ {
mData = new RuleCascadeData(mPresContext->Medium(), mData = new RuleCascadeData(eCompatibility_NavQuirks ==
eCompatibility_NavQuirks ==
mPresContext->CompatibilityMode()); mPresContext->CompatibilityMode());
// Initialize our arena // Initialize our arena

View file

@ -254,7 +254,7 @@ struct AttributeEnumData
struct RuleCascadeData struct RuleCascadeData
{ {
RuleCascadeData(nsIAtom* aMedium, bool aQuirksMode); RuleCascadeData(bool aQuirksMode);
~RuleCascadeData(); ~RuleCascadeData();
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const; size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
@ -286,8 +286,6 @@ struct RuleCascadeData
// Returns null only on allocation failure. // Returns null only on allocation failure.
nsTArray<SelectorPair>* AttributeListFor(nsIAtom* aAttribute); nsTArray<SelectorPair>* AttributeListFor(nsIAtom* aAttribute);
nsMediaQueryResultCacheKey mCacheKey;
const bool mQuirksMode; const bool mQuirksMode;
void RulesMatching(ElementRuleProcessorData* aData); void RulesMatching(ElementRuleProcessorData* aData);
@ -326,8 +324,9 @@ private:
struct ResolvedRuleCascades struct ResolvedRuleCascades
{ {
ResolvedRuleCascades() ResolvedRuleCascades(nsIAtom* aMedium)
: mUnlayered(nullptr) : mUnlayered(nullptr)
, mCacheKey(aMedium)
, mNext(nullptr) , mNext(nullptr)
{ {
} }
@ -341,6 +340,7 @@ struct ResolvedRuleCascades
nsTArray<RuleCascadeData*> mOrderedData; nsTArray<RuleCascadeData*> mOrderedData;
RuleCascadeData* mUnlayered; RuleCascadeData* mUnlayered;
nsMediaQueryResultCacheKey mCacheKey;
ResolvedRuleCascades* mNext; // for a different medium ResolvedRuleCascades* mNext; // for a different medium
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const; size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
@ -358,14 +358,16 @@ struct CascadeEnumData
nsTArray<css::DocumentRule*>& aDocumentRules, nsTArray<css::DocumentRule*>& aDocumentRules,
nsDocumentRuleResultCacheKey& aDocumentKey, nsDocumentRuleResultCacheKey& aDocumentKey,
SheetType aSheetType, SheetType aSheetType,
bool aMustGatherDocumentRules); bool aMustGatherDocumentRules,
nsMediaQueryResultCacheKey& aCacheKey);
CascadeEnumData(nsPresContext* aPresContext, CascadeEnumData(nsPresContext* aPresContext,
nsAutoPtr<ResolvedRuleCascades>& aContainer, nsAutoPtr<ResolvedRuleCascades>& aContainer,
nsTArray<css::DocumentRule*>& aDocumentRules, nsTArray<css::DocumentRule*>& aDocumentRules,
nsDocumentRuleResultCacheKey& aDocumentKey, nsDocumentRuleResultCacheKey& aDocumentKey,
SheetType aSheetType, SheetType aSheetType,
bool aMustGatherDocumentRules); bool aMustGatherDocumentRules,
nsMediaQueryResultCacheKey& aCacheKey);
~CascadeEnumData(); ~CascadeEnumData();
@ -380,6 +382,7 @@ struct CascadeEnumData
nsTArray<css::StyleRule*> mStyleRules; nsTArray<css::StyleRule*> mStyleRules;
nsTArray<css::DocumentRule*>& mDocumentRules; nsTArray<css::DocumentRule*>& mDocumentRules;
nsDocumentRuleResultCacheKey& mDocumentCacheKey; nsDocumentRuleResultCacheKey& mDocumentCacheKey;
nsMediaQueryResultCacheKey& mCacheKey;
SheetType mSheetType; SheetType mSheetType;
bool mMustGatherDocumentRules; bool mMustGatherDocumentRules;

View file

@ -335,7 +335,7 @@ nsCSSRuleProcessor::MediumFeaturesChanged(nsPresContext* aPresContext)
// order hasn't changed). Other cases will do a restyle anyway, so // order hasn't changed). Other cases will do a restyle anyway, so
// we shouldn't need to worry about posting a second. // we shouldn't need to worry about posting a second.
return !mRuleCascades || // all sheets gone, but we had sheets before return !mRuleCascades || // all sheets gone, but we had sheets before
mRuleCascades->mUnlayered->mCacheKey != *previousCacheKey; mRuleCascades->mCacheKey != *previousCacheKey;
} }
return false; return false;
@ -361,11 +361,11 @@ nsCSSRuleProcessor::CloneMQCacheKey()
return UniquePtr<nsMediaQueryResultCacheKey>(); return UniquePtr<nsMediaQueryResultCacheKey>();
} }
if (!c->mUnlayered->mCacheKey.HasFeatureConditions()) { if (!c->mCacheKey.HasFeatureConditions()) {
return UniquePtr<nsMediaQueryResultCacheKey>(); return UniquePtr<nsMediaQueryResultCacheKey>();
} }
return MakeUnique<nsMediaQueryResultCacheKey>(c->mUnlayered->mCacheKey); return MakeUnique<nsMediaQueryResultCacheKey>(c->mCacheKey);
} }
/* virtual */ size_t /* virtual */ size_t
@ -608,7 +608,7 @@ CascadeRuleEnumFunc(css::Rule* aRule, void* aData)
css::Rule::SUPPORTS_RULE == type) { css::Rule::SUPPORTS_RULE == type) {
css::GroupRule* groupRule = static_cast<css::GroupRule*>(aRule); css::GroupRule* groupRule = static_cast<css::GroupRule*>(aRule);
const bool use = groupRule->UseForPresentation(layer->mPresContext, const bool use = groupRule->UseForPresentation(layer->mPresContext,
layer->mData->mCacheKey); layer->mCacheKey);
if (use || layer->mMustGatherDocumentRules) { if (use || layer->mMustGatherDocumentRules) {
if (!groupRule->EnumerateRulesForwards( if (!groupRule->EnumerateRulesForwards(
use ? CascadeRuleEnumFunc : GatherDocRuleEnumFunc, aData)) { use ? CascadeRuleEnumFunc : GatherDocRuleEnumFunc, aData)) {
@ -633,7 +633,7 @@ CascadeRuleEnumFunc(css::Rule* aRule, void* aData)
? layer->CreateAnonymousChildLayer() ? layer->CreateAnonymousChildLayer()
: layer->CreateNamedChildLayer(path); : layer->CreateNamedChildLayer(path);
const bool use = layerRule->UseForPresentation(layer->mPresContext, const bool use = layerRule->UseForPresentation(layer->mPresContext,
layer->mData->mCacheKey); layer->mCacheKey);
if (use || layer->mMustGatherDocumentRules) { if (use || layer->mMustGatherDocumentRules) {
if (!layerRule->EnumerateRulesForwards( if (!layerRule->EnumerateRulesForwards(
use ? CascadeRuleEnumFunc : GatherDocRuleEnumFunc, targetLayer)) { use ? CascadeRuleEnumFunc : GatherDocRuleEnumFunc, targetLayer)) {
@ -698,7 +698,7 @@ nsCSSRuleProcessor::CascadeSheet(CSSStyleSheet* aSheet, CascadeEnumData* aLayer)
{ {
if (aSheet->IsApplicable() && if (aSheet->IsApplicable() &&
aSheet->UseForPresentation(aLayer->mPresContext, aSheet->UseForPresentation(aLayer->mPresContext,
aLayer->mData->mCacheKey) && aLayer->mCacheKey) &&
aSheet->mInner) { aSheet->mInner) {
CSSStyleSheet* child = aSheet->mInner->mFirstChild; CSSStyleSheet* child = aSheet->mInner->mFirstChild;
while (child) { while (child) {
@ -744,7 +744,7 @@ nsCSSRuleProcessor::RefreshRuleCascade(nsPresContext* aPresContext)
for (ResolvedRuleCascades** cascadep = &mRuleCascades, *cascade; for (ResolvedRuleCascades** cascadep = &mRuleCascades, *cascade;
(cascade = *cascadep); (cascade = *cascadep);
cascadep = &cascade->mNext) { cascadep = &cascade->mNext) {
if (cascade->mUnlayered->mCacheKey.Matches(aPresContext)) { if (cascade->mCacheKey.Matches(aPresContext)) {
// Ensure that the current one is always mRuleCascades. // Ensure that the current one is always mRuleCascades.
*cascadep = cascade->mNext; *cascadep = cascade->mNext;
cascade->mNext = mRuleCascades; cascade->mNext = mRuleCascades;
@ -760,14 +760,15 @@ nsCSSRuleProcessor::RefreshRuleCascade(nsPresContext* aPresContext)
mPreviousCacheKey = nullptr; mPreviousCacheKey = nullptr;
if (mSheets.Length() != 0) { if (mSheets.Length() != 0) {
nsAutoPtr<ResolvedRuleCascades> resolvedCascade = nsAutoPtr<ResolvedRuleCascades> resolvedCascade(
new ResolvedRuleCascades(); new ResolvedRuleCascades(aPresContext->Medium()));
CascadeEnumData unlayered(aPresContext, CascadeEnumData unlayered(aPresContext,
resolvedCascade, resolvedCascade,
mDocumentRules, mDocumentRules,
mDocumentCacheKey, mDocumentCacheKey,
mSheetType, mSheetType,
mMustGatherDocumentRules); mMustGatherDocumentRules,
resolvedCascade->mCacheKey);
if (unlayered.mData) { if (unlayered.mData) {
for (uint32_t i = 0; i < mSheets.Length(); ++i) { for (uint32_t i = 0; i < mSheets.Length(); ++i) {
if (!CascadeSheet(mSheets.ElementAt(i), &unlayered)) { if (!CascadeSheet(mSheets.ElementAt(i), &unlayered)) {