Index: Source/core/css/resolver/StyleResolver.cpp |
diff --git a/Source/core/css/resolver/StyleResolver.cpp b/Source/core/css/resolver/StyleResolver.cpp |
index 074eeb7c96183fe2185425ff32ef00c2ba0f2bda..5b3ff5fd72757407a9dc62c659438c5cd57f5154 100644 |
--- a/Source/core/css/resolver/StyleResolver.cpp |
+++ b/Source/core/css/resolver/StyleResolver.cpp |
@@ -386,25 +386,42 @@ StyleResolver::~StyleResolver() |
{ |
} |
-void StyleResolver::matchAuthorRulesForShadowHost(Element* element, ElementRuleCollector& collector, bool includeEmptyRules, WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8>& resolvers, WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8>& resolversInShadowTree) |
+static inline ScopedStyleResolver* scopedResolverFor(const Element* element) |
{ |
- collector.clearMatchedRules(); |
- collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult().matchedProperties.size() - 1; |
+ // Ideally, returning element->treeScope().scopedStyleResolver() should be |
+ // enough, but ::cue and custom pseudo elements like ::-webkit-meter-bar pierce |
+ // through a shadow dom boundary, yet they are not part of m_treeBoundaryCrossingRules. |
+ // The assumption here is that these rules only pierce through one boundary and |
+ // that the scope of these elements do not have a style resolver due to the fact |
+ // that VTT scopes and UA shadow trees don't have <style> elements. This is |
+ // backed up by the ASSERTs below. |
+ // |
+ // FIXME: Make ::cue and custom pseudo elements part of boundary crossing rules |
+ // when moving those rules to ScopedStyleResolver as part of issue 401359. |
+ |
+ TreeScope* treeScope = &element->treeScope(); |
+ if (ScopedStyleResolver* resolver = treeScope->scopedStyleResolver()) { |
+ ASSERT(element->shadowPseudoId().isEmpty()); |
+ ASSERT(!element->isVTTElement()); |
+ return resolver; |
+ } |
- CascadeScope cascadeScope = 0; |
- CascadeOrder cascadeOrder = 0; |
+ treeScope = treeScope->parentTreeScope(); |
+ if (!treeScope) |
+ return nullptr; |
+ if (element->shadowPseudoId().isEmpty() && !element->isVTTElement()) |
+ return nullptr; |
+ return treeScope->scopedStyleResolver(); |
+} |
+void StyleResolver::matchAuthorRulesForShadowHost(Element* element, ElementRuleCollector& collector, bool includeEmptyRules, WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8>& resolversInShadowTree) |
+{ |
+ CascadeOrder cascadeOrder = 0; |
for (int j = resolversInShadowTree.size() - 1; j >= 0; --j) |
- resolversInShadowTree.at(j)->collectMatchingShadowHostRules(collector, includeEmptyRules, cascadeScope, cascadeOrder++); |
+ resolversInShadowTree.at(j)->collectMatchingShadowHostRules(collector, includeEmptyRules, cascadeOrder++); |
- if (resolvers.isEmpty() || resolvers.first()->treeScope() != element->treeScope()) |
- ++cascadeScope; |
- cascadeOrder += resolvers.size(); |
- for (unsigned i = 0; i < resolvers.size(); ++i) |
- resolvers.at(i)->collectMatchingAuthorRules(collector, includeEmptyRules, cascadeScope++, --cascadeOrder); |
- |
- m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules); |
- collector.sortAndTransferMatchedRules(); |
+ if (ScopedStyleResolver* resolver = scopedResolverFor(element)) |
+ resolver->collectMatchingAuthorRules(collector, includeEmptyRules, cascadeOrder); |
} |
void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& collector, bool includeEmptyRules) |
@@ -414,35 +431,22 @@ void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col |
if (document().styleEngine()->onlyDocumentHasStyles()) { |
ScopedStyleResolver* resolver = document().scopedStyleResolver(); |
- if (!resolver) |
- return; |
// If we have no resolver for a document, the document has no styles. |
// We don't need to see any rules (including treeboundary crossing ones). |
- resolver->collectMatchingAuthorRules(collector, includeEmptyRules, ignoreCascadeScope); |
+ if (!resolver) |
+ return; |
+ resolver->collectMatchingAuthorRules(collector, includeEmptyRules); |
m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules); |
collector.sortAndTransferMatchedRules(); |
return; |
} |
- WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolvers; |
- resolveScopedStyles(element, resolvers); |
- |
WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolversInShadowTree; |
collectScopedResolversForHostedShadowTrees(element, resolversInShadowTree); |
- if (!resolversInShadowTree.isEmpty()) { |
- matchAuthorRulesForShadowHost(element, collector, includeEmptyRules, resolvers, resolversInShadowTree); |
- return; |
- } |
- |
- if (!resolvers.isEmpty()) { |
- CascadeScope cascadeScope = 0; |
- CascadeOrder cascadeOrder = resolvers.size(); |
- for (unsigned i = 0; i < resolvers.size(); ++i, --cascadeOrder) { |
- ScopedStyleResolver* resolver = resolvers.at(i); |
- // FIXME: Need to clarify how to treat style scoped. |
- resolver->collectMatchingAuthorRules(collector, includeEmptyRules, cascadeScope++, resolver->treeScope() == element->treeScope() && resolver->treeScope().rootNode().isShadowRoot() ? 0 : cascadeOrder); |
- } |
- } |
+ if (!resolversInShadowTree.isEmpty()) |
+ matchAuthorRulesForShadowHost(element, collector, includeEmptyRules, resolversInShadowTree); |
+ else if (ScopedStyleResolver* resolver = scopedResolverFor(element)) |
+ resolver->collectMatchingAuthorRules(collector, includeEmptyRules, resolver->treeScope().rootNode().isShadowRoot() ? 0 : 1); |
m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules); |
collector.sortAndTransferMatchedRules(); |
@@ -1023,21 +1027,6 @@ bool StyleResolver::applyAnimatedProperties(StyleResolverState& state, const Ele |
return true; |
} |
-static inline ScopedStyleResolver* scopedResolverFor(const Element* element) |
-{ |
- for (TreeScope* treeScope = &element->treeScope(); treeScope; treeScope = treeScope->parentTreeScope()) { |
- if (ScopedStyleResolver* scopedStyleResolver = treeScope->scopedStyleResolver()) |
- return scopedStyleResolver; |
- } |
- return 0; |
-} |
- |
-void StyleResolver::resolveScopedStyles(const Element* element, WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8>& resolvers) |
-{ |
- for (ScopedStyleResolver* scopedResolver = scopedResolverFor(element); scopedResolver; scopedResolver = scopedResolver->parent()) |
- resolvers.append(scopedResolver); |
-} |
- |
const StyleRuleKeyframes* StyleResolver::findKeyframesRule(const Element* element, const AtomicString& animationName) |
{ |
WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolvers; |