You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2009/04/14 23:37:00 UTC

svn commit: r764965 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/dom/Element.java test/java/org/apache/tapestry5/dom/DOMTest.java

Author: hlship
Date: Tue Apr 14 21:37:00 2009
New Revision: 764965

URL: http://svn.apache.org/viewvc?rev=764965&view=rev
Log:
TAP5-640: DOM manipulation during rendering can NPE

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/dom/Element.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/dom/DOMTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/dom/Element.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/dom/Element.java?rev=764965&r1=764964&r2=764965&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/dom/Element.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/dom/Element.java Tue Apr 14 21:37:00 2009
@@ -893,8 +893,13 @@
                 else
                     firstChild = afterNode;
 
-                if (afterNode == null)
-                    lastChild = afterNode;
+                // If node was the final node in the element then handle deletion.
+                // It's even possible node was the only node in the container.
+
+                if (lastChild == node)
+                {
+                    lastChild = prior != null ? prior : null;
+                }
 
                 return;
             }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/dom/DOMTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/dom/DOMTest.java?rev=764965&r1=764964&r2=764965&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/dom/DOMTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/dom/DOMTest.java Tue Apr 14 21:37:00 2009
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry5.dom;
 
+import org.apache.tapestry5.MarkupWriter;
+import org.apache.tapestry5.internal.services.MarkupWriterImpl;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.testng.annotations.Test;
@@ -864,4 +866,34 @@
 
         assertEquals(root.toString(), "<root></root>");
     }
+
+    @Test
+    public void remove_while_rendering()
+    {
+        MarkupWriter writer = new MarkupWriterImpl(new XMLMarkupModel());
+
+        writer.element("ul");
+
+        for (int i = 0; i < 4; i++)
+        {
+            Element e = writer.element("li");
+
+            if (i != 2)
+            {
+                writer.write(String.valueOf(i));
+            }
+
+            writer.end();
+
+            if (e.getChildren().isEmpty())
+            {
+                e.remove();
+            }
+        }
+
+        writer.end();
+
+        assertEquals(writer.toString(), "<?xml version=\"1.0\"?>\n" +
+                "<ul><li>0</li><li>1</li><li>3</li></ul>");
+    }
 }