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