| Index: Source/core/css/resolver/StyleResolver.cpp
|
| diff --git a/Source/core/css/resolver/StyleResolver.cpp b/Source/core/css/resolver/StyleResolver.cpp
|
| index 879b2d86b50438fb68c5f4107590aa8640eee24b..9393ed60d2628a997653a2fa432ec8456025d8ca 100644
|
| --- a/Source/core/css/resolver/StyleResolver.cpp
|
| +++ b/Source/core/css/resolver/StyleResolver.cpp
|
| @@ -247,31 +247,21 @@ void StyleResolver::resetRuleFeatures()
|
| m_needCollectFeatures = true;
|
| }
|
|
|
| -void StyleResolver::addTreeBoundaryCrossingRules(const WillBeHeapVector<MinimalRuleData>& rules, ContainerNode* scope)
|
| -{
|
| - for (unsigned i = 0; i < rules.size(); ++i) {
|
| - const MinimalRuleData& info = rules[i];
|
| - m_treeBoundaryCrossingRules.addRule(info.m_rule, info.m_selectorIndex, scope, info.m_flags);
|
| - }
|
| -}
|
| -
|
| -void StyleResolver::processScopedRules(const RuleSet& authorRules, const KURL& sheetBaseURL, ContainerNode* scope)
|
| +void StyleResolver::processScopedRules(const RuleSet& authorRules, CSSStyleSheet* parentStyleSheet, ContainerNode& scope)
|
| {
|
| const WillBeHeapVector<RawPtrWillBeMember<StyleRuleKeyframes> > keyframesRules = authorRules.keyframesRules();
|
| for (unsigned i = 0; i < keyframesRules.size(); ++i)
|
| - ensureScopedStyleResolver(scope)->addKeyframeStyle(keyframesRules[i]);
|
| + ensureScopedStyleResolver(&scope)->addKeyframeStyle(keyframesRules[i]);
|
|
|
| - addTreeBoundaryCrossingRules(authorRules.treeBoundaryCrossingRules(), scope);
|
| + m_treeBoundaryCrossingRules.addTreeBoundaryCrossingRules(authorRules, scope, parentStyleSheet);
|
|
|
| // FIXME(BUG 72461): We don't add @font-face rules of scoped style sheets for the moment.
|
| - if (!scope || scope->isDocumentNode()) {
|
| + if (scope.isDocumentNode()) {
|
| const WillBeHeapVector<RawPtrWillBeMember<StyleRuleFontFace> > fontFaceRules = authorRules.fontFaceRules();
|
| for (unsigned i = 0; i < fontFaceRules.size(); ++i)
|
| addFontFaceRule(&m_document, document().styleEngine()->fontSelector(), fontFaceRules[i]);
|
| if (fontFaceRules.size())
|
| invalidateMatchedPropertiesCache();
|
| - } else {
|
| - addTreeBoundaryCrossingRules(authorRules.shadowDistributedRules(), scope);
|
| }
|
| }
|
|
|
| @@ -283,7 +273,7 @@ void StyleResolver::resetAuthorStyle(const ContainerNode* scopingNode)
|
| if (!resolver)
|
| return;
|
|
|
| - treeBoundaryCrossingRules().reset(scopingNode);
|
| + m_treeBoundaryCrossingRules.reset(scopingNode);
|
|
|
| resolver->resetAuthorStyle();
|
| resetRuleFeatures();
|
| @@ -400,37 +390,6 @@ StyleResolver::~StyleResolver()
|
| {
|
| }
|
|
|
| -inline void StyleResolver::collectTreeBoundaryCrossingRules(Element* element, ElementRuleCollector& collector, bool includeEmptyRules)
|
| -{
|
| - if (m_treeBoundaryCrossingRules.isEmpty())
|
| - return;
|
| -
|
| - // When comparing rules declared in outer treescopes, outer's rules win.
|
| - CascadeOrder outerCascadeOrder = m_treeBoundaryCrossingRules.size() + m_treeBoundaryCrossingRules.size();
|
| - // When comparing rules declared in inner treescopes, inner's rules win.
|
| - CascadeOrder innerCascadeOrder = m_treeBoundaryCrossingRules.size();
|
| -
|
| - for (DocumentOrderedList::iterator it = m_treeBoundaryCrossingRules.begin(); it != m_treeBoundaryCrossingRules.end(); ++it) {
|
| - const ContainerNode* scopingNode = toContainerNode(*it);
|
| - RuleSet* ruleSet = m_treeBoundaryCrossingRules.ruleSetScopedBy(scopingNode);
|
| - unsigned boundaryBehavior = SelectorChecker::ScopeContainsLastMatchedElement;
|
| - bool isInnerTreeScope = element->treeScope().isInclusiveAncestorOf(scopingNode->treeScope());
|
| -
|
| - // If a given scoping node is a shadow root and a given element is in a descendant tree of tree hosted by
|
| - // the scoping node's shadow host, we should use ScopeIsShadowHost.
|
| - if (scopingNode && scopingNode->isShadowRoot()) {
|
| - if (element->isInDescendantTreeOf(toShadowRoot(scopingNode)->host()))
|
| - boundaryBehavior |= SelectorChecker::ScopeIsShadowHost;
|
| - scopingNode = toShadowRoot(scopingNode)->host();
|
| - }
|
| -
|
| - CascadeOrder cascadeOrder = isInnerTreeScope ? innerCascadeOrder : outerCascadeOrder;
|
| - collector.collectMatchingRules(MatchRequest(ruleSet, includeEmptyRules, scopingNode), collector.matchedResult().ranges.authorRuleRange(), static_cast<SelectorChecker::BehaviorAtBoundary>(boundaryBehavior), ignoreCascadeScope, cascadeOrder);
|
| - ++innerCascadeOrder;
|
| - --outerCascadeOrder;
|
| - }
|
| -}
|
| -
|
| static inline bool applyAuthorStylesOf(const Element* element)
|
| {
|
| return element->treeScope().applyAuthorStyles() || (element->shadow() && element->shadow()->applyAuthorStyles());
|
| @@ -454,7 +413,7 @@ void StyleResolver::matchAuthorRulesForShadowHost(Element* element, ElementRuleC
|
| for (unsigned i = 0; i < resolvers.size(); ++i)
|
| resolvers.at(i)->collectMatchingAuthorRules(collector, includeEmptyRules, applyAuthorStyles, cascadeScope++, --cascadeOrder);
|
|
|
| - collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules);
|
| + m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules);
|
| collector.sortAndTransferMatchedRules();
|
| }
|
|
|
| @@ -466,7 +425,7 @@ void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col
|
| bool applyAuthorStyles = applyAuthorStylesOf(element);
|
| if (m_styleTree.hasOnlyScopedResolverForDocument()) {
|
| m_styleTree.scopedStyleResolverForDocument()->collectMatchingAuthorRules(collector, includeEmptyRules, applyAuthorStyles, ignoreCascadeScope);
|
| - collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules);
|
| + m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules);
|
| collector.sortAndTransferMatchedRules();
|
| return;
|
| }
|
| @@ -492,7 +451,7 @@ void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col
|
| resolver->collectMatchingAuthorRules(collector, includeEmptyRules, applyAuthorStyles, cascadeScope++, resolver->treeScope() == element->treeScope() && resolver->scopingNode().isShadowRoot() ? 0 : cascadeOrder);
|
| }
|
|
|
| - collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules);
|
| + m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules);
|
| collector.sortAndTransferMatchedRules();
|
| }
|
|
|
|
|