JavaScriptObject identity now holds true for all hosted modes; deprecating DOM.compare() which is no longer necessary.

Suggested by: me
Review by: bruce, rdayal (desk check)
Review by: jgw, knorton (spiritual advisors)


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@2030 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/DOM.java b/user/src/com/google/gwt/user/client/DOM.java
index 28e724d..a1a3b2a 100644
--- a/user/src/com/google/gwt/user/client/DOM.java
+++ b/user/src/com/google/gwt/user/client/DOM.java
@@ -76,16 +76,16 @@
   }
 
   /**
-   * Compares two elements for equality (note that reference equality is not
-   * sufficient to determine equality among elements on most browsers).
+   * Compares two elements for equality.  Note that this method is now deprecated
+   * because reference identity accurately reports equality.
    * 
    * @param elem1 the first element to be compared
    * @param elem2 the second element to be compared
    * @return <code>true</code> if they are in fact the same element
-   * @see #isOrHasChild(Element, Element)
+   * @deprecated Use identity comparison.
    */
   public static boolean compare(Element elem1, Element elem2) {
-    return impl.compare(elem1, elem2);
+    return elem1 == elem2;
   }
 
   /**
@@ -931,7 +931,7 @@
    * @see #setCapture(Element)
    */
   public static void releaseCapture(Element elem) {
-    if ((sCaptureElem != null) && compare(elem, sCaptureElem)) {
+    if ((sCaptureElem != null) && elem == sCaptureElem) {
       sCaptureElem = null;
     }
     impl.releaseCapture(elem);
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 4e7bb0623..e0e8c75 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImpl.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImpl.java
@@ -34,8 +34,6 @@
     return elem.cloneNode(deep);
   }-*/;
 
-  public abstract boolean compare(Element elem1, Element elem2);
-
   public native Element createElement(String tag) /*-{
     return $doc.createElement(tag);
   }-*/;
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 5dd4ba9..dc95391 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplIE6.java
@@ -24,18 +24,13 @@
  */
 class DOMImplIE6 extends DOMImpl {
 
+  /**
+   * Referenced from JavaScript.
+   */
+  @SuppressWarnings("unused")
   private static Element currentEventTarget;
 
   @Override
-  public native boolean compare(Element elem1, Element elem2) /*-{
-    if (!elem1 && !elem2)
-      return true;
-    else if (!elem1 || !elem2)
-      return false;
-    return (elem1.uniqueID == elem2.uniqueID);
-  }-*/;
-
-  @Override
   public native Element createInputRadioElement(String name) /*-{
     return $doc.createElement("<INPUT type='RADIO' name='" + name + "'>");
   }-*/;
@@ -130,8 +125,9 @@
   public native int getChildIndex(Element parent, Element child) /*-{
     var count = parent.children.length;
     for (var i = 0; i < count; ++i) {
-      if (child.uniqueID == parent.children[i].uniqueID)
+      if (child === parent.children[i]) {
         return i;
+      }
     }
     return -1;
   }-*/;
@@ -246,7 +242,7 @@
   public native boolean isOrHasChild(Element parent, Element child) /*-{
     // An extra equality check is required due to the fact that
     // elem.contains(elem) is false if elem is not attached to the DOM.
-    return (parent.uniqueID == child.uniqueID) || parent.contains(child);  
+    return (parent === child) || parent.contains(child);
   }-*/;
 
   @Override
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 1c2b824..5b9c8d3 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplMozilla.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplMozilla.java
@@ -19,24 +19,11 @@
 import com.google.gwt.user.client.Event;
 
 /**
- * Mozilla implementation of StandardBrowser. The main difference between
- * Mozilla and others is that element comparison must be done using isSameNode()
- * (== comparison doesn't always give you the right answer, probably because of
- * its JavaScript wrappers for xpcom dom nodes).
+ * Mozilla implementation of StandardBrowser.
  */
 class DOMImplMozilla extends DOMImplStandard {
 
   @Override
-  public native boolean compare(Element elem1, Element elem2) /*-{
-    if (!elem1 && !elem2) {
-      return true;
-    } else if (!elem1 || !elem2) {
-      return false;
-    }
-    return (elem1.isSameNode(elem2));
-  }-*/;
-
-  @Override
   public native int eventGetMouseWheelVelocityY(Event evt) /*-{
     return evt.detail || -1;
   }-*/;
@@ -88,34 +75,13 @@
   }-*/;
 
   @Override
-  public native int getChildIndex(Element parent, Element toFind) /*-{
-    var count = 0, child = parent.firstChild;
-    while (child) {
-      if (child.isSameNode(toFind)) {
-        return count;
-      }
-      if (child.nodeType == 1) {
-        ++count;
-      }
-      child = child.nextSibling;
-    }
-    return -1;
-  }-*/;
-
-  @Override
   public native boolean isOrHasChild(Element parent, Element child) /*-{
     // For more information about compareDocumentPosition, see:
     // http://www.quirksmode.org/blog/archives/2006/01/contains_for_mo.html
-    return parent.isSameNode(child) || !!(parent.compareDocumentPosition(child) & 16);  
+    return (parent === child) || !!(parent.compareDocumentPosition(child) & 16);  
   }-*/;
 
   @Override
-  public void releaseCapture(Element elem) {
-    maybeInitializeEventSystem();
-    releaseCaptureImpl(elem);
-  }
-
-  @Override
   public void sinkEvents(Element elem, int bits) {
     super.sinkEvents(elem, bits);
     sinkEventsMozilla(elem, bits);
@@ -171,10 +137,4 @@
     $wnd.addEventListener('DOMMouseScroll', $wnd.__dispatchCapturedMouseEvent,
       true);
   }-*/;
-
-  private native void releaseCaptureImpl(Element elem) /*-{
-    if (elem.isSameNode($wnd.__captureElem)) {
-      $wnd.__captureElem = null;
-    }
-  }-*/;
 }
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 66ca744..82812a3 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
@@ -26,11 +26,6 @@
 abstract class DOMImplStandard extends DOMImpl {
 
   @Override
-  public native boolean compare(Element elem1, Element elem2) /*-{
-    return (elem1 == elem2);
-  }-*/;
-
-  @Override
   public native Element createInputRadioElement(String name) /*-{
     var elem = $doc.createElement("INPUT");
     elem.type = 'radio';
@@ -115,13 +110,14 @@
   public native int getChildIndex(Element parent, Element toFind) /*-{
     var count = 0, child = parent.firstChild;
     while (child) {
-      if (child == toFind)
+      if (child === toFind) {
         return count;
-      if (child.nodeType == 1)
+      }
+      if (child.nodeType == 1) {
         ++count;
+      }
       child = child.nextSibling;
     }
-
     return -1;
   }-*/;
 
@@ -245,8 +241,9 @@
   }-*/;
 
   private native void releaseCaptureImpl(Element elem) /*-{
-    if (elem == $wnd.__captureElem)
+    if (elem === $wnd.__captureElem) {
       $wnd.__captureElem = null;
+    }
   }-*/;
 
   private native void setCaptureImpl(Element elem) /*-{
diff --git a/user/src/com/google/gwt/user/client/impl/ImageSrcIE6.java b/user/src/com/google/gwt/user/client/impl/ImageSrcIE6.java
index 2d077c8..d4d0d95 100644
--- a/user/src/com/google/gwt/user/client/impl/ImageSrcIE6.java
+++ b/user/src/com/google/gwt/user/client/impl/ImageSrcIE6.java
@@ -184,10 +184,9 @@
    * Removes a child image from its pending parent.
    */
   private static native void removeChild(Element parent, Element child) /*-{
-    var uniqueID = child.uniqueID;
     var kids = parent.__kids;
     for (var i = 0, c = kids.length; i < c; ++i) {
-      if (kids[i].uniqueID == uniqueID) {
+      if (kids[i] === child) {
         kids.splice(i, 1);
         child.__pendingSrc = null;
         return;
diff --git a/user/src/com/google/gwt/user/client/ui/HTMLTable.java b/user/src/com/google/gwt/user/client/ui/HTMLTable.java
index bbaac5d..103180d 100644
--- a/user/src/com/google/gwt/user/client/ui/HTMLTable.java
+++ b/user/src/com/google/gwt/user/client/ui/HTMLTable.java
@@ -1207,12 +1207,12 @@
         // it.
         Element tr = DOM.getParent(td);
         Element body = DOM.getParent(tr);
-        if (DOM.compare(body, bodyElem)) {
+        if (body == bodyElem) {
           return td;
         }
       }
       // If we run into this table's body, we're out of options.
-      if (DOM.compare(td, bodyElem)) {
+      if (td == bodyElem) {
         return null;
       }
     }
diff --git a/user/src/com/google/gwt/user/client/ui/StackPanel.java b/user/src/com/google/gwt/user/client/ui/StackPanel.java
index f6ae64d..9922032 100644
--- a/user/src/com/google/gwt/user/client/ui/StackPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/StackPanel.java
@@ -248,7 +248,7 @@
   }
 
   private int findDividerIndex(Element elem) {
-    while ((elem != null) && !DOM.compare(elem, getElement())) {
+    while (elem != getElement()) {
       String expando = DOM.getElementProperty(elem, "__index");
       if (expando != null) {
         // Make sure it belongs to me!
diff --git a/user/src/com/google/gwt/user/client/ui/Tree.java b/user/src/com/google/gwt/user/client/ui/Tree.java
index af09ab5..f034004 100644
--- a/user/src/com/google/gwt/user/client/ui/Tree.java
+++ b/user/src/com/google/gwt/user/client/ui/Tree.java
@@ -364,7 +364,7 @@
         // Currently, the way we're using image bundles causes extraneous events
         // to be sunk on individual items' open/close images. This leads to an
         // extra event reaching the Tree, which we will ignore here.
-        if (DOM.compare(DOM.eventGetCurrentTarget(event), getElement())) {
+        if (DOM.eventGetCurrentTarget(event) == getElement()) {
           elementClicked(root, DOM.eventGetTarget(event));
         }
         break;
@@ -711,7 +711,7 @@
    * Collects parents going up the element tree, terminated at the tree root.
    */
   private void collectElementChain(ArrayList<Element> chain, Element hRoot, Element hElem) {
-    if ((hElem == null) || DOM.compare(hElem, hRoot)) {
+    if ((hElem == null) || (hElem == hRoot)) {
       return;
     }
 
@@ -752,7 +752,7 @@
     Element hCurElem = chain.get(idx);
     for (int i = 0, n = root.getChildCount(); i < n; ++i) {
       TreeItem child = root.getChild(i);
-      if (DOM.compare(child.getElement(), hCurElem)) {
+      if (child.getElement() == hCurElem) {
         TreeItem retItem = findItemByChain(chain, idx + 1, root.getChild(i));
         if (retItem == null) {
           return child;
diff --git a/user/src/com/google/gwt/user/client/ui/impl/TextBoxImplIE6.java b/user/src/com/google/gwt/user/client/ui/impl/TextBoxImplIE6.java
index 9bc5933..3a3a52c 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/TextBoxImplIE6.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/TextBoxImplIE6.java
@@ -27,7 +27,7 @@
   public native int getCursorPos(Element elem) /*-{
     try {
       var tr = elem.document.selection.createRange();
-      if (tr.parentElement().uniqueID != elem.uniqueID)
+      if (tr.parentElement() !== elem)
         return -1;
       return -tr.move("character", -65535);
     }
@@ -40,7 +40,7 @@
   public native int getSelectionLength(Element elem) /*-{
     try {
       var tr = elem.document.selection.createRange();
-      if (tr.parentElement().uniqueID != elem.uniqueID)
+      if (tr.parentElement() !== elem)
         return 0;
       return tr.text.length;
     }
diff --git a/user/src/com/google/gwt/xml/client/impl/DOMItem.java b/user/src/com/google/gwt/xml/client/impl/DOMItem.java
index 98ff3ea..df16f26 100644
--- a/user/src/com/google/gwt/xml/client/impl/DOMItem.java
+++ b/user/src/com/google/gwt/xml/client/impl/DOMItem.java
@@ -16,7 +16,6 @@
 package com.google.gwt.xml.client.impl;
 
 import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.user.client.DOM;
 
 /**
  * This class is the base class for all DOM object wrappers.
@@ -38,14 +37,8 @@
    */
   @Override
   public boolean equals(final Object o) {
-    /*
-     * This method uses the DOM equals method because it happens to work
-     * perfectly for all the browsers we support, and that method is different
-     * for each browser.
-     */
     if (o instanceof DOMItem) {
-      return DOM.compare(castToElement(this.getJsObject()),
-          castToElement(((DOMItem) o).getJsObject()));
+      return this.getJsObject() == ((DOMItem) o).getJsObject();
     }
     return false;
   }
@@ -53,9 +46,4 @@
   JavaScriptObject getJsObject() {
     return jsObject;
   }
-
-  private native com.google.gwt.user.client.Element castToElement(
-      JavaScriptObject toBeCast) /*-{
-    return toBeCast;
-  }-*/;
 }
diff --git a/user/test/com/google/gwt/user/client/ui/DOMTest.java b/user/test/com/google/gwt/user/client/ui/DOMTest.java
index 53dda7f..c58977f 100644
--- a/user/test/com/google/gwt/user/client/ui/DOMTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DOMTest.java
@@ -157,7 +157,7 @@
     DOM.insertChild(parent, div, Integer.MAX_VALUE);
     Element child = DOM.getChild(RootPanel.get().getElement(),
         DOM.getChildCount(parent) - 1);
-    assertTrue(DOM.compare(div, child));
+    assertTrue(div == child);
   }
 
   /**
diff --git a/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java b/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java
index c192ebc..f0c478c 100644
--- a/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java
@@ -66,8 +66,7 @@
     }
 
     // Check the container element
-    assertTrue(DOM.compare(DOM.getFirstChild(panel.getCellElement(2, 1)),
-        panel.getContainerElement()));
+    assertTrue(DOM.getFirstChild(panel.getCellElement(2, 1)) == panel.getContainerElement());
   }
 
   /**
@@ -87,7 +86,6 @@
     }
 
     // Check the container element
-    assertTrue(DOM.compare(DOM.getFirstChild(panel.getCellElement(1, 1)),
-        panel.getContainerElement()));
+    assertTrue(DOM.getFirstChild(panel.getCellElement(1, 1)) == panel.getContainerElement());
   }
 }
diff --git a/user/test/com/google/gwt/user/client/ui/DockPanelTest.java b/user/test/com/google/gwt/user/client/ui/DockPanelTest.java
index 19e8fcd..543d714 100644
--- a/user/test/com/google/gwt/user/client/ui/DockPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DockPanelTest.java
@@ -43,7 +43,7 @@
       Element curElem = getElement();
       Element body = RootPanel.getBodyElement();
       while (curElem != null) {
-        if (DOM.compare(curElem, body)) {
+        if (curElem == body) {
           attachedWhenLoaded = true;
         }
         curElem = DOM.getParent(curElem);
diff --git a/user/test/com/google/gwt/user/client/ui/PopupTest.java b/user/test/com/google/gwt/user/client/ui/PopupTest.java
index 6b4f122..675ef31 100644
--- a/user/test/com/google/gwt/user/client/ui/PopupTest.java
+++ b/user/test/com/google/gwt/user/client/ui/PopupTest.java
@@ -90,7 +90,6 @@
     TestablePopupPanel p2 = new TestablePopupPanel();
     assertTrue(p1.getContainerElement() != null);
     assertTrue(p2.getContainerElement() != null);
-    assertFalse(
-        DOM.compare(p1.getContainerElement(), p2.getContainerElement()));
+    assertFalse(p1.getContainerElement() == p2.getContainerElement());
   }
 }