if (ShadowRoot* shadowRoot = authorShadowRootOf(node))
return shadowRoot;
- if (Element* next = ElementTraversal::next(node, rootNode))
- return next;
-
- if (!node.isInShadowTree())
- return 0;
+ const ContainerNode* current = &node;
+ while (current) {
+ if (Element* next = ElementTraversal::next(*current, rootNode))
+ return next;
+
+ if (!current->isInShadowTree())
+ return 0;
+
+ ShadowRoot* shadowRoot = current->containingShadowRoot();
+ if (shadowRoot == rootNode)
+ return 0;
+ if (ShadowRoot* youngerShadowRoot = shadowRoot->youngerShadowRoot()) {
+ // Should not obtain any elements in user-agent shadow root.
+ ASSERT(youngerShadowRoot->type() == ShadowRoot::AuthorShadowRoot);
+ return youngerShadowRoot;
+ }
- ShadowRoot* shadowRoot = node.containingShadowRoot();
- if (shadowRoot == rootNode)
- return 0;
- if (ShadowRoot* youngerShadowRoot = shadowRoot->youngerShadowRoot()) {
- // Should not obtain any elements in user-agent shadow root.
- ASSERT(youngerShadowRoot->type() == ShadowRoot::AuthorShadowRoot);
- return youngerShadowRoot;
+ current = shadowRoot->host();
}
- Element* shadowHost = shadowRoot->host();
- return ElementTraversal::next(*shadowHost, rootNode);
+ return 0;
}
template <typename SelectorQueryTrait>
void SelectorDataList::execute(ContainerNode& rootNode, typename SelectorQueryTrait::OutputType& output) const
{
if (!canUseFastQuery(rootNode)) {
- if (m_crossesTreeBoundary)
+ if (m_crossesTreeBoundary) {
+ rootNode.document().updateDistributionForNodeIfNeeded(&rootNode);
executeSlowTraversingShadowTree<SelectorQueryTrait>(rootNode, output);
- else
+ } else {
executeSlow<SelectorQueryTrait>(rootNode, output);
+ }
return;
}