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;
   }-*/;
 }