| Index: Source/core/css/ElementRuleCollector.cpp
|
| diff --git a/Source/core/css/ElementRuleCollector.cpp b/Source/core/css/ElementRuleCollector.cpp
|
| index 79ef923b697f87f6b70bc7ec3b5138a0efa88a02..2e41e29458df6495cc60305f4f4d7a9d3b022c12 100644
|
| --- a/Source/core/css/ElementRuleCollector.cpp
|
| +++ b/Source/core/css/ElementRuleCollector.cpp
|
| @@ -118,7 +118,7 @@ void ElementRuleCollector::addElementStyleProperties(const StylePropertySet* pro
|
| m_result.isCacheable = false;
|
| }
|
|
|
| -static bool rulesApplicableInCurrentTreeScope(const Element* element, const ContainerNode* scopingNode, SelectorChecker::BehaviorAtBoundary behaviorAtBoundary, bool elementApplyAuthorStyles)
|
| +static bool rulesApplicableInCurrentTreeScope(const Element* element, const ContainerNode* scopingNode, bool elementApplyAuthorStyles)
|
| {
|
| TreeScope& treeScope = element->treeScope();
|
|
|
| @@ -130,12 +130,12 @@ static bool rulesApplicableInCurrentTreeScope(const Element* element, const Cont
|
| if (!scopingNode || treeScope == scopingNode->treeScope())
|
| return true;
|
| // d) the rules comes from a scoped style sheet within an active shadow root whose host is the given element
|
| - if (SelectorChecker::isHostInItsShadowTree(*element, behaviorAtBoundary, scopingNode))
|
| + if (SelectorChecker::isHostInItsShadowTree(*element, scopingNode))
|
| return true;
|
| return false;
|
| }
|
|
|
| -void ElementRuleCollector::collectMatchingRules(const MatchRequest& matchRequest, RuleRange& ruleRange, SelectorChecker::BehaviorAtBoundary behaviorAtBoundary, CascadeScope cascadeScope, CascadeOrder cascadeOrder)
|
| +void ElementRuleCollector::collectMatchingRules(const MatchRequest& matchRequest, RuleRange& ruleRange, SelectorChecker::ContextFlags contextFlags, CascadeScope cascadeScope, CascadeOrder cascadeOrder)
|
| {
|
| ASSERT(matchRequest.ruleSet);
|
| ASSERT(m_context.element());
|
| @@ -144,11 +144,11 @@ void ElementRuleCollector::collectMatchingRules(const MatchRequest& matchRequest
|
| const AtomicString& pseudoId = element.shadowPseudoId();
|
| if (!pseudoId.isEmpty()) {
|
| ASSERT(element.isStyledElement());
|
| - collectMatchingRulesForList(matchRequest.ruleSet->shadowPseudoElementRules(pseudoId), behaviorAtBoundary, ignoreCascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| + collectMatchingRulesForList(matchRequest.ruleSet->shadowPseudoElementRules(pseudoId), contextFlags, ignoreCascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| }
|
|
|
| if (element.isVTTElement())
|
| - collectMatchingRulesForList(matchRequest.ruleSet->cuePseudoRules(), behaviorAtBoundary, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| + collectMatchingRulesForList(matchRequest.ruleSet->cuePseudoRules(), contextFlags, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| // Check whether other types of rules are applicable in the current tree scope. Criteria for this:
|
| // a) it's a UA rule
|
| // b) the tree scope allows author rules
|
| @@ -156,24 +156,24 @@ void ElementRuleCollector::collectMatchingRules(const MatchRequest& matchRequest
|
| // d) the rules comes from a scoped style sheet within an active shadow root whose host is the given element
|
| // e) the rules can cross boundaries
|
| // b)-e) is checked in rulesApplicableInCurrentTreeScope.
|
| - if (!m_matchingUARules && !rulesApplicableInCurrentTreeScope(&element, matchRequest.scope, behaviorAtBoundary, matchRequest.elementApplyAuthorStyles))
|
| + if (!m_matchingUARules && !rulesApplicableInCurrentTreeScope(&element, matchRequest.scope, matchRequest.elementApplyAuthorStyles))
|
| return;
|
|
|
| // We need to collect the rules for id, class, tag, and everything else into a buffer and
|
| // then sort the buffer.
|
| if (element.hasID())
|
| - collectMatchingRulesForList(matchRequest.ruleSet->idRules(element.idForStyleResolution()), behaviorAtBoundary, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| + collectMatchingRulesForList(matchRequest.ruleSet->idRules(element.idForStyleResolution()), contextFlags, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| if (element.isStyledElement() && element.hasClass()) {
|
| for (size_t i = 0; i < element.classNames().size(); ++i)
|
| - collectMatchingRulesForList(matchRequest.ruleSet->classRules(element.classNames()[i]), behaviorAtBoundary, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| + collectMatchingRulesForList(matchRequest.ruleSet->classRules(element.classNames()[i]), contextFlags, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| }
|
|
|
| if (element.isLink())
|
| - collectMatchingRulesForList(matchRequest.ruleSet->linkPseudoClassRules(), behaviorAtBoundary, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| + collectMatchingRulesForList(matchRequest.ruleSet->linkPseudoClassRules(), contextFlags, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| if (SelectorChecker::matchesFocusPseudoClass(element))
|
| - collectMatchingRulesForList(matchRequest.ruleSet->focusPseudoClassRules(), behaviorAtBoundary, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| - collectMatchingRulesForList(matchRequest.ruleSet->tagRules(element.localName()), behaviorAtBoundary, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| - collectMatchingRulesForList(matchRequest.ruleSet->universalRules(), behaviorAtBoundary, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| + collectMatchingRulesForList(matchRequest.ruleSet->focusPseudoClassRules(), contextFlags, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| + collectMatchingRulesForList(matchRequest.ruleSet->tagRules(element.localName()), contextFlags, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| + collectMatchingRulesForList(matchRequest.ruleSet->universalRules(), contextFlags, cascadeScope, cascadeOrder, matchRequest, ruleRange);
|
| }
|
|
|
| CSSRuleList* ElementRuleCollector::nestedRuleList(CSSRule* rule)
|
| @@ -257,7 +257,7 @@ void ElementRuleCollector::sortAndTransferMatchedRules()
|
| }
|
| }
|
|
|
| -inline bool ElementRuleCollector::ruleMatches(const RuleData& ruleData, const ContainerNode* scope, SelectorChecker::BehaviorAtBoundary behaviorAtBoundary, SelectorChecker::MatchResult* result)
|
| +inline bool ElementRuleCollector::ruleMatches(const RuleData& ruleData, const ContainerNode* scope, SelectorChecker::ContextFlags contextFlags, SelectorChecker::MatchResult* result)
|
| {
|
| SelectorChecker selectorChecker(m_context.element()->document(), m_mode);
|
| SelectorChecker::SelectorCheckingContext context(ruleData.selector(), m_context.element(), SelectorChecker::VisitedMatchEnabled);
|
| @@ -266,7 +266,7 @@ inline bool ElementRuleCollector::ruleMatches(const RuleData& ruleData, const Co
|
| context.pseudoId = m_pseudoStyleRequest.pseudoId;
|
| context.scrollbar = m_pseudoStyleRequest.scrollbar;
|
| context.scrollbarPart = m_pseudoStyleRequest.scrollbarPart;
|
| - context.behaviorAtBoundary = behaviorAtBoundary;
|
| + context.contextFlags = contextFlags;
|
| SelectorChecker::Match match = selectorChecker.match(context, DOMSiblingTraversalStrategy(), result);
|
| if (match != SelectorChecker::SelectorMatches)
|
| return false;
|
| @@ -275,14 +275,14 @@ inline bool ElementRuleCollector::ruleMatches(const RuleData& ruleData, const Co
|
| return true;
|
| }
|
|
|
| -void ElementRuleCollector::collectRuleIfMatches(const RuleData& ruleData, SelectorChecker::BehaviorAtBoundary behaviorAtBoundary, CascadeScope cascadeScope, CascadeOrder cascadeOrder, const MatchRequest& matchRequest, RuleRange& ruleRange)
|
| +void ElementRuleCollector::collectRuleIfMatches(const RuleData& ruleData, SelectorChecker::ContextFlags contextFlags, CascadeScope cascadeScope, CascadeOrder cascadeOrder, const MatchRequest& matchRequest, RuleRange& ruleRange)
|
| {
|
| if (m_canUseFastReject && m_selectorFilter.fastRejectSelector<RuleData::maximumIdentifierCount>(ruleData.descendantSelectorIdentifierHashes()))
|
| return;
|
|
|
| StyleRule* rule = ruleData.rule();
|
| SelectorChecker::MatchResult result;
|
| - if (ruleMatches(ruleData, matchRequest.scope, behaviorAtBoundary, &result)) {
|
| + if (ruleMatches(ruleData, matchRequest.scope, contextFlags, &result)) {
|
| // If the rule has no properties to apply, then ignore it in the non-debug mode.
|
| const StylePropertySet& properties = rule->properties();
|
| if (properties.isEmpty() && !matchRequest.includeEmptyRules)
|
| @@ -343,7 +343,7 @@ bool ElementRuleCollector::hasAnyMatchingRules(RuleSet* ruleSet)
|
| int firstRuleIndex = -1, lastRuleIndex = -1;
|
| RuleRange ruleRange(firstRuleIndex, lastRuleIndex);
|
| // FIXME: Verify whether it's ok to ignore CascadeScope here.
|
| - collectMatchingRules(MatchRequest(ruleSet), ruleRange, SelectorChecker::StaysWithinTreeScope);
|
| + collectMatchingRules(MatchRequest(ruleSet), ruleRange, SelectorChecker::DefaultBehavior);
|
|
|
| return m_matchedRules && !m_matchedRules->isEmpty();
|
| }
|
|
|