]> granicus.if.org Git - python/commitdiff
Fix appendChild() and insertBefore() (and replaceChild() indirectly) when
authorFred Drake <fdrake@acm.org>
Thu, 6 Dec 2001 04:32:18 +0000 (04:32 +0000)
committerFred Drake <fdrake@acm.org>
Thu, 6 Dec 2001 04:32:18 +0000 (04:32 +0000)
the node being added is a fragment node.
This closes SF bug #487929.

Lib/test/output/test_minidom
Lib/test/test_minidom.py
Lib/xml/dom/minidom.py

index b14f74e1ea10b67039a7e99dda7f7ed7f8f75145..14e88450256a4032f6751b03db3e3be019f08198 100644 (file)
@@ -19,6 +19,9 @@ Passed Test
 Passed Test
 Test Succeeded testAppendChild
 Passed assertion: len(Node.allnodes) == 0
+Passed appendChild(<fragment>)
+Test Succeeded testAppendChildFragment
+Passed assertion: len(Node.allnodes) == 0
 Test Succeeded testAttrListItem
 Passed assertion: len(Node.allnodes) == 0
 Test Succeeded testAttrListItemNS
@@ -122,6 +125,10 @@ Passed testInsertBefore -- node properly placed in tree
 Passed testInsertBefore -- node properly placed in tree
 Test Succeeded testInsertBefore
 Passed assertion: len(Node.allnodes) == 0
+Passed insertBefore(<fragment>, None)
+Passed insertBefore(<fragment>, orig)
+Test Succeeded testInsertBeforeFragment
+Passed assertion: len(Node.allnodes) == 0
 Test Succeeded testLegalChildren
 Passed assertion: len(Node.allnodes) == 0
 Passed test NodeList.item()
@@ -172,6 +179,9 @@ Passed Test
 Passed Test
 Test Succeeded testRemoveAttributeNode
 Passed assertion: len(Node.allnodes) == 0
+Passed replaceChild(<fragment>)
+Test Succeeded testReplaceChildFragment
+Passed assertion: len(Node.allnodes) == 0
 Passed testSAX2DOM - siblings
 Passed testSAX2DOM - parents
 Test Succeeded testSAX2DOM
index ab985b83e6fc61084b75b43e729dddf7cf180c3a..adac9900454de29c646d5f4437ab2593f6a35804 100644 (file)
@@ -79,6 +79,34 @@ def testInsertBefore():
             , "testInsertBefore -- node properly placed in tree")
     dom.unlink()
 
+def _create_fragment_test_nodes():
+    dom = parseString("<doc/>")
+    orig = dom.createTextNode("original")
+    c1 = dom.createTextNode("foo")
+    c2 = dom.createTextNode("bar")
+    c3 = dom.createTextNode("bat")
+    dom.documentElement.appendChild(orig)
+    frag = dom.createDocumentFragment()
+    frag.appendChild(c1)
+    frag.appendChild(c2)
+    frag.appendChild(c3)
+    return dom, orig, c1, c2, c3, frag
+
+def testInsertBeforeFragment():
+    dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
+    dom.documentElement.insertBefore(frag, None)
+    confirm(tuple(dom.documentElement.childNodes) == (orig, c1, c2, c3),
+            "insertBefore(<fragment>, None)")
+    frag.unlink()
+    dom.unlink()
+    #
+    dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
+    dom.documentElement.insertBefore(frag, orig)
+    confirm(tuple(dom.documentElement.childNodes) == (c1, c2, c3, orig),
+            "insertBefore(<fragment>, orig)")
+    frag.unlink()
+    dom.unlink()
+
 def testAppendChild():
     dom = parse(tstfile)
     dom.documentElement.appendChild(dom.createComment(u"Hello"))
@@ -86,6 +114,23 @@ def testAppendChild():
     confirm(dom.documentElement.childNodes[-1].data == "Hello")
     dom.unlink()
 
+def testAppendChildFragment():
+    dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
+    dom.documentElement.appendChild(frag)
+    confirm(tuple(dom.documentElement.childNodes) == (orig, c1, c2, c3),
+            "appendChild(<fragment>)")
+    frag.unlink()
+    dom.unlink()
+
+def testReplaceChildFragment():
+    dom, orig, c1, c2, c3, frag = _create_fragment_test_nodes()
+    dom.documentElement.replaceChild(frag, orig)
+    orig.unlink()
+    confirm(tuple(dom.documentElement.childNodes) == (c1, c2, c3),
+            "replaceChild(<fragment>)")
+    frag.unlink()
+    dom.unlink()
+
 def testLegalChildren():
     dom = Document()
     elem = dom.createElement('element')
index 5b26da773953dc42a65ebd69dde1945006360655..2e9d866e3190c6d4fc2ce28a678b3d125f258877 100644 (file)
@@ -132,7 +132,7 @@ class Node(xml.dom.Node):
 
     def insertBefore(self, newChild, refChild):
         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
-            for c in newChild.childNodes:
+            for c in tuple(newChild.childNodes):
                 self.insertBefore(c, refChild)
             ### The DOM does not clearly specify what to return in this case
             return newChild
@@ -160,7 +160,7 @@ class Node(xml.dom.Node):
 
     def appendChild(self, node):
         if node.nodeType == self.DOCUMENT_FRAGMENT_NODE:
-            for c in node.childNodes:
+            for c in tuple(node.childNodes):
                 self.appendChild(c)
             ### The DOM does not clearly specify what to return in this case
             return node