Source/WebCore: Update comment regarding root node handling in XPath for detached...
authorcevans@google.com <cevans@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Aug 2012 20:51:57 +0000 (20:51 +0000)
committercevans@google.com <cevans@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Aug 2012 20:51:57 +0000 (20:51 +0000)
https://bugs.webkit.org/show_bug.cgi?id=36427

Reviewed by Alexey Proskuryakov.

* xml/XPathPath.cpp:
(WebCore::XPath::LocationPath::evaluate): Update XPath root node comment.

LayoutTests: Improve xpath-detached-nodes.html test.
https://bugs.webkit.org/show_bug.cgi?id=36427

Reviewed by Alexey Proskuryakov.

* fast/xpath/xpath-detached-nodes-expected.txt:
* fast/xpath/xpath-detached-nodes.html: Increase coverage and improve log messages.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@126621 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/xpath/xpath-detached-nodes-expected.txt
LayoutTests/fast/xpath/xpath-detached-nodes.html
Source/WebCore/ChangeLog
Source/WebCore/xml/XPathPath.cpp

index 9410752..2bc75e2 100644 (file)
@@ -1,3 +1,13 @@
+2012-08-24  Chris Evans  <cevans@google.com>
+
+        Improve xpath-detached-nodes.html test.
+        https://bugs.webkit.org/show_bug.cgi?id=36427
+
+        Reviewed by Alexey Proskuryakov.
+
+        * fast/xpath/xpath-detached-nodes-expected.txt:
+        * fast/xpath/xpath-detached-nodes.html: Increase coverage and improve log messages.
+
 2012-08-24  Sheriff Bot  <webkit.review.bot@gmail.com>
 
         Unreviewed, rolling out r126606.
index 3f126f0..0378b71 100644 (file)
@@ -1,11 +1,19 @@
 This tests XPath expressions on detached document fragments and nodes. 
 See https://bugs.webkit.org/show_bug.cgi?id=36427
 
-PASS result.numberValue is 1
-PASS result.numberValue is 0
-PASS result.numberValue is 1
-PASS result.numberValue is 0
-PASS result.numberValue is NaN
+PASS document.evaluate('count(/div)', child, null, XPathResult.NUMBER_TYPE, null).numberValue is 1
+PASS document.evaluate('count(/html)', child, null, XPathResult.NUMBER_TYPE, null).numberValue is 0
+PASS document.evaluate('count(/)', child, null, XPathResult.NUMBER_TYPE, null).numberValue is 1
+PASS document.evaluate('count(//html)', child, null, XPathResult.NUMBER_TYPE, null).numberValue is 0
+PASS document.evaluate('count(//div)', child, null, XPathResult.NUMBER_TYPE, null).numberValue is 1
+PASS document.evaluate('count(//h2)', child, null, XPathResult.NUMBER_TYPE, null).numberValue is 1
+PASS document.evaluate('count(/h1)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue is 1
+PASS document.evaluate('count(/html)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue is 0
+PASS document.evaluate('count(/)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue is 1
+PASS document.evaluate('count(//html)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue is 0
+PASS document.evaluate('count(//p)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue is 0
+PASS document.evaluate('count(//h1)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue is 1
+PASS document.evaluate('/* | *', ele, null, XPathResult.NUMBER_TYPE, null).numberValue is NaN
 PASS successfullyParsed is true
 
 TEST COMPLETE
index fa75d38..44c9155 100644 (file)
@@ -9,30 +9,39 @@
 <div id="console"></div>
 
 <script>
-  if (window.testRunner)
-    testRunner.dumpAsText();
-
   frag = document.createDocumentFragment();
   child = document.createElement('div');
   frag.appendChild(child);
-  result = document.evaluate("count(/div)",
-                             child, null, XPathResult.NUMBER_TYPE, null);
-  shouldBe("result.numberValue", "1");
-  result = document.evaluate("count(/html)",
-                             child, null, XPathResult.NUMBER_TYPE, null);
-  shouldBe("result.numberValue", "0");
+  child.appendChild(document.createElement('h2'));
+  shouldBe("document.evaluate('count(/div)', child, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "1");
+  shouldBe("document.evaluate('count(/html)', child, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "0");
+  shouldBe("document.evaluate('count(/)', child, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "1");
+  shouldBe("document.evaluate('count(//html)', child, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "0");
+  shouldBe("document.evaluate('count(//div)', child, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "1");
+  shouldBe("document.evaluate('count(//h2)', child, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "1");
 
   ele = document.createElement('p');
   ele.appendChild(document.createElement('h1'));
-  result = document.evaluate("count(/h1)",
-                             ele, null, XPathResult.NUMBER_TYPE, null);
-  shouldBe("result.numberValue", "1");
-  result = document.evaluate("count(/html)",
-                             ele, null, XPathResult.NUMBER_TYPE, null);
-  shouldBe("result.numberValue", "0");
-  result = document.evaluate("/* | *",
-                             ele, null, XPathResult.NUMBER_TYPE, null);
-  shouldBe("result.numberValue", "NaN");
+  shouldBe("document.evaluate('count(/h1)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "1");
+  shouldBe("document.evaluate('count(/html)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "0");
+  shouldBe("document.evaluate('count(/)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "1");
+  shouldBe("document.evaluate('count(//html)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "0");
+  shouldBe("document.evaluate('count(//p)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "0");
+  shouldBe("document.evaluate('count(//h1)', ele, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "1");
+  shouldBe("document.evaluate('/* | *', ele, null, XPathResult.NUMBER_TYPE, null).numberValue",
+           "NaN");
 </script>
 <script src="../js/resources/js-test-post.js"></script>
 </body>
index 45f6a9e..f80c546 100644 (file)
@@ -1,3 +1,13 @@
+2012-08-24  Chris Evans  <cevans@google.com>
+
+        Update comment regarding root node handling in XPath for detached trees.
+        https://bugs.webkit.org/show_bug.cgi?id=36427
+
+        Reviewed by Alexey Proskuryakov.
+
+        * xml/XPathPath.cpp:
+        (WebCore::XPath::LocationPath::evaluate): Update XPath root node comment.
+
 2012-08-24  Justin Novosad  <junov@chromium.org>
 
         [Chromium] Implementing a global limit on memory consumed by deferred 2D canvases
index db88c98..bc8a63a 100644 (file)
@@ -93,9 +93,14 @@ 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 for attached nodes, otherwise the root
-    // node of the detached subtree is used.
+    // 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)  {
         if (context->inDocument())