Issue #2835 - Part 2: Implement processing of import rules based on order of appearance

This commit is contained in:
Francis Dominic Fajardo 2025-07-23 20:39:56 +08:00 committed by roytam1
commit 37230e7b21
4 changed files with 31 additions and 4 deletions

View file

@ -16,6 +16,7 @@
#include "PLDHashTable.h"
#include "nsICSSPseudoComparator.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/css/ImportRule.h"
#include "mozilla/css/StyleRule.h"
#include "mozilla/css/GroupRule.h"
#include "nsIDocument.h"
@ -649,6 +650,12 @@ CascadeRuleEnumFunc(css::Rule* aRule, void* aData)
if (!layer->mData->mCounterStyleRules.AppendElement(counterStyleRule)) {
return false;
}
} else if (css::Rule::IMPORT_RULE == type &&
nsCSSRuleUtils::LoadImportedSheetsInOrderEnabled()) {
css::ImportRule* importRule = static_cast<css::ImportRule*>(aRule);
nsCSSRuleProcessor::CascadeSheet(
importRule->GetStyleSheet()->AsConcrete(),
layer);
}
return true;
}
@ -660,10 +667,12 @@ nsCSSRuleProcessor::CascadeSheet(CSSStyleSheet* aSheet, CascadeLayer* aLayer)
aSheet->UseForPresentation(aLayer->mPresContext,
aLayer->mCacheKey) &&
aSheet->mInner) {
CSSStyleSheet* child = aSheet->mInner->mFirstChild;
while (child) {
CascadeSheet(child, aLayer);
child = child->mNext;
if (!nsCSSRuleUtils::LoadImportedSheetsInOrderEnabled()) {
CSSStyleSheet* child = aSheet->mInner->mFirstChild;
while (child) {
CascadeSheet(child, aLayer);
child = child->mNext;
}
}
if (!aSheet->mInner->mOrderedRules.EnumerateForwards(CascadeRuleEnumFunc,

View file

@ -19,6 +19,7 @@ using namespace mozilla::dom;
#define VISITED_PSEUDO_PREF "layout.css.visited_links_enabled"
static bool gSupportVisitedPseudo = true;
static bool gLoadImportedSheetsInOrder = true;
static nsTArray<nsCOMPtr<nsIAtom>>* sSystemMetrics = 0;
@ -31,6 +32,9 @@ nsCSSRuleUtils::Startup()
{
Preferences::AddBoolVarCache(
&gSupportVisitedPseudo, VISITED_PSEUDO_PREF, true);
Preferences::AddBoolVarCache(&gLoadImportedSheetsInOrder,
"layout.css.load-imported-sheets-in-order",
true);
}
static bool
@ -206,6 +210,12 @@ nsCSSRuleUtils::HasSystemMetric(nsIAtom* aMetric)
return sSystemMetrics->IndexOf(aMetric) != sSystemMetrics->NoIndex;
}
/* static */ bool
nsCSSRuleUtils::LoadImportedSheetsInOrderEnabled()
{
return gLoadImportedSheetsInOrder;
}
#ifdef XP_WIN
/* static */ uint8_t
nsCSSRuleUtils::GetWindowsThemeIdentifier()

View file

@ -27,6 +27,8 @@ struct nsCSSRuleUtils
static void FreeSystemMetrics();
static bool HasSystemMetric(nsIAtom* aMetric);
static bool LoadImportedSheetsInOrderEnabled();
#ifdef XP_WIN
// Cached theme identifier for the moz-windows-theme media query.
static uint8_t GetWindowsThemeIdentifier();

View file

@ -2704,6 +2704,12 @@ pref("layout.css.resizeobserver.enabled", true);
// Is support for cascade layers enabled?
pref("layout.css.cascade-layers.enabled", true);
// Should rules in imported style sheets be added based on the order
// of appearance of their respective @import rules in the parent
// style sheet? Otherwise, they are added before rules preceding
// @import are processed, which is problematic for cascade layers.
pref("layout.css.load-imported-sheets-in-order", true);
// pref for which side vertical scrollbars should be on
// 0 = end-side in UI direction
// 1 = end-side in document/content direction