Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / dom / SelectorQuery.cpp
index df39a55..fa403da 100644 (file)
@@ -358,22 +358,26 @@ static ContainerNode* nextTraversingShadowTree(const ContainerNode& node, const
     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>
@@ -403,10 +407,12 @@ 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;
     }