WebCore:
authormjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Mar 2008 03:50:33 +0000 (03:50 +0000)
committermjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Mar 2008 03:50:33 +0000 (03:50 +0000)
2008-03-16  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - fixed "Acid3 expects different exceptions for surroundContents calls involving comment nodes (affects Acid3 test 11)"
        http://bugs.webkit.org/show_bug.cgi?id=17509

        This gets us to 92/100

        * dom/Range.cpp:
        (WebCore::Range::surroundContents): Check for
        HIERARCHY_REQUEST_ERR before BAD_BOUNDARYPOINTS_ERR, since Acid3
        expects exceptional conditions to be tested in the order that the
        spec lists them. Also, adjust the HIERARCHY_REQUEST_ERR check. If
        the start point of the range is in a comment node, the node that
        would be the parent of a partial replacement is actually the
        comment node's parent (since comment nodes have character
        indices), so we should do the HIERARCHY_REQUEST_ERR check based on
        the parent of the comment node, as for text nodes, even though it
        will fail later with a different exception because it is not
        allowed to surround a partially selected non-text node.

LayoutTests:

2008-03-16  Maciej Stachowiak  <mjs@apple.com>

        Reviewed by Darin.

        - test for "Acid3 expects different exceptions for surroundContents calls involving comment nodes (affects Acid3 test 11)"
        http://bugs.webkit.org/show_bug.cgi?id=17509

        * fast/dom/Range/acid3-surround-contents-expected.txt: Added.
        * fast/dom/Range/acid3-surround-contents.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/fast/dom/Range/acid3-surround-contents-expected.txt [new file with mode: 0644]
LayoutTests/fast/dom/Range/acid3-surround-contents.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/dom/Range.cpp

index 43a33bb9ab748153ba3cb6815bc4f76f865efcd2..90078e655f59d9f66e29501419e9e18608158475 100644 (file)
@@ -1,3 +1,13 @@
+2008-03-16  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Darin.
+
+        - test for "Acid3 expects different exceptions for surroundContents calls involving comment nodes (affects Acid3 test 11)"
+        http://bugs.webkit.org/show_bug.cgi?id=17509
+        
+        * fast/dom/Range/acid3-surround-contents-expected.txt: Added.
+        * fast/dom/Range/acid3-surround-contents.html: Added.
+
 2008-03-16  Marvin Decker  <marv.decker@gmail.com>
 
         Reviewed by Darin.
diff --git a/LayoutTests/fast/dom/Range/acid3-surround-contents-expected.txt b/LayoutTests/fast/dom/Range/acid3-surround-contents-expected.txt
new file mode 100644 (file)
index 0000000..5ddf6aa
--- /dev/null
@@ -0,0 +1,5 @@
+
+The test below should report no failures, and should say PASS at the end.
+
+PASS
+
diff --git a/LayoutTests/fast/dom/Range/acid3-surround-contents.html b/LayoutTests/fast/dom/Range/acid3-surround-contents.html
new file mode 100644 (file)
index 0000000..732355a
--- /dev/null
@@ -0,0 +1,81 @@
+<iframe src="empty.html" id="selectors" width=0 height=0 frameborder=0></iframe>
+<p>The test below should report no failures, and should say PASS at the end.</p>
+<script>
+if (window.layoutTestController) {
+    layoutTestController.dumpAsText();
+}
+</script>
+<script>
+
+  function getTestDocument() {
+    var iframe = document.getElementById("selectors");
+    var doc = iframe.contentDocument;
+    for (var i = doc.documentElement.childNodes.length-1; i >= 0; i -= 1)
+      doc.documentElement.removeChild(doc.documentElement.childNodes[i]);
+    doc.documentElement.appendChild(doc.createElement('head'));
+    doc.documentElement.firstChild.appendChild(doc.createElement('title'));
+    doc.documentElement.appendChild(doc.createElement('body'));
+    return doc;
+  }
+
+var failCount = 0;
+
+  function fail(message) {
+    document.write(message.replace("&", "&amp;").replace("<", "&lt;") + "<br>");
+    ++failCount;
+  }
+
+  function assert(condition, message) {
+    if (!condition)
+      fail(message);
+  }
+
+  function assertEquals(expression, value, message) {
+    if (expression != value) {
+      expression = (""+expression).replace(/[\r\n]+/g, "\\n");
+      value = (""+value).replace(/\r?\n/g, "\\n");
+      fail("expected '" + value + "' but got '" + expression + "' - " + message);
+    }
+  }
+
+      // test 11: Ranges and Comments
+      var msg;
+      var doc = getTestDocument();
+      var c1 = doc.createComment("11111");
+      doc.appendChild(c1);
+      var r = doc.createRange();
+      r.selectNode(c1);
+      msg = 'wrong exception raised';
+      try {
+        r.surroundContents(doc.createElement('a'));
+        msg = 'no exception raised';
+      } catch (e) {
+        if ('code' in e)
+          msg += '; code = ' + e.code;
+        if (e.code == 3)
+          msg = '';
+      }
+      assert(msg == '', "when inserting <a> into Document with another child: " + msg);
+      var c2 = doc.createComment("22222");
+      doc.body.appendChild(c2);
+      var c3 = doc.createComment("33333");
+      doc.body.appendChild(c3);
+      r.setStart(c2, 2);
+      r.setEnd(c3, 3);
+      var msg = 'wrong exception raised';
+      try {
+        r.surroundContents(doc.createElement('a'));
+        msg = 'no exception raised';
+      } catch (e) {
+        if ('code' in e)
+          msg += '; code = ' + e.code;
+        if (e.code == 1)
+          msg = '';
+      }
+      assert(msg == '', "when trying to surround two halves of comment: " + msg);
+      assertEquals(r.toString(), "", "comments returned text");
+
+if (failCount == 0)
+  document.write("PASS<br>");
+</script>
+
index 2cf8885980eeb466b5c1407e88e8edd520d8e58b..5be7c5dfd4a186e6ccd3af6eec32e76d31e98a94 100644 (file)
@@ -1,3 +1,25 @@
+2008-03-16  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Darin.
+
+        - fixed "Acid3 expects different exceptions for surroundContents calls involving comment nodes (affects Acid3 test 11)"
+        http://bugs.webkit.org/show_bug.cgi?id=17509
+        
+        This gets us to 92/100
+
+        * dom/Range.cpp:
+        (WebCore::Range::surroundContents): Check for
+        HIERARCHY_REQUEST_ERR before BAD_BOUNDARYPOINTS_ERR, since Acid3
+        expects exceptional conditions to be tested in the order that the
+        spec lists them. Also, adjust the HIERARCHY_REQUEST_ERR check. If
+        the start point of the range is in a comment node, the node that
+        would be the parent of a partial replacement is actually the
+        comment node's parent (since comment nodes have character
+        indices), so we should do the HIERARCHY_REQUEST_ERR check based on
+        the parent of the comment node, as for text nodes, even though it
+        will fail later with a different exception because it is not
+        allowed to surround a partially selected non-text node.
+
 2008-03-16  Marvin Decker  <marv.decker@gmail.com>
 
         Reviewed by Darin.
index d14b9226afad6205037f74e6de4bbcbf4aa16415..67e52e232e191ad227df97e939e3fa808ef898d6 100644 (file)
@@ -1405,25 +1405,12 @@ void Range::surroundContents(PassRefPtr<Node> passNewParent, ExceptionCode& ec)
         return;
     }
 
-    // BAD_BOUNDARYPOINTS_ERR: Raised if the Range partially selects a non-Text node.
-    if (m_start.container->nodeType() != Node::TEXT_NODE) {
-        if (m_start.offset > 0 && m_start.offset < maxStartOffset()) {
-            ec = RangeException::BAD_BOUNDARYPOINTS_ERR;
-            return;
-        }
-    }
-    if (m_end.container->nodeType() != Node::TEXT_NODE) {
-        if (m_end.offset > 0 && m_end.offset < maxEndOffset()) {
-            ec = RangeException::BAD_BOUNDARYPOINTS_ERR;
-            return;
-        }
-    }    
-
     // Raise a HIERARCHY_REQUEST_ERR if m_start.container doesn't accept children like newParent.
     Node* parentOfNewParent = m_start.container.get();
-    // If m_start.container is a textNode, it will be split and it will be its parent that will 
-    // need to accept newParent.
-    if (parentOfNewParent->isTextNode())
+
+    // If m_start.container is a character data node, it will be split and it will be its parent that will 
+    // need to accept newParent (or in the case of a comment, it logically "would"
+    if (parentOfNewParent->isCharacterDataNode())
         parentOfNewParent = parentOfNewParent->parentNode();
     if (!parentOfNewParent->childTypeAllowed(newParent->nodeType())) {
         ec = HIERARCHY_REQUEST_ERR;
@@ -1438,6 +1425,20 @@ void Range::surroundContents(PassRefPtr<Node> passNewParent, ExceptionCode& ec)
     // FIXME: Do we need a check if the node would end up with a child node of a type not
     // allowed by the type of node?
 
+    // BAD_BOUNDARYPOINTS_ERR: Raised if the Range partially selects a non-Text node.
+    if (m_start.container->nodeType() != Node::TEXT_NODE) {
+        if (m_start.offset > 0 && m_start.offset < maxStartOffset()) {
+            ec = RangeException::BAD_BOUNDARYPOINTS_ERR;
+            return;
+        }
+    }
+    if (m_end.container->nodeType() != Node::TEXT_NODE) {
+        if (m_end.offset > 0 && m_end.offset < maxEndOffset()) {
+            ec = RangeException::BAD_BOUNDARYPOINTS_ERR;
+            return;
+        }
+    }    
+
     ec = 0;
     while (Node* n = newParent->firstChild()) {
         newParent->removeChild(n, ec);