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 -~----------~----~----~----~------~----~------~--~---