Author: jlaba...@google.com
Date: Wed Mar  4 11:23:10 2009
New Revision: 4921

Modified:
    releases/1.6/user/src/com/google/gwt/dom/client/DOMImpl.java
    releases/1.6/user/src/com/google/gwt/dom/client/DOMImplIE6.java
    releases/1.6/user/src/com/google/gwt/dom/client/Element.java
    releases/1.6/user/test/com/google/gwt/dom/client/ElementTest.java

Log:
In IE, Element.getAttribute(String) natively tries to get the property of  
the same name first, which results in an JS exception if the property  
return value if not of type String (ex. offsetWidth).  This patch uses a  
deferred binding for IE to coerce the return value into a string.

Patch by: jlabanca
Review by: jgw
Issue: 3238



Modified: releases/1.6/user/src/com/google/gwt/dom/client/DOMImpl.java
==============================================================================
--- releases/1.6/user/src/com/google/gwt/dom/client/DOMImpl.java        
(original)
+++ releases/1.6/user/src/com/google/gwt/dom/client/DOMImpl.java        Wed Mar 
 4  
11:23:10 2009
@@ -160,6 +160,10 @@
      return top;
    }-*/;

+  public native String getAttribute(Element elem, String name) /*-{
+    return elem.getAttribute(name) || '';
+  }-*/;
+
    public native int getBodyOffsetLeft() /*-{
      return 0;
    }-*/;

Modified: releases/1.6/user/src/com/google/gwt/dom/client/DOMImplIE6.java
==============================================================================
--- releases/1.6/user/src/com/google/gwt/dom/client/DOMImplIE6.java      
(original)
+++ releases/1.6/user/src/com/google/gwt/dom/client/DOMImplIE6.java     Wed  
Mar  4 11:23:10 2009
@@ -160,6 +160,17 @@
      }
    }-*/;

+  /**
+   * IE returns a numeric type for some attributes that are really  
properties,
+   * such as offsetWidth.  We need to coerce these to strings to prevent a
+   * runtime JS exception.
+   */
+  @Override
+  public native String getAttribute(Element elem, String name) /*-{
+    var attr = elem.getAttribute(name);
+    return attr == null? '' : attr + '';
+  }-*/;
+
    @Override
    public native int getBodyOffsetLeft() /*-{
      return  
@com.google.gwt.user.client.impl.DocumentRootImpl::documentRoot.clientLeft;

Modified: releases/1.6/user/src/com/google/gwt/dom/client/Element.java
==============================================================================
--- releases/1.6/user/src/com/google/gwt/dom/client/Element.java        
(original)
+++ releases/1.6/user/src/com/google/gwt/dom/client/Element.java        Wed Mar 
 4  
11:23:10 2009
@@ -66,15 +66,18 @@
    }

    /**
-   * Retrieves an attribute value by name.
+   * Retrieves an attribute value by name.  Attribute support can be
+   * inconsistent across various browsers.  Consider using the accessors in
+   * {...@link Element} and its specific subclasses to retrieve attributes and
+   * properties.
     *
     * @param name The name of the attribute to retrieve
     * @return The Attr value as a string, or the empty string if that  
attribute
     *         does not have a specified or default value
     */
-  public final native String getAttribute(String name) /*-{
-     return this.getAttribute(name) || '';
-   }-*/;
+  public final String getAttribute(String name) {
+    return DOMImpl.impl.getAttribute(this, name);
+  }

    /**
     * The class attribute of the element. This attribute has been renamed  
due to

Modified: releases/1.6/user/test/com/google/gwt/dom/client/ElementTest.java
==============================================================================
--- releases/1.6/user/test/com/google/gwt/dom/client/ElementTest.java    
(original)
+++ releases/1.6/user/test/com/google/gwt/dom/client/ElementTest.java   Wed  
Mar  4 11:23:10 2009
@@ -31,7 +31,7 @@
    }

    /**
-   * [get|set|remove]Attribute
+   * [get|set|remove]Attribute.
     */
    public void testElementAttribute() {
      DivElement div = Document.get().createDivElement();
@@ -44,7 +44,21 @@
    }

    /**
-   * getAbsolute[Left|Top]
+   * Ensure that the return type of an attribute is always a string. IE  
should
+   * not return a numeric attribute based on the element property. See  
issue
+   * 3238.
+   */
+  public void testElementAttributeNumeric() {
+    DivElement div = Document.get().createDivElement();
+    Document.get().getBody().appendChild(div);
+    div.setInnerText("Hello World");
+    div.getAttribute("offsetWidth").length();
+    div.getAttribute("offsetWidth").trim().length();
+    Document.get().getBody().removeChild(div);
+  }
+
+  /**
+   * getAbsolute[Left|Top].
     */
    public void testGetAbsolutePosition() {
      final int border = 8;
@@ -77,7 +91,7 @@
    }

    /**
-   * scroll[Left|Top], scrollIntoView
+   * scroll[Left|Top], scrollIntoView.
     */
    public void testGetAbsolutePositionWhenScrolled() {
      final DivElement outer = Document.get().createDivElement();
@@ -111,7 +125,7 @@
    }

    /**
-   * getParentElement
+   * getParentElement.
     */
    public void testGetParent() {
      Element element = Document.get().getBody();
@@ -131,7 +145,7 @@
    }

    /**
-   * firstChildElement, nextSiblingElement
+   * firstChildElement, nextSiblingElement.
     */
    public void testChildElements() {
      Document doc = Document.get();
@@ -151,7 +165,7 @@
    }

    /**
-   * isOrHasChild
+   * isOrHasChild.
     */
    public void testIsOrHasChild() {
      DivElement div = Document.get().createDivElement();
@@ -171,7 +185,7 @@
    }

    /**
-   * innerText
+   * innerText.
     */
    public void testSetInnerText() {
      Document doc = Document.get();
@@ -198,7 +212,7 @@
    }

    /**
-   * innerHTML
+   * innerHTML.
     */
    public void testSetInnerHTML() {
      DivElement div = Document.get().createDivElement();
@@ -213,7 +227,7 @@
    }

    /**
-   * setProperty*, getProperty*
+   * setProperty*, getProperty*.
     */
    public void testProperties() {
      DivElement div = Document.get().createDivElement();
@@ -231,7 +245,7 @@
    }

    /**
-   * className, id, tagName, title, dir, lang
+   * className, id, tagName, title, dir, lang.
     */
    public void testNativeProperties() {
      DivElement div = Document.get().createDivElement();
@@ -255,7 +269,7 @@
    }

    /**
-   * style
+   * style.
     */
    public void testStyle() {
      DivElement div = Document.get().createDivElement();
@@ -303,7 +317,7 @@
    }

    /**
-   * offset[Left|Top|Width|Height], offsetParent
+   * offset[Left|Top|Width|Height], offsetParent.
     */
    public void testOffsets() {
      DivElement outer = Document.get().createDivElement();
@@ -329,7 +343,7 @@
    }

    /**
-   * getElementsByTagName
+   * getElementsByTagName.
     */
    public void testGetElementsByTagName() {
      DivElement div = Document.get().createDivElement();

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to