Some of the unit tests in CreateEventTest have listeners
that fire multiple times.  This occasionally causes a failure
in an unrelated test.  Assuming that the extra firings
are spurious, I've added an explicit 'cancel()' method
to bypass the assertions if they fire after
an individual test runs.

Also took the opportunity to get rid of some deprecation
warnings and lengthen timeouts in the DialogBoxTest
and MenuBarTests which flaked out on me
while smoke testing this patch.

Review at http://gwt-code-reviews.appspot.com/1223801

Review by: jlabanca@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9449 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/test/com/google/gwt/user/client/ui/CreateEventTest.java b/user/test/com/google/gwt/user/client/ui/CreateEventTest.java
index fdeddc2..682510f 100644
--- a/user/test/com/google/gwt/user/client/ui/CreateEventTest.java
+++ b/user/test/com/google/gwt/user/client/ui/CreateEventTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -36,7 +36,7 @@
   /**
    * Listener for use with key[down up press].
    */
-  private class KeyCodeEventListener extends BubbleAssertingEventListener {
+  private static class KeyCodeEventListener extends BubbleAssertingEventListener {
 
     public KeyCodeEventListener(String eventType) {
       super(eventType, true);
@@ -44,6 +44,9 @@
 
     @Override
     public void onBrowserEvent(Event event) {
+      if (cancelled) {
+        return;
+      }
       super.onBrowserEvent(event);
       assertEquals(KEY_CODE, event.getKeyCode());
       // shouldn't throw:
@@ -54,14 +57,18 @@
   /**
    * Listener for use with key[down up press].
    */
-  private class KeyPressEventListener extends BubbleAssertingEventListener {
+  private static class KeyPressEventListener extends BubbleAssertingEventListener {
     public KeyPressEventListener() {
       super("keypress", true);
     }
 
     @Override
     public void onBrowserEvent(Event event) {
+      if (cancelled) {
+        return;
+      }
       super.onBrowserEvent(event);
+
       assertEquals(KEY_CODE, event.getCharCode());
       // shouldn't throw:
       event.getKeyCode();
@@ -71,13 +78,16 @@
   /**
    * Listener for use with mouse[down up move over out].
    */
-  private class MouseEventListener extends BubbleAssertingEventListener {
+  private static class MouseEventListener extends BubbleAssertingEventListener {
     public MouseEventListener(String eventType) {
       super(eventType, true);
     }
 
     @Override
     public void onBrowserEvent(Event event) {
+      if (cancelled) {
+        return;
+      }
       super.onBrowserEvent(event);
       assertMouseCoordinates(event);
       assertEquals(Event.BUTTON_LEFT, event.getButton());
@@ -88,28 +98,42 @@
    * An event listener that asserts that the event is passed to child, then
    * parent.
    */
-  private class BubbleAssertingEventListener implements EventListener {
-    private boolean parentReceived, childReceived;
+  private static class BubbleAssertingEventListener implements EventListener {
+    protected boolean cancelled = false;
     private final String eventType;
-    private boolean supportsShiftKeys;
-    private boolean expectedCtrl = true;
     private boolean expectedAlt = true;
-    private boolean expectedShift = true;
+    private boolean expectedCtrl = true;
     private boolean expectedMeta = true;
+    private boolean expectedShift = true;
+    private boolean parentReceived, childReceived;
+    private boolean supportsShiftKeys;
 
-    public BubbleAssertingEventListener(String eventType, boolean supportsShiftKeys) {
+    public BubbleAssertingEventListener(String eventType,
+        boolean supportsShiftKeys) {
       this.eventType = eventType;
       this.supportsShiftKeys = supportsShiftKeys;
     }
 
     public void assertReceived() {
+      if (cancelled) {
+        return;
+      }
+
       assertTrue("Expected child to receive event", childReceived);
       assertTrue("Expected parent to receive event", parentReceived);
       childReceived = false;
       parentReceived = false;
     }
 
+    public void cancel() {
+      cancelled = true;
+    }
+
     public void onBrowserEvent(Event event) {
+      if (cancelled) {
+        return;
+      }
+
       assertEquals(eventType, event.getType());
       if (supportsShiftKeys) {
         assertAllShiftKeys(event, expectedCtrl, expectedAlt, expectedShift,
@@ -172,7 +196,8 @@
   /**
    * An event listener that asserts that the event is passed only to child.
    */
-  private class NonBubbleAssertingEventListener implements EventListener {
+  private static class NonBubbleAssertingEventListener implements EventListener {
+    protected boolean cancelled = false;
     private boolean childReceived;
     private String eventType;
 
@@ -180,47 +205,25 @@
       this.eventType = eventType;
     }
 
+    public void cancel() {
+      cancelled = true;
+    }
+
     public void onBrowserEvent(Event event) {
+      if (cancelled) {
+        return;
+      }
+
       assertEquals(eventType, event.getType());
 
-      if (event.getTarget() == child) {
+      if (event.getEventTarget().equals(child)) {
         assertFalse("Expecting child to receive the event only once",
             childReceived);
         childReceived = true;
-      } else if (event.getTarget() == parent) {
+      } else if (event.getEventTarget().equals(parent)) {
         fail("Not expecting parent to receive the event");
       }
     }
-
-    protected String getEventType() {
-      return eventType;
-    }
-  }
-
-  /**
-   * An event listener that asserts that events are received properly for the
-   * img element.
-   */
-  private static class ImgEventListener implements EventListener {
-    private boolean imgReceived;
-    private final String eventType;
-
-    public ImgEventListener(String eventType) {
-      this.eventType = eventType;
-    }
-
-    public void onBrowserEvent(Event event) {
-      if (event.getType().equals(eventType)) {
-        if (event.getTarget() == img) {
-          assertFalse("Expecting img to receive the event only once",
-              imgReceived);
-
-          imgReceived = true;
-        } else if (event.getTarget() == parent) {
-          fail("Not expecting parent to receive the event");
-        }
-      }
-    }
   }
 
   /**
@@ -231,19 +234,70 @@
         boolean metaKey);
   }
 
-  private static final int MOUSE_DETAIL = 1;
-  private static final int CLIENT_X = 2;
-  private static final int CLIENT_Y = 3;
-  private static final int SCREEN_X = 4;
-  private static final int SCREEN_Y = 5;
-  private static final int KEY_CODE = 'A';
+  /**
+   * An event listener that asserts that events are received properly for the
+   * img element.
+   */
+  private static class ImgEventListener implements EventListener {
+    private final String eventType;
+    private boolean imgReceived;
+
+    public ImgEventListener(String eventType) {
+      this.eventType = eventType;
+    }
+
+    public void onBrowserEvent(Event event) {
+      if (event.getType().equals(eventType)) {
+        if (event.getEventTarget().equals(img)) {
+          assertFalse("Expecting img to receive the event only once",
+              imgReceived);
+
+          imgReceived = true;
+        } else if (event.getEventTarget().equals(parent)) {
+          fail("Not expecting parent to receive the event");
+        }
+      }
+    }
+  }
 
   private static final int ALL_EVENTS = Event.MOUSEEVENTS | Event.KEYEVENTS
       | Event.FOCUSEVENTS | Event.ONCHANGE | Event.ONCLICK | Event.ONDBLCLICK
       | Event.ONCONTEXTMENU | Event.ONLOAD | Event.ONERROR | Event.ONSCROLL;
-  private static DivElement parent;
+
   private static InputElement child;
+
+  private static final int CLIENT_X = 2;
+  private static final int CLIENT_Y = 3;
   private static ImageElement img;
+  private static final int KEY_CODE = 'A';
+  private static final int MOUSE_DETAIL = 1;
+  private static DivElement parent;
+
+  private static final int SCREEN_X = 4;
+  private static final int SCREEN_Y = 5;
+
+  /**
+   * Assert that all shift keys are in the expected state.
+   *
+   * @param event the event that was triggered
+   */
+  private static void assertAllShiftKeys(Event event, boolean expectedCtrl,
+      boolean expectedAlt, boolean expectedShift, boolean expectedMeta) {
+    assertEquals("Expecting ctrl = " + expectedCtrl, expectedCtrl,
+        event.getCtrlKey());
+    assertEquals("Expecting alt = " + expectedAlt, expectedAlt,
+        event.getAltKey());
+    assertEquals("Expecting shift = " + expectedShift, expectedShift,
+        event.getShiftKey());
+    assertEquals("Expecting meta = " + expectedMeta, expectedMeta,
+        event.getMetaKey());
+  }
+  private static void assertMouseCoordinates(Event event) {
+    assertEquals("clientX", CLIENT_X, event.getClientX());
+    assertEquals("clientY", CLIENT_Y, event.getClientY());
+    assertEquals("screenX", SCREEN_X, event.getScreenX());
+    assertEquals("screenY", SCREEN_Y, event.getScreenY());
+  }
 
   @Override
   public String getModuleName() {
@@ -262,7 +316,7 @@
     child.dispatchEvent(Document.get().createClickEvent(0, 0, 0, 0, 0, false,
         false, false, false));
     child.dispatchEvent(Document.get().createKeyPressEvent(false, false, false,
-        false, 65, 65));
+        false, 65));
     child.dispatchEvent(Document.get().createFocusEvent());
 
     assertTrue("Expecting click as current event", listener.gotClick);
@@ -279,7 +333,7 @@
       @Override
       public void onBrowserEvent(Event event) {
         super.onBrowserEvent(event);
-        if (event.getCurrentTarget() == child) {
+        if (event.getCurrentEventTarget().equals(child)) {
           event.stopPropagation();
         }
       }
@@ -289,6 +343,7 @@
 
     child.dispatchEvent(Document.get().createClickEvent(MOUSE_DETAIL, SCREEN_X,
         SCREEN_Y, CLIENT_X, CLIENT_Y, true, true, true, true));
+    listener.cancel();
 
     assertTrue("Expected child to receive event", listener.childReceived);
   }
@@ -301,6 +356,9 @@
         "blur") {
       @Override
       public void onBrowserEvent(Event event) {
+        if (cancelled) {
+          return;
+        }
         super.onBrowserEvent(event);
         assertEquals("blur", event.getType());
       }
@@ -309,6 +367,7 @@
     Event.setEventListener(child, listener);
 
     child.dispatchEvent(Document.get().createBlurEvent());
+    listener.cancel();
 
     assertTrue("Expected child to receive event", listener.childReceived);
   }
@@ -323,6 +382,7 @@
     Event.setEventListener(child, listener);
 
     child.dispatchEvent(Document.get().createChangeEvent());
+    listener.cancel();
 
     assertTrue("Expected child to receive event", listener.childReceived);
   }
@@ -335,6 +395,9 @@
         "click", true) {
       @Override
       public void onBrowserEvent(Event event) {
+        if (cancelled) {
+          return;
+        }
         super.onBrowserEvent(event);
         assertMouseCoordinates(event);
       }
@@ -344,6 +407,7 @@
 
     child.dispatchEvent(Document.get().createClickEvent(MOUSE_DETAIL, SCREEN_X,
         SCREEN_Y, CLIENT_X, CLIENT_Y, true, true, true, true));
+    listener.cancel();
 
     assertTrue("Expected child to receive event", listener.childReceived);
     assertTrue("Expected parent to receive event", listener.parentReceived);
@@ -359,6 +423,7 @@
     Event.setEventListener(child, listener);
 
     child.dispatchEvent(Document.get().createContextMenuEvent());
+    listener.cancel();
 
     assertTrue("Expected child to receive event", listener.childReceived);
     assertTrue("Expected parent to receive event", listener.parentReceived);
@@ -372,6 +437,9 @@
         "dblclick", true) {
       @Override
       public void onBrowserEvent(Event event) {
+        if (cancelled) {
+          return;
+        }
         if (event.getTypeInt() == Event.ONCLICK) {
           // Some browsers (IE, I'm looking at you) synthesize an extra click
           // event when a double-click is triggered. This synthesized click
@@ -389,6 +457,7 @@
 
     child.dispatchEvent(Document.get().createDblClickEvent(MOUSE_DETAIL,
         SCREEN_X, SCREEN_Y, CLIENT_X, CLIENT_Y, true, true, true, true));
+    listener.cancel();
 
     assertTrue("Expected child to receive event", listener.childReceived);
     assertTrue("Expected parent to receive event", listener.parentReceived);
@@ -396,9 +465,10 @@
 
   /**
    * Tests createErrorEvent().
-   * 
+   *
    * Failed in all modes due to HtmlUnit bug:
-   * https://sourceforge.net/tracker/?func=detail&aid=2888342&group_id=47038&atid=448266
+   * https://sourceforge.net/tracker/?func
+   * =detail&aid=2888342&group_id=47038&atid=448266
    */
   @DoNotRunWith({Platform.HtmlUnitBug})
   public void testTriggerErrorEvent() {
@@ -419,6 +489,9 @@
         "focus") {
       @Override
       public void onBrowserEvent(Event event) {
+        if (cancelled) {
+          return;
+        }
         super.onBrowserEvent(event);
         assertEquals("focus", event.getType());
       }
@@ -427,6 +500,7 @@
     Event.setEventListener(child, listener);
 
     child.dispatchEvent(Document.get().createFocusEvent());
+    listener.cancel();
 
     assertTrue("Expected child to receive event", listener.childReceived);
   }
@@ -444,11 +518,12 @@
       }
     };
     testTriggerEventWithShiftKeys(listener, creator);
+    listener.cancel();
   }
 
   /**
    * Tests createKeyPressEvent().
-   * 
+   *
    * Failed in all modes due to HtmlUnit bug:
    */
   @DoNotRunWith({Platform.HtmlUnitBug})
@@ -462,6 +537,7 @@
       }
     };
     testTriggerEventWithShiftKeys(listener, creator);
+    listener.cancel();
   }
 
   /**
@@ -477,6 +553,7 @@
       }
     };
     testTriggerEventWithShiftKeys(listener, creator);
+    listener.cancel();
   }
 
   /**
@@ -506,6 +583,7 @@
       }
     };
     testTriggerEventWithShiftKeys(listener, creator);
+    listener.cancel();
   }
 
   /**
@@ -522,11 +600,12 @@
       }
     };
     testTriggerEventWithShiftKeys(listener, creator);
+    listener.cancel();
   }
 
   /**
    * Tests createMouseOutEvent().
-   * 
+   *
    * Failed in all modes due to HtmlUnit bug:
    */
   @DoNotRunWith({Platform.HtmlUnitBug})
@@ -548,11 +627,12 @@
       }
     };
     testTriggerEventWithShiftKeys(listener, creator);
+    listener.cancel();
   }
 
   /**
    * Tests createMouseOverEvent().
-   * 
+   *
    * Failed in all modes due to HtmlUnit bug:
    */
   @DoNotRunWith({Platform.HtmlUnitBug})
@@ -574,6 +654,7 @@
       }
     };
     testTriggerEventWithShiftKeys(listener, creator);
+    listener.cancel();
   }
 
   /**
@@ -590,11 +671,12 @@
       }
     };
     testTriggerEventWithShiftKeys(listener, creator);
+    listener.cancel();
   }
 
   /**
    * Tests createKeyPressEvent().
-   * 
+   *
    * Failed in all modes due to HtmlUnit bug:
    */
   @DoNotRunWith({Platform.HtmlUnitBug})
@@ -603,6 +685,9 @@
         "scroll") {
       @Override
       public void onBrowserEvent(Event event) {
+        if (cancelled) {
+          return;
+        }
         super.onBrowserEvent(event);
         assertEquals("scroll", event.getType());
       }
@@ -611,6 +696,7 @@
     Event.setEventListener(child, listener);
 
     child.dispatchEvent(Document.get().createScrollEvent());
+    listener.cancel();
 
     assertTrue("Expected child to receive event", listener.childReceived);
   }
@@ -631,30 +717,6 @@
   }
 
   /**
-   * Assert that all shift keys are in the expected state.
-   * 
-   * @param event the event that was triggered
-   */
-  private void assertAllShiftKeys(Event event, boolean expectedCtrl,
-      boolean expectedAlt, boolean expectedShift, boolean expectedMeta) {
-    assertEquals("Expecting ctrl = " + expectedCtrl, expectedCtrl,
-        event.getCtrlKey());
-    assertEquals("Expecting alt = " + expectedAlt, expectedAlt,
-        event.getAltKey());
-    assertEquals("Expecting shift = " + expectedShift, expectedShift,
-        event.getShiftKey());
-    assertEquals("Expecting meta = " + expectedMeta, expectedMeta,
-        event.getMetaKey());
-  }
-
-  private void assertMouseCoordinates(Event event) {
-    assertEquals("clientX", CLIENT_X, event.getClientX());
-    assertEquals("clientY", CLIENT_Y, event.getClientY());
-    assertEquals("screenX", SCREEN_X, event.getScreenX());
-    assertEquals("screenY", SCREEN_Y, event.getScreenY());
-  }
-
-  /**
    * Test an event that supports shift keys by testing each shift key
    * individually.
    */
diff --git a/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java b/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
index 6937427..d31230e 100644
--- a/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,14 +15,14 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.junit.DoNotRunWith;
 import com.google.gwt.junit.Platform;
 import com.google.gwt.safehtml.shared.SafeHtmlUtils;
-import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.DeferredCommand;
 
 /**
  * Unit test for {@link DialogBox}.
@@ -42,7 +42,7 @@
   @Override
   public void testAccessors() {
     super.testAccessors();
-    
+
     // Set the widget
     DialogBox box1 = new DialogBox();
     assertNull(box1.getWidget());
@@ -104,9 +104,9 @@
     UIObjectTest.assertDebugId("myDialogBox-content",
         DOM.getParent(content.getElement()));
 
-    delayTestFinish(250);
+    delayTestFinish(5000);
     // Check the header IDs
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
       public void execute() {
         UIObjectTest.assertDebugIdContents("myDialogBox-caption",
             "test caption");
diff --git a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
index 1f82c87..ec966aa 100644
--- a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
+++ b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.event.dom.client.KeyCodes;
@@ -22,7 +24,6 @@
 import com.google.gwt.junit.Platform;
 import com.google.gwt.safehtml.shared.SafeHtmlUtils;
 import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
 
 import java.util.List;
 
@@ -188,8 +189,8 @@
     bar.ensureDebugId("myMenu");
     UIObjectTest.assertDebugId("myMenu", bar.getElement());
 
-    delayTestFinish(250);
-    DeferredCommand.addCommand(new Command() {
+    delayTestFinish(5000);
+    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
       public void execute() {
         UIObjectTest.assertDebugIdContents("myMenu-item0", "top0");
         UIObjectTest.assertDebugIdContents("myMenu-item1", "top1");
@@ -247,7 +248,7 @@
 
     // Escape from the menu.
     NativeEvent event = Document.get().createKeyDownEvent(
-        false, false, false, false, KeyCodes.KEY_ESCAPE, KeyCodes.KEY_ESCAPE);
+        false, false, false, false, KeyCodes.KEY_ESCAPE);
     l1.getElement().dispatchEvent(event);
     assertNull(l0.getPopup());
     assertNull(l0.getSelectedItem());
@@ -334,14 +335,14 @@
 
   public void testSafeHtml() {
     MenuBar bar = new MenuBar(true);
-    
+
     // ensure safehtml passes through when a command is set.
-    MenuItem item1 = 
+    MenuItem item1 =
       bar.addItem(SafeHtmlUtils.fromSafeConstant(html), BLANK_COMMAND);
     assertEquals(html, item1.getHTML().toLowerCase());
     assertEquals(BLANK_COMMAND, item1.getCommand());
     assertEquals(bar, item1.getParentMenu());
-    
+
     // ensure safehtml passes through when a submenu/popup is set.
     MenuBar foo = new MenuBar(true);
     MenuItem item2 = foo.addItem(SafeHtmlUtils.fromSafeConstant(html), bar);
@@ -424,7 +425,7 @@
 
     // Tab away from the menu.
     NativeEvent event = Document.get().createKeyDownEvent(
-        false, false, false, false, KeyCodes.KEY_TAB, KeyCodes.KEY_TAB);
+        false, false, false, false, KeyCodes.KEY_TAB);
     l1.getElement().dispatchEvent(event);
     assertNull(l0.getPopup());
     assertNull(l0.getSelectedItem());