Remove IE6 LayoutImpl & make IE9 use standard impl

Change-Id: Ic333252c1ab4944520f041694f2181fdb9dd736e
diff --git a/user/src/com/google/gwt/layout/Layout.gwt.xml b/user/src/com/google/gwt/layout/Layout.gwt.xml
index cd773de..05ac65b 100644
--- a/user/src/com/google/gwt/layout/Layout.gwt.xml
+++ b/user/src/com/google/gwt/layout/Layout.gwt.xml
@@ -18,22 +18,17 @@
   <inherits name="com.google.gwt.dom.DOM"/>
   <inherits name="com.google.gwt.animation.Animation"/>
   <inherits name="com.google.gwt.aria.Aria"/>
-  <!--  LayoutImplIE6 uses c.g.g.u.c.Window -->
-  <inherits name="com.google.gwt.user.Window"/>
+
   <source path="client" />
-  <public path="public" />
 
   <replace-with class="com.google.gwt.layout.client.LayoutImplIE8">
     <when-type-is class="com.google.gwt.layout.client.LayoutImpl"/>
-    <any>
+    <all>
       <when-property-is name="user.agent" value="ie8"/>
-      <when-property-is name="user.agent" value="ie9"/>
-      <when-property-is name="user.agent" value="ie10"/>
-    </any>
-  </replace-with>
-
-  <replace-with class="com.google.gwt.layout.client.LayoutImplIE6">
-    <when-type-is class="com.google.gwt.layout.client.LayoutImpl"/>
-    <when-property-is name="user.agent" value="ie6"/>
+      <none>
+        <!-- Prevent IE9 fallback to IE8 -->
+        <when-property-is name="user.agent" value="ie9"/>
+      </none>
+    </all>
   </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/layout/client/LayoutImplIE6.java b/user/src/com/google/gwt/layout/client/LayoutImplIE6.java
deleted file mode 100644
index 8e7513c..0000000
--- a/user/src/com/google/gwt/layout/client/LayoutImplIE6.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.layout.client;
-
-import static com.google.gwt.dom.client.Style.Unit.PX;
-
-import com.google.gwt.dom.client.DivElement;
-import com.google.gwt.dom.client.Document;
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.dom.client.Style;
-import com.google.gwt.dom.client.Style.Display;
-import com.google.gwt.dom.client.Style.Overflow;
-import com.google.gwt.dom.client.Style.Position;
-import com.google.gwt.event.logical.shared.ResizeEvent;
-import com.google.gwt.event.logical.shared.ResizeHandler;
-import com.google.gwt.layout.client.Layout.Layer;
-import com.google.gwt.user.client.Window;
-
-/**
- * IE6-specific implementation, which uses the "onresize" event, along with a
- * series of measurement tools, to deal with several IE6 bugs. Specifically,
- * IE6 doesn't support simultaneous left-right and top-bottom values, and it
- * misplaces by one pixel elements whose right/bottom properties are set.
- * 
- * Because this implementation gets compiled in for both IE6 and 7, it
- * dynamically detects IE7 and punts to the super implementation.
- */
-class LayoutImplIE6 extends LayoutImplIE8 {
-
-  private static Element createStyleRuler(Element parent) {
-    DivElement styleRuler = Document.get().createDivElement();
-    DivElement styleInner = Document.get().createDivElement();
-
-    styleRuler.getStyle().setPosition(Position.ABSOLUTE);
-    styleRuler.getStyle().setLeft(-10000, PX);
-
-    parent.appendChild(styleRuler);
-    styleRuler.appendChild(styleInner);
-    return styleRuler;
-  }
-
-  private static void hookWindowResize(final Element elem) {
-    Window.addResizeHandler(new ResizeHandler() {
-      public void onResize(ResizeEvent event) {
-        resizeRelativeToParent(elem);
-      }
-    });
-  }
-
-  private static native void measureDecoration(Element elem) /*-{
-    var ruler = elem.__styleRuler;
-    var inner = ruler.children[0];
-    var s = inner.style, cs = elem.currentStyle;
-
-    s.borderLeftStyle = cs.borderLeftStyle;
-    s.borderRightStyle = cs.borderRightStyle;
-    s.borderTopStyle = cs.borderTopStyle;
-    s.borderBottomStyle = cs.borderBottomStyle;
-
-    s.borderLeftWidth = cs.borderLeftWidth;
-    s.borderRightWidth = cs.borderRightWidth;
-    s.borderTopWidth = cs.borderTopWidth;
-    s.borderBottomWidth = cs.borderBottomWidth;
-
-    // Oddly enough, allowing the word 'auto' to creep into the style
-    // ruler's margin causes it to take up all of its parent's space.
-    s.marginLeft = (cs.marginLeft == 'auto') ? '' : cs.marginLeft;
-    s.marginRight = (cs.marginRight == 'auto') ? '' : cs.marginRight;
-    s.marginTop = (cs.marginTop == 'auto') ? '' : cs.marginTop;
-    s.marginBottom = (cs.marginBottom == 'auto') ? '' : cs.marginBottom;
-
-    s.paddingLeft = cs.paddingLeft;
-    s.paddingRight = cs.paddingRight;
-    s.paddingTop = cs.paddingTop;
-    s.paddingBottom = cs.paddingBottom;
-
-    s.width = s.height = 32;
-    elem.__decoWidth = ruler.offsetWidth - 32;
-    elem.__decoHeight = ruler.offsetHeight - 32;
-  }-*/;
-
-  private static native void resizeRelativeToParent(Element elem) /*-{
-    var parent = elem.__resizeParent;
-    if (parent) {
-      @com.google.gwt.layout.client.LayoutImplIE6::measureDecoration(Lcom/google/gwt/dom/client/Element;)(elem);
-      elem.style.left = 0;
-      elem.style.top = 0;
-      elem.style.width = parent.clientWidth - elem.__decoWidth;
-      elem.style.height = parent.clientHeight - elem.__decoHeight;
-    }
-  }-*/;
-
-  private static native void setLayer(Element container, Layer layer) /*-{
-    // Potential leak: This is cleaned up in detach().
-    container.__layer = layer;
-  }-*/;
-
-  private static native void setPropertyElement(Element elem, String name,
-      Element value) /*-{
-    elem[name] = value;
-  }-*/;
-
-  @Override
-  public Element attachChild(Element parent, Element child, Element before) {
-    DivElement container = Document.get().createDivElement();
-    container.appendChild(child);
-
-    container.getStyle().setPosition(Position.ABSOLUTE);
-    container.getStyle().setOverflow(Overflow.HIDDEN);
-    child.getStyle().setPosition(Position.ABSOLUTE);
-
-    // Hang the style ruler from the container element, but associate it with
-    // the child element, so that measureDecoration(child) will work.
-    setPropertyElement(child, "__styleRuler", createStyleRuler(container));
-
-    Element beforeContainer = null;
-    if (before != null) {
-      beforeContainer = before.getParentElement();
-      assert beforeContainer.getParentElement() == parent : "Element to insert before must be a sibling";
-    }
-    parent.insertBefore(container, beforeContainer);
-    return container;
-  }
-
-  @Override
-  public void fillParent(Element elem) {
-    fillParentImpl(elem);
-  }
-
-  @Override
-  public void finalizeLayout(Element parent) {
-    resizeRelativeToParent(parent);
-    resizeHandler(parent, true);
-  }
-
-  @Override
-  public void initParent(Element parent) {
-    super.initParent(parent);
-    setPropertyElement(parent, "__styleRuler", createStyleRuler(parent));
-  }
-
-  @Override
-  public void layout(Layer layer) {
-    Element elem = layer.container;
-    Style style = elem.getStyle();
-
-    if (layer.visible) {
-      style.clearDisplay();
-    } else {
-      style.setDisplay(Display.NONE);
-    }
-
-    setLayer(elem, layer);
-  }
-
-  @Override
-  public void onAttach(Element parent) {
-    // No need to re-connect layer refs. This will be taken care of
-    // automatically in layout().
-    initResizeHandler(parent);
-    initUnitChangeHandler(parent, relativeRuler);
-  }
-
-  @Override
-  public void onDetach(Element parent) {
-    removeLayerRefs(parent);
-    removeResizeHandler(parent);
-    removeUnitChangeHandler(relativeRuler);
-  }
-
-  private native void fillParentImpl(Element elem) /*-{
-    // Hook the parent element's onresize event. If the parent is the <body>,
-    // then we have to go through the Window class to get the resize event,
-    // because IE6 requires a bunch of foul hackery to safely hook it.
-    var parent = elem.parentElement;
-    if (parent.tagName.toLowerCase() == 'body') {
-      elem.style.position = 'absolute';
-      var docElem = parent.parentElement;
-      elem.__resizeParent = docElem;
-      @com.google.gwt.layout.client.LayoutImplIE6::hookWindowResize(Lcom/google/gwt/dom/client/Element;)(elem);
-      return;
-    }
-
-    function resize() {
-      @com.google.gwt.layout.client.LayoutImplIE6::resizeRelativeToParent(Lcom/google/gwt/dom/client/Element;)(elem);
-    }
-
-    elem.__resizeParent = parent;
-    parent.onresize = resize;
-    resize();
-  }-*/;
-
-  /**
-   * This does not call $entry() because no user code is reachable from
-   * resizeHandler.
-   */
-  private native void initResizeHandler(Element parent) /*-{
-    // Potential leak: This is cleaned up in detach().
-    var self = this;
-    parent.onresize = function() {
-      self.@com.google.gwt.layout.client.LayoutImplIE6::resizeHandler(Lcom/google/gwt/dom/client/Element;)(parent);
-    };
-  }-*/;
-
-  /**
-   * This does not call $entry() because no user code is reachable from
-   * resizeHandler.
-   */
-  private native void initUnitChangeHandler(Element parent, Element ruler) /*-{
-    // Potential leak: This is cleaned up in detach().
-    var self = this;
-    ruler.onresize = function() {
-      self.@com.google.gwt.layout.client.LayoutImplIE6::resizeHandler(Lcom/google/gwt/dom/client/Element;Z)(parent, true);
-    };
-  }-*/;
-
-  private native void removeLayerRefs(Element parent) /*-{
-    for (var i = 0; i < parent.childNodes.length; ++i) {
-      var container = parent.childNodes[i];
-      if (container.__layer) {
-        container.__layer = null;
-      }
-    }
-  }-*/;
-
-  private native void removeResizeHandler(Element parent) /*-{
-    parent.onresize = null;
-  }-*/;
-
-  private native void removeUnitChangeHandler(Element ruler) /*-{
-    ruler.onresize = null;
-  }-*/;
-
-  private void resizeHandler(Element parent) {
-    resizeHandler(parent, false);
-  }
-  
-  private native void resizeHandler(Element parent, boolean force) /*-{
-    if (!force &&
-        ((parent.offsetWidth == parent.__oldWidth) &&
-         (parent.offsetHeight == parent.__oldHeight))) {
-      return;
-    }
-    parent.__oldWidth = parent.offsetWidth;
-    parent.__oldHeight = parent.offsetHeight;
-
-    var parentWidth = parent.clientWidth;
-    var parentHeight = parent.clientHeight;
-
-    // Iterate over the children, assuming each of them is an unstyled
-    // container element.
-    for (var i = 0; i < parent.childNodes.length; ++i) {
-      // Don't attempt to layout the rulers.
-      var container = parent.childNodes[i];
-      var layer = container.__layer;
-      if (!layer) {
-        continue;
-      }
-
-      // This is ugly, but it's less ugly than writing all these JSNI refs inline.
-      var _setLeft = layer.@com.google.gwt.layout.client.Layout.Layer::setLeft;
-      var _setTop = layer.@com.google.gwt.layout.client.Layout.Layer::setTop;
-      var _setWidth = layer.@com.google.gwt.layout.client.Layout.Layer::setWidth;
-      var _setHeight = layer.@com.google.gwt.layout.client.Layout.Layer::setHeight;
-      var _setRight = layer.@com.google.gwt.layout.client.Layout.Layer::setRight;
-      var _setBottom = layer.@com.google.gwt.layout.client.Layout.Layer::setBottom;
-
-      var _left = layer.@com.google.gwt.layout.client.Layout.Layer::left;
-      var _top = layer.@com.google.gwt.layout.client.Layout.Layer::top;
-      var _width = layer.@com.google.gwt.layout.client.Layout.Layer::width;
-      var _height = layer.@com.google.gwt.layout.client.Layout.Layer::height;
-      var _right = layer.@com.google.gwt.layout.client.Layout.Layer::right;
-      var _bottom = layer.@com.google.gwt.layout.client.Layout.Layer::bottom;
-
-      var _leftUnit = layer.@com.google.gwt.layout.client.Layout.Layer::leftUnit;
-      var _topUnit = layer.@com.google.gwt.layout.client.Layout.Layer::topUnit;
-      var _widthUnit = layer.@com.google.gwt.layout.client.Layout.Layer::widthUnit;
-      var _heightUnit = layer.@com.google.gwt.layout.client.Layout.Layer::heightUnit;
-      var _rightUnit = layer.@com.google.gwt.layout.client.Layout.Layer::rightUnit;
-      var _bottomUnit = layer.@com.google.gwt.layout.client.Layout.Layer::bottomUnit;
-
-      var _hPos = layer.@com.google.gwt.layout.client.Layout.Layer::hPos
-                  .@com.google.gwt.layout.client.Layout.Alignment::ordinal()();
-      var _vPos = layer.@com.google.gwt.layout.client.Layout.Layer::vPos
-                  .@com.google.gwt.layout.client.Layout.Alignment::ordinal()();
-
-      // Apply the requested position & size values to the element's style.
-      var style = container.style;
-      style.left = _setLeft ? (_left + _leftUnit.@com.google.gwt.dom.client.Style.Unit::getType()()) : "";
-      style.top = _setTop ? (_top + _topUnit.@com.google.gwt.dom.client.Style.Unit::getType()()) : "";
-      style.width = _setWidth ? (_width + _widthUnit.@com.google.gwt.dom.client.Style.Unit::getType()()) : "";
-      style.height = _setHeight ? (_height + _heightUnit.@com.google.gwt.dom.client.Style.Unit::getType()()) : "";
-
-      // If right is defined, reposition/size the container horizontally.
-      if (_setRight) {
-        var ratio = this.@com.google.gwt.layout.client.LayoutImplIE6::getUnitSizeInPixels(Lcom/google/gwt/dom/client/Element;Lcom/google/gwt/dom/client/Style$Unit;Z)(parent, _rightUnit, false);
-        var right = parentWidth - (_right * ratio);
-
-        if (!_setLeft) {
-          // There's no left defined; adjust the left position move the element to the right edge.
-          container.style.left = (right - container.offsetWidth) + 'px';
-        } else {
-          // Both left and right are defined; calculate the width and set it.
-          var leftRatio = this.@com.google.gwt.layout.client.LayoutImplIE6::getUnitSizeInPixels(Lcom/google/gwt/dom/client/Element;Lcom/google/gwt/dom/client/Style$Unit;Z)(parent, _leftUnit, false);
-          var left = (_left * leftRatio);
-          if (right > left) {
-            container.style.width = (right - left) + 'px';
-          }
-        }
-      }
-
-      // If bottom is defined, reposition/size the container vertically.
-      if (_setBottom) {
-        var ratio = this.@com.google.gwt.layout.client.LayoutImplIE6::getUnitSizeInPixels(Lcom/google/gwt/dom/client/Element;Lcom/google/gwt/dom/client/Style$Unit;Z)(parent, _bottomUnit, true);
-        var bottom = parentHeight - (_bottom * ratio);
-
-        if (!_setTop) {
-          // There's no top defined; adjust the left position move the element to the bottom edge.
-          container.style.top = (bottom - container.offsetHeight) + 'px';
-        } else {
-          // Both top and bottom are defined; calculate the height and set it.
-          var topRatio = this.@com.google.gwt.layout.client.LayoutImplIE6::getUnitSizeInPixels(Lcom/google/gwt/dom/client/Element;Lcom/google/gwt/dom/client/Style$Unit;Z)(parent, _topUnit, true);
-          var top = (_top * topRatio);
-          if (bottom > top) {
-            container.style.height = (bottom - top) + 'px';
-          }
-        }
-      }
-
-      // Resize and position the child based on the layer's [hv]Pos.
-      var child = container.firstChild;
-      @com.google.gwt.layout.client.LayoutImplIE6::measureDecoration(Lcom/google/gwt/dom/client/Element;)(child);
-      var childDecoWidth = child.__decoWidth;
-      var childDecoHeight = child.__decoHeight;
-
-      if (container.offsetWidth > childDecoWidth) {
-        switch (_hPos) {
-          case 0: // BEGIN
-            child.style.left = '0px';
-            break;
-          case 1: // END
-            child.style.left = (container.offsetWidth - childDecoWidth - child.offsetWidth) + 'px';
-            break;
-          case 2: // STRETCH
-            child.style.left = '0px';
-            child.style.width = (container.offsetWidth - childDecoWidth) + 'px';
-            break;
-        }
-      }
-      if (container.offsetHeight > childDecoHeight) {
-        switch (_vPos) {
-          case 0: // BEGIN
-            child.style.top = '0px';
-            break;
-          case 1: // END
-            child.style.top = (container.offsetHeight - childDecoHeight - child.offsetHeight) + 'px';
-            break;
-          case 2: // STRETCH
-            child.style.top = '0px';
-            child.style.height = (container.offsetHeight - childDecoHeight) + 'px';
-            break;
-        }
-      }
-    }
-  }-*/;
-}