cascadeMatchedStyleRules function
CSSStyleDeclaration
cascadeMatchedStyleRules(
- List<
CSSStyleRule> rules, { - int? cacheVersion,
- bool copyResult = false,
Implementation
CSSStyleDeclaration cascadeMatchedStyleRules(List<CSSStyleRule> rules,
{int? cacheVersion, bool copyResult = false}) {
final declaration = CSSStyleDeclaration();
if (rules.isEmpty) return declaration;
if (rules.length == 1) {
declaration.union(rules.first.declaration);
return copyResult ? declaration.cloneEffective() : declaration;
}
if (cacheVersion != null) {
final _CascadeCacheKey lookupKey =
_CascadeCacheKey.lookup(cacheVersion, rules);
final CSSStyleDeclaration? cached = _cascadeDeclarationCache[lookupKey];
if (cached != null) {
return copyResult ? cached.cloneEffective() : cached;
}
}
final normalOrder = List<CSSStyleRule>.from(rules)
..sort((a, b) => compareStyleRulesForCascade(a, b, important: false));
final bool hasImportantDeclarations =
rules.any((rule) => rule.declaration.hasImportantDeclarations);
if (!hasImportantDeclarations) {
for (final r in normalOrder) {
declaration.union(r.declaration);
}
if (cacheVersion != null) {
_cascadeDeclarationCache[
_CascadeCacheKey.stored(cacheVersion, rules)] = declaration;
}
return copyResult ? declaration.cloneEffective() : declaration;
}
for (final r in normalOrder) {
declaration.unionByImportance(r.declaration, important: false);
}
final bool hasLayeredRules = rules.any((rule) => rule.layerOrderKey != null);
final List<CSSStyleRule> importantOrder = hasLayeredRules
? (List<CSSStyleRule>.from(rules)
..sort((a, b) => compareStyleRulesForCascade(a, b, important: true)))
: normalOrder;
for (final r in importantOrder) {
declaration.unionByImportance(r.declaration, important: true);
}
if (cacheVersion != null) {
_cascadeDeclarationCache[
_CascadeCacheKey.stored(cacheVersion, rules)] = declaration;
}
return copyResult ? declaration.cloneEffective() : declaration;
}