Generated should not be supported for things with a shadow
[WebKit-https.git] / Source / WebCore / xml / XPathPath.cpp
index 1a7ed3f..bc8a63a 100644 (file)
@@ -28,8 +28,6 @@
 #include "config.h"
 #include "XPathPath.h"
 
-#if ENABLE(XPATH)
-
 #include "Document.h"
 #include "XPathPredicate.h"
 #include "XPathStep.h"
@@ -95,11 +93,21 @@ Value LocationPath::evaluate() const
 {
     EvaluationContext& evaluationContext = Expression::evaluationContext();
     EvaluationContext backupContext = evaluationContext;
-    // For absolute location paths, the context node is ignored - the
-    // document's root node is used instead.
+    // http://www.w3.org/TR/xpath/
+    // Section 2, Location Paths:
+    // "/ selects the document root (which is always the parent of the document element)"
+    // "A / by itself selects the root node of the document containing the context node."
+    // In the case of a tree that is detached from the document, we violate
+    // the spec and treat / as the root node of the detached tree.
+    // This is for compatibility with Firefox, and also seems like a more
+    // logical treatment of where you would expect the "root" to be.
     Node* context = evaluationContext.node.get();
-    if (m_absolute && context->nodeType() != Node::DOCUMENT_NODE) 
-        context = context->ownerDocument();
+    if (m_absolute && context->nodeType() != Node::DOCUMENT_NODE)  {
+        if (context->inDocument())
+            context = context->ownerDocument();
+        else
+            context = context->highestAncestor();
+    }
 
     NodeSet nodes;
     nodes.append(context);
@@ -137,7 +145,7 @@ void LocationPath::evaluate(NodeSet& nodes) const
 
             for (size_t nodeIndex = 0; nodeIndex < matches.size(); ++nodeIndex) {
                 Node* node = matches[nodeIndex];
-                if (!needToCheckForDuplicateNodes || newNodesSet.add(node).second)
+                if (!needToCheckForDuplicateNodes || newNodesSet.add(node).isNewEntry)
                     newNodes.append(node);
             }
         }
@@ -205,5 +213,3 @@ Value Path::evaluate() const
 
 }
 }
-
-#endif // ENABLE(XPATH)