Fix for CustomButton getting stuck hovering if removed during onlick.
Review: http://gwt-code-reviews.appspot.com/94801

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6650 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/CustomButton.java b/user/src/com/google/gwt/user/client/ui/CustomButton.java
index c97d615..0a0d9eb 100644
--- a/user/src/com/google/gwt/user/client/ui/CustomButton.java
+++ b/user/src/com/google/gwt/user/client/ui/CustomButton.java
@@ -804,6 +804,7 @@
   protected void onDetach() {
     super.onDetach();
     cleanupCaptureState();
+    setHovering(false);
   }
 
   /**
diff --git a/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java b/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
index ebe60ca..b2b7fde 100644
--- a/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
+++ b/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
@@ -34,7 +34,6 @@
  * Test for <code>PushButton</code> as most of this widget's functionality is UI
  * based, the primary test will be in the new UI testing framework once it is
  * released.
- * 
  */
 public class CustomButtonTest extends GWTTestCase {
 
@@ -42,6 +41,30 @@
     return "com.google.gwt.user.User";
   }
 
+  public void testCleanupOnRemoval() {
+    PushButton pb = new PushButton();
+    ToggleButton tb = new ToggleButton();
+
+    RootPanel.get().add(pb);
+    RootPanel.get().add(tb);
+
+    // Synthesize mouse-over events to get both buttons into the 'hover' state.
+    pb.getElement().dispatchEvent(
+        Document.get().createMouseOverEvent(1, 0, 0, 0, 0, false, false, false,
+            false, Event.BUTTON_LEFT, null));
+    tb.getElement().dispatchEvent(
+        Document.get().createMouseOverEvent(1, 0, 0, 0, 0, false, false, false,
+            false, Event.BUTTON_LEFT, null));
+    assertTrue(pb.isHovering());
+    assertTrue(tb.isHovering());
+
+    // Remove the buttons. The hover state should be cleared.
+    pb.removeFromParent();
+    tb.removeFromParent();
+    assertFalse(pb.isHovering());
+    assertFalse(tb.isHovering());
+  }
+
   public void testCSS() {
     ToggleButton b = new ToggleButton("up", "down");
     b.setStyleName("random");
@@ -125,6 +148,33 @@
     }
   }
 
+  public void testSyntheticClick() {
+    PushButton b = new PushButton();
+    final ArrayList<String> events = new ArrayList<String>();
+
+    b.addClickHandler(new ClickHandler() {
+      public void onClick(ClickEvent event) {
+        events.add(event.getNativeEvent().getType());
+      }
+    });
+
+    RootPanel.get().add(b);
+
+    // Synthesize over/down/up events, which should kick off CustomButton's
+    // internal machinery to synthesize a click.
+    b.getElement().dispatchEvent(
+        Document.get().createMouseOverEvent(1, 0, 0, 0, 0, false, false, false,
+            false, Event.BUTTON_LEFT, null));
+    b.getElement().dispatchEvent(
+        Document.get().createMouseDownEvent(1, 0, 0, 0, 0, false, false, false,
+            false, Event.BUTTON_LEFT));
+    b.getElement().dispatchEvent(
+        Document.get().createMouseUpEvent(1, 0, 0, 0, 0, false, false, false,
+            false, Event.BUTTON_LEFT));
+    assertEquals("Expecting one click event", 1, events.size());
+    assertEquals("Expecting one click event", "click", events.get(0));
+  }
+  
   public void testTransitions() {
     ToggleButton b = new ToggleButton("transitions");
 
@@ -159,31 +209,4 @@
     assertFalse(b.isDown());
     assertFalse(b.isEnabled());
   }
-
-  public void testSyntheticClick() {
-    PushButton b = new PushButton();
-    final ArrayList<String> events = new ArrayList<String>();
-
-    b.addClickHandler(new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        events.add(event.getNativeEvent().getType());
-      }
-    });
-
-    RootPanel.get().add(b);
-
-    // Synthesize over/down/up events, which should kick off CustomButton's
-    // internal machinery to synthesize a click.
-    b.getElement().dispatchEvent(
-        Document.get().createMouseOverEvent(1, 0, 0, 0, 0, false, false, false,
-            false, Event.BUTTON_LEFT, null));
-    b.getElement().dispatchEvent(
-        Document.get().createMouseDownEvent(1, 0, 0, 0, 0, false, false, false,
-            false, Event.BUTTON_LEFT));
-    b.getElement().dispatchEvent(
-        Document.get().createMouseUpEvent(1, 0, 0, 0, 0, false, false, false,
-            false, Event.BUTTON_LEFT));
-    assertEquals("Expecting one click event", 1, events.size());
-    assertEquals("Expecting one click event", "click", events.get(0));
-  }
 }