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>");
+ }
}