Reviewers: ,
Description:
http://code.google.com/p/google-web-toolkit/issues/detail?id=5700
Please review this at http://gwt-code-reviews.appspot.com/1385805/
Affected files:
user/src/com/google/gwt/event/shared/ResettableEventBus.java
user/test/com/google/gwt/event/shared/ResettableEventBusTest.java
Index: user/test/com/google/gwt/event/shared/ResettableEventBusTest.java
===================================================================
--- user/test/com/google/gwt/event/shared/ResettableEventBusTest.java
(revision 9877)
+++ user/test/com/google/gwt/event/shared/ResettableEventBusTest.java
(working copy)
@@ -58,4 +58,54 @@
});
assertNotFired(mouse1, mouse2, mouse3);
}
+
+ public void testManualRemove() {
+ SimpleEventBus eventBus = new SimpleEventBus();
+ ResettableEventBus subject = new ResettableEventBus(eventBus);
+
+ Type<MouseDownHandler> type = MouseDownEvent.getType();
+
+ HandlerRegistration registration1 = subject.addHandler(type, mouse1);
+ HandlerRegistration registration2 = subject.addHandler(type, mouse2);
+ HandlerRegistration registration3 = subject.addHandler(type, mouse3);
+
+ registration1.removeHandler();
+ // how do we check for memory leak? The
ResettableEventBus.registration.size() should be 2
+
+ registration2.removeHandler();
+ registration3.removeHandler();
+
+ // The ResettableEventBus.registration.size() should be 0
+
+ subject.removeHandlers();
+ }
+
+ public void testNested() {
+ SimpleEventBus eventBus = new SimpleEventBus();
+ ResettableEventBus eventBus2 = new ResettableEventBus(eventBus);
+ ResettableEventBus subject = new ResettableEventBus(eventBus2);
+
+ Type<MouseDownHandler> type = MouseDownEvent.getType();
+ eventBus2.addHandler(type, mouse1);
+ subject.addHandler(type, mouse2);
+ subject.addHandler(type, mouse3);
+
+ subject.removeHandlers();
+ // eventBus2.registration.size() == 1 && subject.registration.size()
== 0
+ eventBus2.removeHandlers();
+ // eventBus2.registration.size() == 0 && subject.registration.size()
== 0
+
+ eventBus2.addHandler(type, mouse1);
+ subject.addHandler(type, mouse2);
+ subject.addHandler(type, mouse3);
+
+ eventBus2.removeHandlers();
+ // eventBus2.registration.size() == 0 && subject.registration.size()
== 0
+
+ try {
+ subject.removeHandlers();
+ fail("Should have asserted!");
+ } catch(AssertionError e) {
+ }
+ }
}
Index: user/src/com/google/gwt/event/shared/ResettableEventBus.java
===================================================================
--- user/src/com/google/gwt/event/shared/ResettableEventBus.java (revision
9877)
+++ user/src/com/google/gwt/event/shared/ResettableEventBus.java (working
copy)
@@ -35,18 +35,30 @@
@Override
public <H extends EventHandler> HandlerRegistration addHandler(Type<H>
type,
H handler) {
- HandlerRegistration rtn = wrapped.addHandler(type, handler);
+ final HandlerRegistration rtn = wrapped.addHandler(type, handler);
registrations.add(rtn);
- return rtn;
+ // Need to wrap this to cleanup registrations.
+ return new HandlerRegistration() {
+ @Override
+ public void removeHandler() {
+ doUnregisterHandler(rtn);
+ }
+ };
}
@Override
public <H extends EventHandler> HandlerRegistration addHandlerToSource(
GwtEvent.Type<H> type, Object source, H handler) {
- HandlerRegistration rtn = wrapped.addHandlerToSource(type, source,
+ final HandlerRegistration rtn = wrapped.addHandlerToSource(type,
source,
handler);
registrations.add(rtn);
- return rtn;
+ // Need to wrap this to cleanup registrations.
+ return new HandlerRegistration() {
+ @Override
+ public void removeHandler() {
+ doUnregisterHandler(rtn);
+ }
+ };
}
@Override
@@ -68,4 +80,9 @@
}
registrations.clear();
}
+
+ private void doUnregisterHandler(HandlerRegistration registration) {
+ registration.removeHandler();
+ registrations.remove(registration);
+ }
}
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors