Fix for Firefox 3.5 relatedTarget bug (https://bugzilla.mozilla.org/show_bug.cgi?id=497780)
Review: http://gwt-code-reviews.appspot.com/49803


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5641 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/dom/client/DOMImplMozilla.java b/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
index fd2cb70..c3cf941 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
@@ -37,6 +37,20 @@
   }-*/;
 
   @Override
+  public native EventTarget eventGetRelatedTarget(NativeEvent evt) /*-{
+    // Hack around Mozilla bug 497780 (relatedTarget sometimes returns XUL
+    // elements). Trying to access relatedTarget.nodeName will throw an
+    // exception if it's a XUL element.
+    var relatedTarget = evt.relatedTarget;
+    try {
+      var nodeName = relatedTarget.nodeName;
+      return relatedTarget;
+    } catch (e) {
+      return null;
+    }
+  }-*/;
+
+  @Override
   public int getAbsoluteLeft(Element elem) {
     return getAbsoluteLeftImpl(elem.getOwnerDocument().getViewportElement(),
         elem);
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 3fa1553..3c87af4 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
@@ -39,22 +39,30 @@
   private static JavaScriptObject dispatchEvent;
 
   @Override
-  public native Element eventGetFromElement(Event evt) /*-{
-    if (evt.type == "mouseover")
-      return evt.relatedTarget;
-    if (evt.type == "mouseout")
-      return evt.target;
+  public Element eventGetFromElement(Event evt) {
+    if (evt.getType().equals("mouseover")) {
+      return evt.getRelatedTarget().cast();
+    }
+
+    if (evt.getType().equals("mouseout")) {
+      return evt.getTarget().cast();
+    }
+
     return null;  
-  }-*/;
+  }
  
   @Override
-  public native Element eventGetToElement(Event evt) /*-{
-    if (evt.type == "mouseover")
-      return evt.target;
-    if (evt.type == "mouseout")
-      return evt.relatedTarget;
+  public Element eventGetToElement(Event evt) {
+    if (evt.getType().equals("mouseover")) {
+      return evt.getTarget().cast();
+    }
+
+    if (evt.getType().equals("mouseout")) {
+      return evt.getRelatedTarget().cast();
+    }
+
     return null;
-  }-*/;
+  }
   
   @Override
   public native Element getChild(Element elem, int index) /*-{