mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-08-15 08:53:07 +09:00
Issue #2828 - Part 4: Move cache key storage to ResolvedRuleCascades
This commit is contained in:
parent
03f29e75ec
commit
aab9cdf9bd
3 changed files with 32 additions and 24 deletions
|
|
@ -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<css::DocumentRule*>& 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<css::DocumentRule*>& 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<nsString>& 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
|
||||
|
|
|
|||
|
|
@ -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<SelectorPair>* 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<RuleCascadeData*> mOrderedData;
|
||||
RuleCascadeData* mUnlayered;
|
||||
nsMediaQueryResultCacheKey mCacheKey;
|
||||
ResolvedRuleCascades* mNext; // for a different medium
|
||||
|
||||
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
|
||||
|
|
@ -358,14 +358,16 @@ struct CascadeEnumData
|
|||
nsTArray<css::DocumentRule*>& aDocumentRules,
|
||||
nsDocumentRuleResultCacheKey& aDocumentKey,
|
||||
SheetType aSheetType,
|
||||
bool aMustGatherDocumentRules);
|
||||
bool aMustGatherDocumentRules,
|
||||
nsMediaQueryResultCacheKey& aCacheKey);
|
||||
|
||||
CascadeEnumData(nsPresContext* aPresContext,
|
||||
nsAutoPtr<ResolvedRuleCascades>& aContainer,
|
||||
nsTArray<css::DocumentRule*>& aDocumentRules,
|
||||
nsDocumentRuleResultCacheKey& aDocumentKey,
|
||||
SheetType aSheetType,
|
||||
bool aMustGatherDocumentRules);
|
||||
bool aMustGatherDocumentRules,
|
||||
nsMediaQueryResultCacheKey& aCacheKey);
|
||||
|
||||
~CascadeEnumData();
|
||||
|
||||
|
|
@ -380,6 +382,7 @@ struct CascadeEnumData
|
|||
nsTArray<css::StyleRule*> mStyleRules;
|
||||
nsTArray<css::DocumentRule*>& mDocumentRules;
|
||||
nsDocumentRuleResultCacheKey& mDocumentCacheKey;
|
||||
nsMediaQueryResultCacheKey& mCacheKey;
|
||||
SheetType mSheetType;
|
||||
bool mMustGatherDocumentRules;
|
||||
|
||||
|
|
|
|||
|
|
@ -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<nsMediaQueryResultCacheKey>();
|
||||
}
|
||||
|
||||
if (!c->mUnlayered->mCacheKey.HasFeatureConditions()) {
|
||||
if (!c->mCacheKey.HasFeatureConditions()) {
|
||||
return UniquePtr<nsMediaQueryResultCacheKey>();
|
||||
}
|
||||
|
||||
return MakeUnique<nsMediaQueryResultCacheKey>(c->mUnlayered->mCacheKey);
|
||||
return MakeUnique<nsMediaQueryResultCacheKey>(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<css::GroupRule*>(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<ResolvedRuleCascades> resolvedCascade =
|
||||
new ResolvedRuleCascades();
|
||||
nsAutoPtr<ResolvedRuleCascades> 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)) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue