Author: fabb...@google.com Date: Thu Dec 11 18:30:55 2008 New Revision: 4314
Added: trunk/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3186.java - copied unchanged from r4299, /releases/1.6/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3186.java Modified: trunk/user/src/com/google/gwt/user/client/ListenerWrapper.java trunk/user/src/com/google/gwt/user/client/Window.java trunk/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java trunk/user/test/com/google/gwt/user/client/WindowTest.java trunk/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java Log: Cherrypick merges of 1.6 c4298 and c4299. Modified: trunk/user/src/com/google/gwt/user/client/ListenerWrapper.java ============================================================================== --- trunk/user/src/com/google/gwt/user/client/ListenerWrapper.java (original) +++ trunk/user/src/com/google/gwt/user/client/ListenerWrapper.java Thu Dec 11 18:30:55 2008 @@ -131,24 +131,29 @@ } } + // This is an internal helper method with the current formulation, we have // lost the info needed to make it safe by this point. @SuppressWarnings("unchecked") - protected static void baseRemove(HandlerManager manager, + // This is a direct copy of the baseRemove from + // com.google.gwt.user.client.ui.ListenerWrapper. Change in parallel. + static <H extends EventHandler> void baseRemove(HandlerManager manager, EventListener listener, Type... keys) { if (manager != null) { - for (Type key : keys) { + for (Type<H> key : keys) { int handlerCount = manager.getHandlerCount(key); - for (int i = 0; i < handlerCount; i++) { - EventHandler handler = manager.getHandler(key, i); - if (handler instanceof ListenerWrapper && ((ListenerWrapper) handler).listener.equals(listener)) { + // We are removing things as we traverse, have to go backward + for (int i = handlerCount - 1; i >= 0; i--) { + H handler = manager.getHandler(key, i); + if (handler instanceof ListenerWrapper + && ((ListenerWrapper) handler).listener.equals(listener)) { manager.removeHandler(key, handler); } } } } } - + /** * Listener being wrapped. */ Modified: trunk/user/src/com/google/gwt/user/client/Window.java ============================================================================== --- trunk/user/src/com/google/gwt/user/client/Window.java (original) +++ trunk/user/src/com/google/gwt/user/client/Window.java Thu Dec 11 18:30:55 2008 @@ -392,12 +392,13 @@ } } + // Package protected for testing. + static WindowHandlers handlers; private static boolean closeHandlersInitialized; private static boolean scrollHandlersInitialized; private static boolean resizeHandlersInitialized; private static final WindowImpl impl = GWT.create(WindowImpl.class); - private static WindowHandlers handlers; /** * Adds a {...@link CloseEvent} handler. Modified: trunk/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java ============================================================================== --- trunk/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java (original) +++ trunk/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java Thu Dec 11 18:30:55 2008 @@ -271,25 +271,44 @@ } public void onMouseDown(MouseDownEvent event) { - listener.onMouseDown(source(event), event.getClientX(), - event.getClientY()); + Widget source = source(event); + Element elem = source.getElement(); + listener.onMouseDown(source, event.getRelativeX(elem), + event.getRelativeY(elem)); } public void onMouseMove(MouseMoveEvent event) { - listener.onMouseMove(source(event), event.getClientX(), - event.getClientY()); + Widget source = source(event); + Element elem = source.getElement(); + listener.onMouseMove(source, event.getRelativeX(elem), + event.getRelativeY(elem)); } public void onMouseOut(MouseOutEvent event) { - listener.onMouseLeave(source(event)); + // Only fire the mouseLeave event if it's actually leaving this + // widget. + Element to = event.getToElement(); + Widget source = source(event); + if (to == null || !source.getElement().isOrHasChild(to)) { + listener.onMouseLeave(source(event)); + } } public void onMouseOver(MouseOverEvent event) { - listener.onMouseEnter(source(event)); + // Only fire the mouseEnter event if it's coming from outside this + // widget. + Element from = event.getFromElement(); + Widget source = source(event); + if (from == null || !source.getElement().isOrHasChild(from)) { + listener.onMouseEnter(source(event)); + } } public void onMouseUp(MouseUpEvent event) { - listener.onMouseUp(source(event), event.getClientX(), event.getClientY()); + Widget source = source(event); + Element elem = source.getElement(); + listener.onMouseUp(source, event.getRelativeX(elem), + event.getRelativeY(elem)); } } public static class MouseWheel extends ListenerWrapper<MouseWheelListener> implements @@ -510,6 +529,8 @@ EventListener listener, Type... keys) { HandlerManager manager = eventSource.getHandlers(); if (manager != null) { + // This is a direct copy of the baseRemove from + // com.google.gwt.user.client.ListenerWrapper. Change in parallel. for (Type<H> key : keys) { int handlerCount = manager.getHandlerCount(key); // We are removing things as we traverse, have to go backward Modified: trunk/user/test/com/google/gwt/user/client/WindowTest.java ============================================================================== --- trunk/user/test/com/google/gwt/user/client/WindowTest.java (original) +++ trunk/user/test/com/google/gwt/user/client/WindowTest.java Thu Dec 11 18:30:55 2008 @@ -15,6 +15,7 @@ */ package com.google.gwt.user.client; +import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootPanel; @@ -176,4 +177,40 @@ // Cleanup the window RootPanel.get().remove(largeDOM); } + + @SuppressWarnings("deprecation") + static class ListenerTester implements WindowResizeListener { + static int resize = 0; + + public void onWindowResized(int width, int height) { + ++resize; + } + + public static void fire() { + resize = 0; + ResizeEvent.fire(Window.handlers, 0, 0); + } + } + + @SuppressWarnings("deprecation") + public void testListenerRemoval() { + + WindowResizeListener r1 = new ListenerTester(); + WindowResizeListener r2 = new ListenerTester(); + + Window.addWindowResizeListener(r1); + Window.addWindowResizeListener(r2); + + ListenerTester.fire(); + assertEquals(ListenerTester.resize, 2); + + Window.removeWindowResizeListener(r1); + ListenerTester.fire(); + assertEquals(ListenerTester.resize, 1); + + Window.removeWindowResizeListener(r2); + ListenerTester.fire(); + assertEquals(ListenerTester.resize, 0); + } + } Modified: trunk/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java ============================================================================== --- trunk/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java (original) +++ trunk/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java Thu Dec 11 18:30:55 2008 @@ -15,8 +15,10 @@ */ package com.google.gwt.user.client.ui; +import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; +import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; @@ -29,7 +31,7 @@ @Override public String getModuleName() { return "com.google.gwt.user.DebugTest"; - } + } @Override protected void gwtSetUp() throws Exception { @@ -85,7 +87,7 @@ UIObjectTest.assertDebugId("myCheck-input", newInput); UIObjectTest.assertDebugIdContents("myCheck-label", "myLabel"); } - + public void testValueChangeEvent() { CheckBox cb = new CheckBox(); Handler h = new Handler(); @@ -94,7 +96,7 @@ assertNull(h.received); cb.setChecked(true); assertNull(h.received); - + cb.setValue(false); assertNull(h.received); cb.setValue(true); @@ -102,17 +104,61 @@ cb.setValue(true, true); assertNull(h.received); - + cb.setValue(false, true); assertFalse(h.received); cb.setValue(true, true); assertTrue(h.received); + + try { + cb.setValue(null); + fail("Should throw IllegalArgumentException"); + } catch (IllegalArgumentException e) { + /* pass */ + } } - + + static class ListenerTester implements ClickListener { + static int fired = 0; + static HandlerManager manager; + + public static void fire() { + fired = 0; + manager.fireEvent(new ClickEvent() { + }); + } + + public void onClick(Widget sender) { + ++fired; + } + } + + @SuppressWarnings("deprecation") + public void testListenerRemoval() { + CheckBox b = new CheckBox(); + + ClickListener r1 = new ListenerTester(); + ClickListener r2 = new ListenerTester(); + ListenerTester.manager = b.ensureHandlers(); + b.addClickListener(r1); + b.addClickListener(r2); + + ListenerTester.fire(); + assertEquals(ListenerTester.fired, 2); + + b.removeClickListener(r1); + ListenerTester.fire(); + assertEquals(ListenerTester.fired, 1); + + b.removeClickListener(r2); + ListenerTester.fire(); + assertEquals(ListenerTester.fired, 0); + } + private static class Handler implements ValueChangeHandler<Boolean> { Boolean received = null; - + public void onValueChange(ValueChangeEvent<Boolean> event) { received = event.getValue(); } --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---