cascadeMatchedStyleRules function

CSSStyleDeclaration cascadeMatchedStyleRules(
  1. List<CSSStyleRule> rules, {
  2. int? cacheVersion,
  3. 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;
}