Fixed a bug in HandlerManager where removing the last handler of a given EventType twice would result in an NPE because we assume that the list of event handlers is not null.  Now, this results in an AssertionError.

Patch by: jlabanca
Review by: rjrjr



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5266 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/event/shared/HandlerManager.java b/user/src/com/google/gwt/event/shared/HandlerManager.java
index db8617e..b4269ea 100644
--- a/user/src/com/google/gwt/event/shared/HandlerManager.java
+++ b/user/src/com/google/gwt/event/shared/HandlerManager.java
@@ -32,7 +32,7 @@
    * Interface for queued add/remove operations.
    */
   private interface AddOrRemoveCommand {
-    public void execute();
+    void execute();
   }
 
   /**
@@ -90,8 +90,8 @@
 
     private <H> void removeHandler(GwtEvent.Type<H> eventKey, H handler) {
       ArrayList<H> l = get(eventKey);
-      boolean result = l.remove(handler);
-      if (l.size() == 0) {
+      boolean result = (l == null) ? false : l.remove(handler);
+      if (result && l.size() == 0) {
         map.remove(eventKey);
       }
       assert result : "Tried to remove unknown handler: " + handler + " from "
diff --git a/user/test/com/google/gwt/event/shared/HandlerManagerTest.java b/user/test/com/google/gwt/event/shared/HandlerManagerTest.java
index 48bc156..9d9dbaf 100644
--- a/user/test/com/google/gwt/event/shared/HandlerManagerTest.java
+++ b/user/test/com/google/gwt/event/shared/HandlerManagerTest.java
@@ -260,6 +260,25 @@
     assertFired(mouse1, adaptor1, mouse3);

   }

 

+  public void testRemoveUnhandledType() {

+    final HandlerManager manager = new HandlerManager("bogus source");

+    HandlerRegistration reg = manager.addHandler(MouseDownEvent.getType(),

+        mouse1);

+    reg.removeHandler();

+

+    if (!GWT.isScript()) {

+      try {

+        reg.removeHandler();

+        fail("Should have thrown assertion error");

+      } catch (AssertionError e) {

+        /* pass */

+      }

+    } else {

+      reg.removeHandler();

+      /* pass, we didn't hit an NPE */

+    }

+  }

+

   public void testReverseOrder() {

     // Add some handlers to a manager

     final HandlerManager manager = new HandlerManager("source1", true);