canActivatePseudoClassOnTarget method

bool canActivatePseudoClassOnTarget(
  1. RuleSet ruleSet,
  2. Element element,
  3. String pseudoClassName
)

Implementation

bool canActivatePseudoClassOnTarget(
    RuleSet ruleSet, Element element, String pseudoClassName) {
  if (ruleSet.isEmpty) return false;

  final SelectorEvaluator evaluator = SelectorEvaluator();
  final String normalizedPseudo = pseudoClassName.toLowerCase();

  bool matchRules(List<CSSRule>? rules) {
    if (rules == null || rules.isEmpty) return false;
    for (final CSSRule rule in rules) {
      if (rule is! CSSStyleRule) continue;
      if (!selectorGroupHasRightmostPseudoClass(
          rule.selectorGroup, normalizedPseudo)) {
        continue;
      }
      if (evaluator.matchSelectorWithForcedPseudoClass(
        rule.selectorGroup,
        element,
        forcedElement: element,
        pseudoClass: normalizedPseudo,
      )) {
        return true;
      }
    }
    return false;
  }

  final String? id = element.id;
  if (id != null && matchRules(ruleSet.idRules[id])) {
    return true;
  }

  for (final String className in element.classList) {
    if (matchRules(ruleSet.classRules[className])) {
      return true;
    }
  }

  for (final String attribute in element.attributes.keys) {
    if (matchRules(ruleSet.attributeRules[attribute.toUpperCase()])) {
      return true;
    }
  }

  if (matchRules(ruleSet.tagRules[element.tagName.toUpperCase()])) {
    return true;
  }

  return matchRules(ruleSet.universalRules) ||
      matchRules(ruleSet.pseudoRules);
}