Revision: 10624
Author:   jlaba...@google.com
Date:     Wed Sep  7 09:07:21 2011
Log: Ensures that we cleanup CellTree nodes when we are done using them. Currently, some deleted nodes aren't cleaned up, which leads to JS errors when the last node of a CellTree is removed. Even when the errors do not occur, forgetting to cleanup the nodes leaves stale event handlers on the tree.

Issue: 6677

Review at http://gwt-code-reviews.appspot.com/1542803

Review by: skybr...@google.com
http://code.google.com/p/google-web-toolkit/source/detail?r=10624

Modified:
 /trunk/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
/trunk/user/test/com/google/gwt/user/cellview/client/AbstractCellTreeTestBase.java

=======================================
--- /trunk/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java Thu Jul 28 04:03:54 2011 +++ /trunk/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java Wed Sep 7 09:07:21 2011
@@ -211,7 +211,8 @@
         int childCount = nodeView.children.size();
         while (childCount > size) {
           childCount--;
-          nodeView.children.remove(childCount);
+ CellTreeNodeView<?> deleted = nodeView.children.remove(childCount);
+          deleted.cleanup(true);
         }

         // Reattach the open nodes.
=======================================
--- /trunk/user/test/com/google/gwt/user/cellview/client/AbstractCellTreeTestBase.java Fri Dec 10 10:16:22 2010 +++ /trunk/user/test/com/google/gwt/user/cellview/client/AbstractCellTreeTestBase.java Wed Sep 7 09:07:21 2011
@@ -201,6 +201,24 @@
   public String getModuleName() {
     return "com.google.gwt.user.cellview.CellView";
   }
+
+  /**
+   * Issue 6677: Deleting the last element on a CellTree causes NPE in IE.
+   */
+  public void testDeleteLastNode() {
+    // Remove all but the last tree node from the model.
+    TreeNode root = tree.getRootTreeNode();
+    for (int i = 0; i < 9; i++) {
+      model.rootDataProvider.getList().remove(0);
+    }
+    model.rootDataProvider.flush();
+    assertEquals(1, root.getChildCount());
+
+    // Remove the last tree node.
+    model.rootDataProvider.getList().remove(0);
+    model.rootDataProvider.flush();
+    assertEquals(0, root.getChildCount());
+  }

   public void testGetRootNode() {
     TreeNode root = tree.getRootTreeNode();

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to