void ScopedStyleResolver::matchAuthorRules(ElementRuleCollector& collector, bool includeEmptyRules, bool applyAuthorStyles) { if (m_authorStyle) { collector.clearMatchedRules(); collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult().matchedProperties.size() - 1; // Match author rules. MatchRequest matchRequest(m_authorStyle.get(), includeEmptyRules, m_scopingNode); StyleResolver::RuleRange ruleRange = collector.matchedResult().ranges.authorRuleRange(); collector.setBehaviorAtBoundary(applyAuthorStyles ? SelectorChecker::DoesNotCrossBoundary : static_cast<SelectorChecker::BehaviorAtBoundary>(SelectorChecker::DoesNotCrossBoundary | SelectorChecker::ScopeContainsLastMatchedElement)); collector.collectMatchingRules(matchRequest, ruleRange); collector.collectMatchingRulesForRegion(matchRequest, ruleRange); collector.sortAndTransferMatchedRules(); } }
void ScopedStyleResolver::collectMatchingAuthorRules(ElementRuleCollector& collector, bool includeEmptyRules, bool applyAuthorStyles, CascadeScope cascadeScope, CascadeOrder cascadeOrder) { if (!m_authorStyle) return; const ContainerNode* scopingNode = &m_scopingNode; unsigned behaviorAtBoundary = SelectorChecker::DoesNotCrossBoundary; if (!applyAuthorStyles) behaviorAtBoundary |= SelectorChecker::ScopeContainsLastMatchedElement; if (m_scopingNode.isShadowRoot()) { scopingNode = toShadowRoot(m_scopingNode).host(); behaviorAtBoundary |= SelectorChecker::ScopeIsShadowHost; } MatchRequest matchRequest(m_authorStyle.get(), includeEmptyRules, scopingNode, applyAuthorStyles); RuleRange ruleRange = collector.matchedResult().ranges.authorRuleRange(); collector.collectMatchingRules(matchRequest, ruleRange, static_cast<SelectorChecker::BehaviorAtBoundary>(behaviorAtBoundary), cascadeScope, cascadeOrder); collector.collectMatchingRulesForRegion(matchRequest, ruleRange, static_cast<SelectorChecker::BehaviorAtBoundary>(behaviorAtBoundary), cascadeScope, cascadeOrder); }