Fixes a bug in MenuBar where the selectedItem was not set to null when an item is removed or clearItems is called.  This could result in a JS null pointer exception if garbage collection runs because we try to access an element that no longer has any references to it.

Issue: 2178
Patch by: jlabanca
Review by: bruce



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@2115 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/MenuBar.java b/user/src/com/google/gwt/user/client/ui/MenuBar.java
index ec97492..be483f7 100644
--- a/user/src/com/google/gwt/user/client/ui/MenuBar.java
+++ b/user/src/com/google/gwt/user/client/ui/MenuBar.java
@@ -227,6 +227,9 @@
    * Removes all menu items from this menu bar.
    */
   public void clearItems() {
+    // Deselect the current item
+    selectItem(null);
+
     Element container = getItemContainerElement();
     while (DOM.getChildCount(container) > 0) {
       DOM.removeChild(container, DOM.getChild(container, 0));
@@ -347,6 +350,11 @@
    * @param item the item to be removed
    */
   public void removeItem(MenuItem item) {
+    // Unselect if the item is currently selected
+    if (selectedItem == item) {
+      selectItem(null);
+    }
+
     if (removeItemElement(item)) {
       setItemColSpan(item, 1);
       items.remove(item);
diff --git a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
index 24925b8..fcfeff0 100644
--- a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
+++ b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
@@ -134,4 +134,44 @@
     });

     delayTestFinish(250);

   }

+

+  /**

+   * Test that the selected item points to the correct item.

+   */

+  public void testSelectedItem() {

+    // Create a menu bar

+    MenuBar bar = new MenuBar(true);

+

+    // Create a blank command

+    Command blankCommand = new Command() {

+      public void execute() {

+      }

+    };

+

+    // Add some items

+    MenuItem item0 = bar.addItem("item0", blankCommand);

+    MenuItem item1 = bar.addItem("item1", blankCommand);

+    MenuItem item2 = bar.addItem("item2", blankCommand);

+    MenuItem item3 = bar.addItem("item3", blankCommand);

+    MenuItem item4 = bar.addItem("item4", blankCommand);

+

+    // Test setting the selected item

+    assertNull(bar.getSelectedItem());

+    bar.selectItem(item1);

+    assertEquals(item1, bar.getSelectedItem());

+

+    // Test removing the selected item

+    bar.removeItem(item1);

+    assertNull(bar.getSelectedItem());

+

+    // Test removing an item that is not selected

+    bar.selectItem(item3);

+    assertEquals(item3, bar.getSelectedItem());

+    bar.removeItem(item2);

+    assertEquals(item3, bar.getSelectedItem());

+

+    // Test clearing all items

+    bar.clearItems();

+    assertNull(bar.getSelectedItem());

+  }

 }