mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-30 12:27:29 +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
|
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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue