handlePseudoRules method

void handlePseudoRules(
  1. Element parentElement,
  2. List<CSSStyleRule> rules
)

Implementation

void handlePseudoRules(Element parentElement, List<CSSStyleRule> rules) {
  _didProcessPseudoRules = true;
  if (rules.isEmpty) {
    if (pseudoBeforeStyle != null) {
      pseudoBeforeStyle = null;
      parentElement.markBeforePseudoElementNeedsUpdate();
    }
    if (pseudoAfterStyle != null) {
      pseudoAfterStyle = null;
      parentElement.markAfterPseudoElementNeedsUpdate();
    }
    if (pseudoFirstLetterStyle != null) {
      pseudoFirstLetterStyle = null;
      parentElement.markFirstLetterPseudoNeedsUpdate();
    }
    if (pseudoFirstLineStyle != null) {
      pseudoFirstLineStyle = null;
      parentElement.markFirstLinePseudoNeedsUpdate();
    }
    return;
  }

  List<CSSStyleRule> beforeRules = [];
  List<CSSStyleRule> afterRules = [];
  List<CSSStyleRule> firstLetterRules = [];
  List<CSSStyleRule> firstLineRules = [];

  for (CSSStyleRule style in rules) {
    for (Selector selector in style.selectorGroup.selectors) {
      for (SimpleSelectorSequence sequence
          in selector.simpleSelectorSequences) {
        if (sequence.simpleSelector is PseudoElementSelector) {
          if (sequence.simpleSelector.name == 'before') {
            beforeRules.add(style);
          } else if (sequence.simpleSelector.name == 'after') {
            afterRules.add(style);
          } else if (sequence.simpleSelector.name == 'first-letter') {
            firstLetterRules.add(style);
          } else if (sequence.simpleSelector.name == 'first-line') {
            firstLineRules.add(style);
          }
        }
      }
    }
  }

  if (beforeRules.isNotEmpty) {
    pseudoBeforeStyle = cascadeMatchedStyleRules(beforeRules);
    parentElement.markBeforePseudoElementNeedsUpdate();
  } else if (beforeRules.isEmpty && pseudoBeforeStyle != null) {
    pseudoBeforeStyle = null;
    parentElement.markBeforePseudoElementNeedsUpdate();
  }

  if (afterRules.isNotEmpty) {
    pseudoAfterStyle = cascadeMatchedStyleRules(afterRules);
    parentElement.markAfterPseudoElementNeedsUpdate();
  } else if (afterRules.isEmpty && pseudoAfterStyle != null) {
    pseudoAfterStyle = null;
    parentElement.markAfterPseudoElementNeedsUpdate();
  }

  if (firstLetterRules.isNotEmpty) {
    pseudoFirstLetterStyle = cascadeMatchedStyleRules(firstLetterRules);
    parentElement.markFirstLetterPseudoNeedsUpdate();
  } else if (firstLetterRules.isEmpty && pseudoFirstLetterStyle != null) {
    pseudoFirstLetterStyle = null;
    parentElement.markFirstLetterPseudoNeedsUpdate();
  }

  if (firstLineRules.isNotEmpty) {
    pseudoFirstLineStyle = cascadeMatchedStyleRules(firstLineRules);
    parentElement.markFirstLinePseudoNeedsUpdate();
  } else if (firstLineRules.isEmpty && pseudoFirstLineStyle != null) {
    pseudoFirstLineStyle = null;
    parentElement.markFirstLinePseudoNeedsUpdate();
  }
}