The DOM.eventGet methods can return "undefined" or "NaN" if the event property
is not defined for the given event. For example, the DOM.eventGetKeyCode
method returns an "undefined" value for mouse events.
I updated all of the DOMImpl.eventGet methods (including the browser specific
subclasses) to return a default value if the event property is undefined. For
boolean attributes (such as altKey), the default value is "false". For integer
attributes (such as keyCode) the default value is "-1". I also created a
static int " Event.UNDEFINED = -1" to abstract the actual return value.
This fix will prevent JavaScript errors when the event property is undefined,
but the return value of the DOM.eventGet methods is still not well defined if
the event property doesn't apply to the event. For example, IE actually
returns a keyCode with mouse events (the keyCode is the button pressed),
whereas the other browsers return "-1".
Testing: I manually verified the return value of all DOM.eventGet methods
across all browsers to verify that they return a value if it is defined in the
event, or return '-1' or 'false' if not.
Issue: 1392
Patch by: jlabanca
Review by: jgw
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1251 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/Event.java b/user/src/com/google/gwt/user/client/Event.java
index 5fb0795..37edb54 100644
--- a/user/src/com/google/gwt/user/client/Event.java
+++ b/user/src/com/google/gwt/user/client/Event.java
@@ -151,6 +151,16 @@
| ONMOUSEOVER | ONMOUSEOUT;
/**
+ * Error code returned by DOM.getEventXXX methods when the actual integer
+ * value is undefined. For example, DOM.getEventKeyCode returns UNDEFINED
+ * for some non-keyboard events.
+ *
+ * For some events, some browsers return undefined while others return data
+ * for certain events.
+ */
+ public static final int UNDEFINED = -1;
+
+ /**
* Not directly instantiable. Subclasses should also define a protected
* no-arg constructor to prevent client code from directly instantiating
* the class.
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImpl.java b/user/src/com/google/gwt/user/client/impl/DOMImpl.java
index 8c3ee24..c6400f2 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImpl.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImpl.java
@@ -56,23 +56,23 @@
}-*/;
public native boolean eventGetAltKey(Event evt) /*-{
- return evt.altKey;
+ return !!evt.altKey;
}-*/;
public native int eventGetButton(Event evt) /*-{
- return evt.button;
+ return evt.button || -1;
}-*/;
public native int eventGetClientX(Event evt) /*-{
- return evt.clientX;
+ return evt.clientX || -1;
}-*/;
public native int eventGetClientY(Event evt) /*-{
- return evt.clientY;
+ return evt.clientY || -1;
}-*/;
public native boolean eventGetCtrlKey(Event evt) /*-{
- return evt.ctrlKey;
+ return !!evt.ctrlKey;
}-*/;
public abstract Element eventGetFromElement(Event evt);
@@ -80,7 +80,8 @@
public native int eventGetKeyCode(Event evt) /*-{
// 'which' gives the right key value, except when it doesn't -- in which
// case, keyCode gives the right value on all browsers.
- return evt.which || evt.keyCode;
+ // If all else fails, return an error code
+ return evt.which || evt.keyCode || -1;
}-*/;
public native boolean eventGetMetaKey(Event evt) /*-{
@@ -90,19 +91,19 @@
public abstract int eventGetMouseWheelVelocityY(Event evt);
public native boolean eventGetRepeat(Event evt) /*-{
- return evt.repeat;
+ return !!evt.repeat;
}-*/;
public native int eventGetScreenX(Event evt) /*-{
- return evt.screenX;
+ return evt.screenX || -1;
}-*/;
public native int eventGetScreenY(Event evt) /*-{
- return evt.screenY;
+ return evt.screenY || -1;
}-*/;
public native boolean eventGetShiftKey(Event evt) /*-{
- return evt.shiftKey;
+ return !!evt.shiftKey;
}-*/;
public abstract Element eventGetTarget(Event evt);
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 c1f2f1d..7545f50 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java
@@ -84,7 +84,7 @@
}-*/;
public native int eventGetMouseWheelVelocityY(Event evt) /*-{
- return Math.round(-evt.wheelDelta / 40);
+ return Math.round(-evt.wheelDelta / 40) || -1;
}-*/;
public native Element eventGetTarget(Event evt) /*-{
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplMozilla.java b/user/src/com/google/gwt/user/client/impl/DOMImplMozilla.java
index a3c7151..d3d7419 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplMozilla.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplMozilla.java
@@ -43,13 +43,12 @@
return 1;
} else if (button == 1) {
return 4;
- } else {
- return button;
}
+ return button || -1;
}-*/;
public native int eventGetMouseWheelVelocityY(Event evt) /*-{
- return evt.detail;
+ return evt.detail || -1;
}-*/;
public native int getAbsoluteLeft(Element elem) /*-{
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplOpera.java b/user/src/com/google/gwt/user/client/impl/DOMImplOpera.java
index 09bf0fe..ce72842 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplOpera.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplOpera.java
@@ -30,12 +30,12 @@
if(button == 0){
return 1;
} else {
- return button;
+ return button || -1;
}
}-*/;
public native int eventGetMouseWheelVelocityY(Event evt) /*-{
- return evt.detail * 4;
+ return evt.detail * 4 || -1;
}-*/;
public native int getAbsoluteLeft(Element elem) /*-{
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java b/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java
index b196f20..f7a5095 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java
@@ -24,16 +24,16 @@
class DOMImplSafari extends DOMImplStandard {
public native int eventGetClientX(Event evt) /*-{
// In Safari2: clientX is wrong and pageX is returned instead.
- return evt.pageX - $doc.body.scrollLeft;
+ return evt.pageX - $doc.body.scrollLeft || -1;
}-*/;
public native int eventGetClientY(Event evt) /*-{
// In Safari2: clientY is wrong and pageY is returned instead.
- return evt.pageY - $doc.body.scrollTop;
+ return evt.pageY - $doc.body.scrollTop || -1;
}-*/;
public native int eventGetMouseWheelVelocityY(Event evt) /*-{
- return Math.round(-evt.wheelDelta / 40);
+ return Math.round(-evt.wheelDelta / 40) || -1;
}-*/;
public native int getAbsoluteLeft(Element elem) /*-{