Fixes issue #734.
The basic issue stems from *really old* code in DOMImpl[Standard|IE6] that
used to simulate something like event bubbling. In a nutshell, the event
dispatcher used to crawl up the DOM, looking for the first element with a
listener. Most of the time, this has no effect, but it can lead to multiple
firings of the same event when it is allowed to bubble up.

The fix also uncovered a bug in Menus, and that fix is included.

Patch by: jgw
Review by: knorton



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@670 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java b/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java
index 0b94573..c140260 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java
@@ -130,15 +130,11 @@
         if (!@com.google.gwt.user.client.DOM::previewEvent(Lcom/google/gwt/user/client/Event;)($wnd.event))
           return;
       }
-  
-      var listener, curElem = this;
-      while (curElem && !(listener = curElem.__listener))
-      curElem = curElem.parentElement;
-  
-      if (listener)
-        @com.google.gwt.user.client.DOM::dispatchEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/user/client/Element;Lcom/google/gwt/user/client/EventListener;)($wnd.event, curElem, listener);
+
+      if (this.__listener)
+        @com.google.gwt.user.client.DOM::dispatchEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/user/client/Element;Lcom/google/gwt/user/client/EventListener;)($wnd.event, this, this.__listener);
     };
-  
+
     $wnd.__dispatchDblClickEvent = function() {
       var newEvent = $doc.createEventObject();
       this.fireEvent('onclick', newEvent);
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java b/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
index 9362816..34e00a9 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
@@ -172,14 +172,8 @@
 
     // Set up normal event dispatcher.
     $wnd.__dispatchEvent = function(evt) {
-      var listener, curElem = this;
-      while (curElem && !(listener = curElem.__listener))
-        curElem = curElem.parentNode;
-      if (curElem && curElem.nodeType != 1)
-        curElem = null;
-
-      if (listener)
-        @com.google.gwt.user.client.DOM::dispatchEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/user/client/Element;Lcom/google/gwt/user/client/EventListener;)(evt, curElem, listener);
+      if (this.__listener)
+        @com.google.gwt.user.client.DOM::dispatchEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/user/client/Element;Lcom/google/gwt/user/client/EventListener;)(evt, this, this.__listener);
     };
 
     $wnd.__captureElem = null;
diff --git a/user/src/com/google/gwt/user/client/ui/MenuBar.java b/user/src/com/google/gwt/user/client/ui/MenuBar.java
index 598fe63..b58e2ab 100644
--- a/user/src/com/google/gwt/user/client/ui/MenuBar.java
+++ b/user/src/com/google/gwt/user/client/ui/MenuBar.java
@@ -83,6 +83,8 @@
     Element outer = DOM.createDiv();
     DOM.appendChild(outer, table);
     setElement(outer);
+
+    sinkEvents(Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT);
     setStyleName("gwt-MenuBar");
   }
 
diff --git a/user/src/com/google/gwt/user/client/ui/MenuItem.java b/user/src/com/google/gwt/user/client/ui/MenuItem.java
index e0e4869..02edfa1 100644
--- a/user/src/com/google/gwt/user/client/ui/MenuItem.java
+++ b/user/src/com/google/gwt/user/client/ui/MenuItem.java
@@ -17,7 +17,6 @@
 
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Event;
 
 /**
  * A widget that can be placed in a
@@ -78,7 +77,6 @@
 
   private MenuItem(String text, boolean asHTML) {
     setElement(DOM.createTD());
-    sinkEvents(Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT);
     setSelectionStyle(false);
 
     if (asHTML) {