Author: [email protected] Date: Mon Jun 1 14:02:57 2009 New Revision: 5485 Modified: trunk/user/src/com/google/gwt/dom/client/DOMImplIE6.java trunk/user/src/com/google/gwt/dom/client/DOMImplIE8.java trunk/user/src/com/google/gwt/dom/client/DOMImplTrident.java trunk/user/test/com/google/gwt/dom/client/ElementTest.java
Log: Fixes missing body scroll-position addition in IE8's implementation of getAbsoluteLeft/Top(). Review: http://gwt-code-reviews.appspot.com/34827 Modified: trunk/user/src/com/google/gwt/dom/client/DOMImplIE6.java ============================================================================== --- trunk/user/src/com/google/gwt/dom/client/DOMImplIE6.java (original) +++ trunk/user/src/com/google/gwt/dom/client/DOMImplIE6.java Mon Jun 1 14:02:57 2009 @@ -24,14 +24,14 @@ @Override public int getAbsoluteLeft(Element elem) { Document doc = elem.getOwnerDocument(); - return (int) Math.floor(super.getAbsoluteLeft(elem) + return (int) Math.floor(getBoundingClientRectLeft(elem) / getZoomMultiple(doc) + doc.getScrollLeft()); } @Override public int getAbsoluteTop(Element elem) { Document doc = elem.getOwnerDocument(); - return (int) Math.floor(super.getAbsoluteTop(elem) + return (int) Math.floor(getBoundingClientRectTop(elem) / getZoomMultiple(doc) + doc.getScrollTop()); } Modified: trunk/user/src/com/google/gwt/dom/client/DOMImplIE8.java ============================================================================== --- trunk/user/src/com/google/gwt/dom/client/DOMImplIE8.java (original) +++ trunk/user/src/com/google/gwt/dom/client/DOMImplIE8.java Mon Jun 1 14:02:57 2009 @@ -18,6 +18,18 @@ class DOMImplIE8 extends DOMImplTrident { @Override + public int getAbsoluteLeft(Element elem) { + Document doc = elem.getOwnerDocument(); + return getBoundingClientRectLeft(elem) + doc.getScrollLeft(); + } + + @Override + public int getAbsoluteTop(Element elem) { + Document doc = elem.getOwnerDocument(); + return getBoundingClientRectTop(elem) + doc.getScrollTop(); + } + + @Override public int getScrollLeft(Element elem) { if (isRTL(elem)) { // IE8 returns increasingly *positive* values as you scroll left in RTL. Modified: trunk/user/src/com/google/gwt/dom/client/DOMImplTrident.java ============================================================================== --- trunk/user/src/com/google/gwt/dom/client/DOMImplTrident.java (original) +++ trunk/user/src/com/google/gwt/dom/client/DOMImplTrident.java Mon Jun 1 14:02:57 2009 @@ -166,16 +166,6 @@ return "[event" + evt.type + "]"; }-*/; - @Override - public int getAbsoluteLeft(Element elem) { - return getBoundingClientRectLeft(elem); - } - - @Override - public int getAbsoluteTop(Element elem) { - return getBoundingClientRectTop(elem); - } - /** * 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 @@ -253,23 +243,7 @@ elem.innerText = text || ''; }-*/; - protected native boolean isRTL(Element elem) /*-{ - return elem.currentStyle.direction == 'rtl'; - }-*/; - - private native Element createElementInternal(Document doc, String tagName) /*-{ - return doc.createElement(tagName); - }-*/; - - // IE needs a container div *for each document* for use by createElement(). - private native Element ensureContainer(Document doc) /*-{ - if (!doc.__gwt_container) { - doc.__gwt_container = doc.createElement('div'); - } - return doc.__gwt_container; - }-*/; - - private native int getBoundingClientRectLeft(Element elem) /*-{ + protected native int getBoundingClientRectLeft(Element elem) /*-{ // getBoundingClientRect() throws a JS exception if the elem is not attached // to the document, so we wrap it in a try/catch block try { @@ -279,7 +253,7 @@ } }-*/; - private native int getBoundingClientRectTop(Element elem) /*-{ + protected native int getBoundingClientRectTop(Element elem) /*-{ // getBoundingClientRect() throws a JS exception if the elem is not attached // to the document, so we wrap it in a try/catch block try { @@ -287,6 +261,22 @@ } catch (e) { return 0; } + }-*/; + + protected native boolean isRTL(Element elem) /*-{ + return elem.currentStyle.direction == 'rtl'; + }-*/; + + private native Element createElementInternal(Document doc, String tagName) /*-{ + return doc.createElement(tagName); + }-*/; + + // IE needs a container div *for each document* for use by createElement(). + private native Element ensureContainer(Document doc) /*-{ + if (!doc.__gwt_container) { + doc.__gwt_container = doc.createElement('div'); + } + return doc.__gwt_container; }-*/; /** Modified: trunk/user/test/com/google/gwt/dom/client/ElementTest.java ============================================================================== --- trunk/user/test/com/google/gwt/dom/client/ElementTest.java (original) +++ trunk/user/test/com/google/gwt/dom/client/ElementTest.java Mon Jun 1 14:02:57 2009 @@ -16,6 +16,8 @@ package com.google.gwt.dom.client; import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.dom.client.Style.Position; +import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DeferredCommand; @@ -212,37 +214,28 @@ } /** - * scroll[Left|Top], scrollIntoView. + * scroll[Left|Top], getAbsolute[Left|Top]. */ - public void testGetAbsolutePositionWhenScrolled() { - final DivElement outer = Document.get().createDivElement(); - final DivElement inner = Document.get().createDivElement(); - - outer.getStyle().setProperty("position", "absolute"); - outer.getStyle().setProperty("top", "0px"); - outer.getStyle().setProperty("left", "0px"); - outer.getStyle().setProperty("overflow", "auto"); - outer.getStyle().setProperty("width", "200px"); - outer.getStyle().setProperty("height", "200px"); + public void testGetAbsolutePositionWhenBodyScrolled() { + Document doc = Document.get(); + BodyElement body = doc.getBody(); - inner.getStyle().setProperty("marginTop", "800px"); - inner.getStyle().setProperty("marginLeft", "800px"); + DivElement div = doc.createDivElement(); + body.appendChild(div); - outer.appendChild(inner); - Document.get().getBody().appendChild(outer); - inner.setInnerText(":-)"); - inner.scrollIntoView(); + div.setInnerText("foo"); + div.getStyle().setPosition(Position.ABSOLUTE); + div.getStyle().setLeft(1000, Unit.PX); + div.getStyle().setTop(1000, Unit.PX); - // Ensure that we are scrolled. - assertTrue(outer.getScrollTop() > 0); - assertTrue(outer.getScrollLeft() > 0); + int absLeft = div.getAbsoluteLeft(); + int absTop = div.getAbsoluteTop(); - outer.setScrollLeft(0); - outer.setScrollTop(0); + body.setScrollLeft(10000); + body.setScrollTop(10000); - // Ensure that we are no longer scrolled. - assertEquals(outer.getScrollTop(), 0); - assertEquals(outer.getScrollLeft(), 0); + assertEquals(absLeft, div.getAbsoluteLeft()); + assertEquals(absTop, div.getAbsoluteTop()); } /** @@ -308,6 +301,20 @@ } /** + * Tests Element.is() and Element.as(). + */ + public void testIsAndAs() { + assertFalse(Element.is(Document.get())); + + Node div = Document.get().createDivElement(); + assertTrue(Element.is(div)); + assertEquals("div", Element.as(div).getTagName().toLowerCase()); + + // Element.is(null) is allowed and should return false. + assertFalse(Element.is(null)); + } + + /** * Document.createElement('ns:tag'), getTagName(). */ public void testNamespaces() { @@ -392,6 +399,40 @@ } /** + * scroll[Left|Top], scrollIntoView. + */ + public void testScrollIntoView() { + final DivElement outer = Document.get().createDivElement(); + final DivElement inner = Document.get().createDivElement(); + + outer.getStyle().setProperty("position", "absolute"); + outer.getStyle().setProperty("top", "0px"); + outer.getStyle().setProperty("left", "0px"); + outer.getStyle().setProperty("overflow", "auto"); + outer.getStyle().setProperty("width", "200px"); + outer.getStyle().setProperty("height", "200px"); + + inner.getStyle().setProperty("marginTop", "800px"); + inner.getStyle().setProperty("marginLeft", "800px"); + + outer.appendChild(inner); + Document.get().getBody().appendChild(outer); + inner.setInnerText(":-)"); + inner.scrollIntoView(); + + // Ensure that we are scrolled. + assertTrue(outer.getScrollTop() > 0); + assertTrue(outer.getScrollLeft() > 0); + + outer.setScrollLeft(0); + outer.setScrollTop(0); + + // Ensure that we are no longer scrolled. + assertEquals(outer.getScrollTop(), 0); + assertEquals(outer.getScrollLeft(), 0); + } + + /** * Tests that scrollLeft behaves as expected in RTL mode. */ public void testScrollLeftInRtl() { @@ -535,18 +576,4 @@ var ua = navigator.userAgent.toLowerCase(); return ua.indexOf("msie") != -1; }-*/; - - /** - * Tests Element.is() and Element.as(). - */ - public void testIsAndAs() { - assertFalse(Element.is(Document.get())); - - Node div = Document.get().createDivElement(); - assertTrue(Element.is(div)); - assertEquals("div", Element.as(div).getTagName().toLowerCase()); - - // Element.is(null) is allowed and should return false. - assertFalse(Element.is(null)); - } } --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---
