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);