ie9 bug fixes.
Review at http://gwt-code-reviews.appspot.com/1383809
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9915 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/dom/client/DOMImpl.java b/user/src/com/google/gwt/dom/client/DOMImpl.java
index fd1a45d..d917be0 100644
--- a/user/src/com/google/gwt/dom/client/DOMImpl.java
+++ b/user/src/com/google/gwt/dom/client/DOMImpl.java
@@ -32,6 +32,13 @@
return e;
}-*/;
+ public native InputElement createCheckInputElement(Document doc) /*-{
+ var e = doc.createElement("INPUT");
+ e.type = 'checkbox';
+ e.value = 'on';
+ return e;
+ }-*/;
+
public native Element createElement(Document doc, String tag) /*-{
return doc.createElement(tag);
}-*/;
diff --git a/user/src/com/google/gwt/dom/client/DOMImplIE9.java b/user/src/com/google/gwt/dom/client/DOMImplIE9.java
index 03ab62f..45e4d97 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplIE9.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplIE9.java
@@ -19,18 +19,44 @@
* IE9 based implementation of {@link com.google.gwt.user.client.impl.DOMImplStandardBase}.
*/
class DOMImplIE9 extends DOMImplStandardBase {
+
@Override
public int getAbsoluteLeft(Element elem) {
- Document doc = elem.getOwnerDocument();
- return getBoundingClientRectLeft(elem) + doc.getScrollLeft();
+ int left = getBoundingClientRectLeft(elem) + getDocumentScrollLeftImpl();
+ if (isRTL(elem)) { // in RTL, account for the scroll bar shift if present
+ left += getParentOffsetDelta(elem);
+ }
+ return left;
}
@Override
public int getAbsoluteTop(Element elem) {
- Document doc = elem.getOwnerDocument();
- return getBoundingClientRectTop(elem) + doc.getScrollTop();
+ return getBoundingClientRectTop(elem) + getDocumentScrollTopImpl();
}
+ @Override
+ public int getScrollLeft(Document doc) {
+ return getDocumentScrollLeftImpl();
+ }
+
+ public int getScrollLeft(Element elem) {
+ int left = getScrollLeftImpl(elem);
+ if (isRTL(elem)) {
+ left = -left;
+ }
+ return left;
+ }
+
+ @Override
+ public int getScrollTop(Document doc) {
+ return getDocumentScrollTopImpl();
+ }
+
+ @Override
+ public native int getTabIndex(Element elem) /*-{
+ return elem.tabIndex < 65535 ? elem.tabIndex : -(elem.tabIndex % 65535) - 1;
+ }-*/;
+
public native void selectRemoveOption(SelectElement select, int index) /*-{
try {
// IE9 throws if elem at index is an optgroup
@@ -40,16 +66,24 @@
}
}-*/;
+ @Override
+ public void setScrollLeft(Element elem, int left) {
+ if (isRTL(elem)) {
+ left = -left;
+ }
+ setScrollLeftImpl(elem, left);
+ }
+
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 {
- return elem.getBoundingClientRect().left;
- } catch (e) {
- // if not attached return 0
- return 0;
- }
-}-*/;
+ try {
+ return elem.getBoundingClientRect().left;
+ } catch (e) {
+ // if not attached return 0
+ return 0;
+ }
+ }-*/;
protected native int getBoundingClientRectTop(Element elem) /*-{
// getBoundingClientRect() throws a JS exception if the elem is not attached
@@ -61,4 +95,28 @@
return 0;
}
}-*/;
+
+ private native int getDocumentScrollLeftImpl() /*-{
+ return $wnd.pageXOffset;
+ }-*/;
+
+ private native int getDocumentScrollTopImpl() /*-{
+ return $wnd.pageYOffset;
+ }-*/;
+
+ private native int getParentOffsetDelta(Element elem) /*-{
+ var offsetParent = elem.offsetParent;
+ if (offsetParent) {
+ return offsetParent.offsetWidth - offsetParent.clientWidth;
+ }
+ return 0;
+ }-*/;
+
+ private native int getScrollLeftImpl(Element elem) /*-{
+ return elem.scrollLeft || 0;
+ }-*/;
+
+ private native void setScrollLeftImpl(Element elem, int left) /*-{
+ elem.scrollLeft = left;
+ }-*/;
}
diff --git a/user/src/com/google/gwt/dom/client/DOMImplStandard.java b/user/src/com/google/gwt/dom/client/DOMImplStandard.java
index 7fd9711..9811b27 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplStandard.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplStandard.java
@@ -36,6 +36,7 @@
var elem = doc.createElement("INPUT");
elem.type = 'radio';
elem.name = name;
+ elem.value = 'on';
return elem;
}-*/;
diff --git a/user/src/com/google/gwt/dom/client/DOMImplStandardBase.java b/user/src/com/google/gwt/dom/client/DOMImplStandardBase.java
index ab620f7..68aafb6 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplStandardBase.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplStandardBase.java
@@ -280,6 +280,10 @@
doc.getBody().setScrollTop(top);
}
+ protected native boolean isRTL(Element elem) /*-{
+ return elem.ownerDocument.defaultView.getComputedStyle(elem, '').direction == 'rtl';
+ }-*/;
+
private native NativeEvent createKeyEvent(Document doc, String type,
boolean canBubble, boolean cancelable, boolean ctrlKey, boolean altKey,
boolean shiftKey, boolean metaKey) /*-{
@@ -294,9 +298,5 @@
evt.metaKey = metaKey;
return evt;
}-*/;
-
- private native boolean isRTL(Element elem) /*-{
- return elem.ownerDocument.defaultView.getComputedStyle(elem, '').direction == 'rtl';
- }-*/;
}
diff --git a/user/src/com/google/gwt/dom/client/Document.java b/user/src/com/google/gwt/dom/client/Document.java
index b0778fa..ce96a90 100644
--- a/user/src/com/google/gwt/dom/client/Document.java
+++ b/user/src/com/google/gwt/dom/client/Document.java
@@ -174,7 +174,7 @@
* @return the newly created element
*/
public final InputElement createCheckInputElement() {
- return DOMImpl.impl.createInputElement(this, "checkbox");
+ return DOMImpl.impl.createCheckInputElement(this);
}
/**
diff --git a/user/src/com/google/gwt/junit/public/junit-standards.html b/user/src/com/google/gwt/junit/public/junit-standards.html
index 36f1869..490ee0c 100644
--- a/user/src/com/google/gwt/junit/public/junit-standards.html
+++ b/user/src/com/google/gwt/junit/public/junit-standards.html
@@ -18,7 +18,7 @@
<head>
<meta name='gwt:onLoadErrorFn' content='junitOnLoadErrorFn'>
<meta name='gwt:onPropertyErrorFn' content='junitOnPropertyErrorFn'>
-<meta http-equiv="X-UA-Compatible" content="IE=IE9,IE8,IE7">
+<meta http-equiv="X-UA-Compatible" content="IE=9;">
</head>
<body>
<script language='javascript'>
diff --git a/user/test/com/google/gwt/user/client/EventTest.java b/user/test/com/google/gwt/user/client/EventTest.java
index 9769241..308b036 100644
--- a/user/test/com/google/gwt/user/client/EventTest.java
+++ b/user/test/com/google/gwt/user/client/EventTest.java
@@ -562,6 +562,8 @@
}
private native boolean isInternetExplorer() /*-{
- return navigator.userAgent.toLowerCase().indexOf("msie") != -1;
+ // rely on IE9 behavior being closer to Standard/Chrome/Safari
+ return navigator.userAgent.toLowerCase().indexOf("msie") != -1 &&
+ document.documentMode != 9;
}-*/;
}