diff --git a/layout/style/RuleCascadeData.cpp b/layout/style/RuleCascadeData.cpp index 851446bf5e..fb39141acc 100644 --- a/layout/style/RuleCascadeData.cpp +++ b/layout/style/RuleCascadeData.cpp @@ -786,7 +786,7 @@ AtomSelector_CIMatchEntry(const PLDHashEntryHdr* hdr, const void* key) AtomSelector_InitEntry }; -RuleCascadeData::RuleCascadeData(nsIAtom* aMedium, bool aQuirksMode) +RuleCascadeData::RuleCascadeData(bool aQuirksMode) : mRuleHash(aQuirksMode) , mStateSelectors() , mSelectorDocumentStates(0) @@ -803,7 +803,6 @@ RuleCascadeData::RuleCascadeData(nsIAtom* aMedium, bool aQuirksMode) , mXULTreeRules(&RuleHash::TagTable_Ops, sizeof(RuleHashTagTableEntry)) , mKeyframesRuleTable() , mCounterStyleRuleTable() - , mCacheKey(aMedium) , mQuirksMode(aQuirksMode) { memset(mPseudoElementRuleHashes, 0, sizeof(mPseudoElementRuleHashes)); @@ -1559,7 +1558,8 @@ CascadeEnumData::CascadeEnumData(nsPresContext* aPresContext, nsTArray& aDocumentRules, nsDocumentRuleResultCacheKey& aDocumentKey, SheetType aSheetType, - bool aMustGatherDocumentRules) + bool aMustGatherDocumentRules, + nsMediaQueryResultCacheKey& aCacheKey) : mPresContext(aPresContext) , mName(aName) , mIsAnonymous(mName.IsEmpty()) @@ -1575,6 +1575,7 @@ CascadeEnumData::CascadeEnumData(nsPresContext* aPresContext, , mSheetType(aSheetType) , mMustGatherDocumentRules(aMustGatherDocumentRules) , mRulesByWeight(&sRulesByWeightOps, sizeof(RuleByWeightEntry), 32) + , mCacheKey(aCacheKey) { Initialize(); } @@ -1584,7 +1585,8 @@ CascadeEnumData::CascadeEnumData(nsPresContext* aPresContext, nsTArray& aDocumentRules, nsDocumentRuleResultCacheKey& aDocumentKey, SheetType aSheetType, - bool aMustGatherDocumentRules) + bool aMustGatherDocumentRules, + nsMediaQueryResultCacheKey& aCacheKey) : mPresContext(aPresContext) , mContainer(aContainer) , mIsAnonymous(false) @@ -1599,6 +1601,7 @@ CascadeEnumData::CascadeEnumData(nsPresContext* aPresContext, , mSheetType(aSheetType) , mMustGatherDocumentRules(aMustGatherDocumentRules) , mRulesByWeight(&sRulesByWeightOps, sizeof(RuleByWeightEntry), 32) + , mCacheKey(aCacheKey) { Initialize(); } @@ -1630,7 +1633,8 @@ CascadeEnumData::CreateNamedChildLayer(const nsTArray& aPath) mDocumentRules, mDocumentCacheKey, mSheetType, - mMustGatherDocumentRules); + mMustGatherDocumentRules, + mCacheKey); mPreLayers.AppendElement(childLayer); mLayers.Put(name, childLayer); } @@ -1660,7 +1664,8 @@ CascadeEnumData::CreateAnonymousChildLayer() mDocumentRules, mDocumentCacheKey, mSheetType, - mMustGatherDocumentRules); + mMustGatherDocumentRules, + mCacheKey); mPreLayers.AppendElement(childLayer); return childLayer; } @@ -1773,8 +1778,7 @@ CascadeEnumData::Flatten() void CascadeEnumData::Initialize() { - mData = new RuleCascadeData(mPresContext->Medium(), - eCompatibility_NavQuirks == + mData = new RuleCascadeData(eCompatibility_NavQuirks == mPresContext->CompatibilityMode()); // Initialize our arena diff --git a/layout/style/RuleCascadeData.h b/layout/style/RuleCascadeData.h index 3358c4efa5..75e035d970 100644 --- a/layout/style/RuleCascadeData.h +++ b/layout/style/RuleCascadeData.h @@ -254,7 +254,7 @@ struct AttributeEnumData struct RuleCascadeData { - RuleCascadeData(nsIAtom* aMedium, bool aQuirksMode); + RuleCascadeData(bool aQuirksMode); ~RuleCascadeData(); size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const; @@ -286,8 +286,6 @@ struct RuleCascadeData // Returns null only on allocation failure. nsTArray* AttributeListFor(nsIAtom* aAttribute); - nsMediaQueryResultCacheKey mCacheKey; - const bool mQuirksMode; void RulesMatching(ElementRuleProcessorData* aData); @@ -326,8 +324,9 @@ private: struct ResolvedRuleCascades { - ResolvedRuleCascades() + ResolvedRuleCascades(nsIAtom* aMedium) : mUnlayered(nullptr) + , mCacheKey(aMedium) , mNext(nullptr) { } @@ -341,6 +340,7 @@ struct ResolvedRuleCascades nsTArray mOrderedData; RuleCascadeData* mUnlayered; + nsMediaQueryResultCacheKey mCacheKey; ResolvedRuleCascades* mNext; // for a different medium size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const; @@ -358,14 +358,16 @@ struct CascadeEnumData nsTArray& aDocumentRules, nsDocumentRuleResultCacheKey& aDocumentKey, SheetType aSheetType, - bool aMustGatherDocumentRules); + bool aMustGatherDocumentRules, + nsMediaQueryResultCacheKey& aCacheKey); CascadeEnumData(nsPresContext* aPresContext, nsAutoPtr& aContainer, nsTArray& aDocumentRules, nsDocumentRuleResultCacheKey& aDocumentKey, SheetType aSheetType, - bool aMustGatherDocumentRules); + bool aMustGatherDocumentRules, + nsMediaQueryResultCacheKey& aCacheKey); ~CascadeEnumData(); @@ -380,6 +382,7 @@ struct CascadeEnumData nsTArray mStyleRules; nsTArray& mDocumentRules; nsDocumentRuleResultCacheKey& mDocumentCacheKey; + nsMediaQueryResultCacheKey& mCacheKey; SheetType mSheetType; bool mMustGatherDocumentRules; diff --git a/layout/style/nsCSSRuleProcessor.cpp b/layout/style/nsCSSRuleProcessor.cpp index ac5fdf86dd..b5913181a3 100644 --- a/layout/style/nsCSSRuleProcessor.cpp +++ b/layout/style/nsCSSRuleProcessor.cpp @@ -335,7 +335,7 @@ nsCSSRuleProcessor::MediumFeaturesChanged(nsPresContext* aPresContext) // order hasn't changed). Other cases will do a restyle anyway, so // we shouldn't need to worry about posting a second. return !mRuleCascades || // all sheets gone, but we had sheets before - mRuleCascades->mUnlayered->mCacheKey != *previousCacheKey; + mRuleCascades->mCacheKey != *previousCacheKey; } return false; @@ -361,11 +361,11 @@ nsCSSRuleProcessor::CloneMQCacheKey() return UniquePtr(); } - if (!c->mUnlayered->mCacheKey.HasFeatureConditions()) { + if (!c->mCacheKey.HasFeatureConditions()) { return UniquePtr(); } - return MakeUnique(c->mUnlayered->mCacheKey); + return MakeUnique(c->mCacheKey); } /* virtual */ size_t @@ -608,7 +608,7 @@ CascadeRuleEnumFunc(css::Rule* aRule, void* aData) css::Rule::SUPPORTS_RULE == type) { css::GroupRule* groupRule = static_cast(aRule); const bool use = groupRule->UseForPresentation(layer->mPresContext, - layer->mData->mCacheKey); + layer->mCacheKey); if (use || layer->mMustGatherDocumentRules) { if (!groupRule->EnumerateRulesForwards( use ? CascadeRuleEnumFunc : GatherDocRuleEnumFunc, aData)) { @@ -633,7 +633,7 @@ CascadeRuleEnumFunc(css::Rule* aRule, void* aData) ? layer->CreateAnonymousChildLayer() : layer->CreateNamedChildLayer(path); const bool use = layerRule->UseForPresentation(layer->mPresContext, - layer->mData->mCacheKey); + layer->mCacheKey); if (use || layer->mMustGatherDocumentRules) { if (!layerRule->EnumerateRulesForwards( use ? CascadeRuleEnumFunc : GatherDocRuleEnumFunc, targetLayer)) { @@ -698,7 +698,7 @@ nsCSSRuleProcessor::CascadeSheet(CSSStyleSheet* aSheet, CascadeEnumData* aLayer) { if (aSheet->IsApplicable() && aSheet->UseForPresentation(aLayer->mPresContext, - aLayer->mData->mCacheKey) && + aLayer->mCacheKey) && aSheet->mInner) { CSSStyleSheet* child = aSheet->mInner->mFirstChild; while (child) { @@ -744,7 +744,7 @@ nsCSSRuleProcessor::RefreshRuleCascade(nsPresContext* aPresContext) for (ResolvedRuleCascades** cascadep = &mRuleCascades, *cascade; (cascade = *cascadep); cascadep = &cascade->mNext) { - if (cascade->mUnlayered->mCacheKey.Matches(aPresContext)) { + if (cascade->mCacheKey.Matches(aPresContext)) { // Ensure that the current one is always mRuleCascades. *cascadep = cascade->mNext; cascade->mNext = mRuleCascades; @@ -760,14 +760,15 @@ nsCSSRuleProcessor::RefreshRuleCascade(nsPresContext* aPresContext) mPreviousCacheKey = nullptr; if (mSheets.Length() != 0) { - nsAutoPtr resolvedCascade = - new ResolvedRuleCascades(); + nsAutoPtr resolvedCascade( + new ResolvedRuleCascades(aPresContext->Medium())); CascadeEnumData unlayered(aPresContext, resolvedCascade, mDocumentRules, mDocumentCacheKey, mSheetType, - mMustGatherDocumentRules); + mMustGatherDocumentRules, + resolvedCascade->mCacheKey); if (unlayered.mData) { for (uint32_t i = 0; i < mSheets.Length(); ++i) { if (!CascadeSheet(mSheets.ElementAt(i), &unlayered)) {