Index: Source/core/css/ElementRuleCollector.cpp |
diff --git a/Source/core/css/ElementRuleCollector.cpp b/Source/core/css/ElementRuleCollector.cpp |
index f2d222b482ccd07df9c0c35a09c992fac3e364cd..21cfe95ad3946f088626dd5bd6b09c4ba395804b 100644 |
--- a/Source/core/css/ElementRuleCollector.cpp |
+++ b/Source/core/css/ElementRuleCollector.cpp |
@@ -206,57 +206,66 @@ inline bool ElementRuleCollector::ruleMatches(const RuleData& ruleData, const Co |
return true; |
} |
-void ElementRuleCollector::collectMatchingRulesForList(const Vector<RuleData>* rules, const MatchRequest& matchRequest, StyleResolver::RuleRange& ruleRange) |
+void ElementRuleCollector::collectRuleIfMatches(const RuleData& ruleData, const MatchRequest& matchRequest, StyleResolver::RuleRange& ruleRange) |
{ |
- if (!rules) |
+ if (m_canUseFastReject && m_selectorFilter.fastRejectSelector<RuleData::maximumIdentifierCount>(ruleData.descendantSelectorIdentifierHashes())) |
return; |
- const StyleResolverState& state = m_state; |
- |
- unsigned size = rules->size(); |
- for (unsigned i = 0; i < size; ++i) { |
- const RuleData& ruleData = rules->at(i); |
- if (m_canUseFastReject && m_selectorFilter.fastRejectSelector<RuleData::maximumIdentifierCount>(ruleData.descendantSelectorIdentifierHashes())) |
- continue; |
- |
- StyleRule* rule = ruleData.rule(); |
- InspectorInstrumentationCookie cookie = InspectorInstrumentation::willMatchRule(document(), rule, m_inspectorCSSOMWrappers, document()->styleSheetCollection()); |
- PseudoId dynamicPseudo = NOPSEUDO; |
- if (ruleMatches(ruleData, matchRequest.scope, dynamicPseudo)) { |
- // If the rule has no properties to apply, then ignore it in the non-debug mode. |
- const StylePropertySet* properties = rule->properties(); |
- if (!properties || (properties->isEmpty() && !matchRequest.includeEmptyRules)) { |
- InspectorInstrumentation::didMatchRule(cookie, false); |
- continue; |
- } |
- // FIXME: Exposing the non-standard getMatchedCSSRules API to web is the only reason this is needed. |
- if (m_sameOriginOnly && !ruleData.hasDocumentSecurityOrigin()) { |
+ StyleRule* rule = ruleData.rule(); |
+ InspectorInstrumentationCookie cookie = InspectorInstrumentation::willMatchRule(document(), rule, m_inspectorCSSOMWrappers, document()->styleSheetCollection()); |
+ PseudoId dynamicPseudo = NOPSEUDO; |
+ if (ruleMatches(ruleData, matchRequest.scope, dynamicPseudo)) { |
+ // If the rule has no properties to apply, then ignore it in the non-debug mode. |
+ const StylePropertySet* properties = rule->properties(); |
+ if (!properties || (properties->isEmpty() && !matchRequest.includeEmptyRules)) { |
+ InspectorInstrumentation::didMatchRule(cookie, false); |
+ return; |
+ } |
+ // FIXME: Exposing the non-standard getMatchedCSSRules API to web is the only reason this is needed. |
+ if (m_sameOriginOnly && !ruleData.hasDocumentSecurityOrigin()) { |
+ InspectorInstrumentation::didMatchRule(cookie, false); |
+ return; |
+ } |
+ // If we're matching normal rules, set a pseudo bit if |
+ // we really just matched a pseudo-element. |
+ if (dynamicPseudo != NOPSEUDO && m_pseudoStyleRequest.pseudoId == NOPSEUDO) { |
+ if (m_mode == SelectorChecker::CollectingRules) { |
InspectorInstrumentation::didMatchRule(cookie, false); |
- continue; |
- } |
- // If we're matching normal rules, set a pseudo bit if |
- // we really just matched a pseudo-element. |
- if (dynamicPseudo != NOPSEUDO && m_pseudoStyleRequest.pseudoId == NOPSEUDO) { |
- if (m_mode == SelectorChecker::CollectingRules) { |
- InspectorInstrumentation::didMatchRule(cookie, false); |
- continue; |
- } |
- if (dynamicPseudo < FIRST_INTERNAL_PSEUDOID) |
- state.style()->setHasPseudoStyle(dynamicPseudo); |
- } else { |
- // Update our first/last rule indices in the matched rules array. |
- ++ruleRange.lastRuleIndex; |
- if (ruleRange.firstRuleIndex == -1) |
- ruleRange.firstRuleIndex = ruleRange.lastRuleIndex; |
- |
- // Add this rule to our list of matched rules. |
- addMatchedRule(&ruleData); |
- InspectorInstrumentation::didMatchRule(cookie, true); |
- continue; |
+ return; |
} |
+ if (dynamicPseudo < FIRST_INTERNAL_PSEUDOID) |
+ m_state.style()->setHasPseudoStyle(dynamicPseudo); |
+ } else { |
+ // Update our first/last rule indices in the matched rules array. |
+ ++ruleRange.lastRuleIndex; |
+ if (ruleRange.firstRuleIndex == -1) |
+ ruleRange.firstRuleIndex = ruleRange.lastRuleIndex; |
+ |
+ // Add this rule to our list of matched rules. |
+ addMatchedRule(&ruleData); |
+ InspectorInstrumentation::didMatchRule(cookie, true); |
+ return; |
} |
- InspectorInstrumentation::didMatchRule(cookie, false); |
} |
+ InspectorInstrumentation::didMatchRule(cookie, false); |
+} |
+ |
+void ElementRuleCollector::collectMatchingRulesForList(const RuleData* rules, const MatchRequest& matchRequest, StyleResolver::RuleRange& ruleRange) |
+{ |
+ if (!rules) |
+ return; |
+ while (!rules->isLastInArray()) |
+ collectRuleIfMatches(*rules++, matchRequest, ruleRange); |
+ collectRuleIfMatches(*rules, matchRequest, ruleRange); |
+} |
+ |
+void ElementRuleCollector::collectMatchingRulesForList(const Vector<RuleData>* rules, const MatchRequest& matchRequest, StyleResolver::RuleRange& ruleRange) |
+{ |
+ if (!rules) |
+ return; |
+ unsigned size = rules->size(); |
+ for (unsigned i = 0; i < size; ++i) |
+ collectRuleIfMatches(rules->at(i), matchRequest, ruleRange); |
} |
static inline bool compareRules(const RuleData* r1, const RuleData* r2) |