]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixed Window resize issues when content gets smaller in IE8 #10750
authorJohn Ahlroos <john@vaadin.com>
Wed, 16 Jan 2013 08:05:31 +0000 (10:05 +0200)
committerJohn Ahlroos <john@vaadin.com>
Mon, 21 Jan 2013 11:20:47 +0000 (13:20 +0200)
Change-Id: I5ca165c12f9a376e1f22c1042dfb3c6138c2baef

client/src/com/vaadin/client/LayoutManager.java
client/src/com/vaadin/client/LayoutManagerIE8.java
client/src/com/vaadin/client/Util.java
client/src/com/vaadin/client/ui/window/WindowConnector.java

index 094afc5f0114cae974d38c9e4d5f7ee0adb37f6e..d83811d8c565ff5e92ca7c6a4577d74ca920a741 100644 (file)
@@ -28,7 +28,6 @@ import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.Style;
 import com.google.gwt.dom.client.Style.Overflow;
 import com.google.gwt.user.client.Timer;
-import com.google.gwt.user.client.ui.RootPanel;
 import com.vaadin.client.MeasuredSize.MeasureResult;
 import com.vaadin.client.ui.ManagedLayout;
 import com.vaadin.client.ui.PostLayoutListener;
@@ -250,6 +249,15 @@ public class LayoutManager {
         }
     }
 
+    /**
+     * Called once per iteration in the layout loop before size calculations so
+     * different browsers quirks can be handled. Mainly this is currently for
+     * the IE8 permutation.
+     */
+    protected void performBrowserLayoutHacks() {
+        // Permutations implement this
+    }
+
     private void doLayout() {
         VConsole.log("Starting layout phase");
 
@@ -280,15 +288,7 @@ public class LayoutManager {
             Duration passDuration = new Duration();
             passes++;
 
-            /*
-             * Fixes IE8 issues where IE8 sometimes forgets to update the size
-             * of the containing element. To force a reflow by modifying the
-             * magical zoom property.
-             */
-            if (BrowserInfo.get().isIE8()) {
-                int zoom = RootPanel.get().getElement().getPropertyInt("zoom");
-                RootPanel.get().getElement().setPropertyInt("zoom", zoom);
-            }
+            performBrowserLayoutHacks();
 
             int measuredConnectorCount = measureConnectors(
                     currentDependencyTree, everythingNeedsMeasure);
index 887f3dccbdec6a2721f8568f5d4e4cef7ce352af..b352e14dc6dd373254b686b8db1d4881028202f2 100644 (file)
@@ -71,4 +71,14 @@ public class LayoutManagerIE8 extends LayoutManager {
             }
         }
     }
+
+    @Override
+    protected void performBrowserLayoutHacks() {
+        /*
+         * Fixes IE8 issues where IE8 sometimes forgets to update the size of
+         * the containing element. To force a reflow by modifying the magical
+         * zoom property.
+         */
+        Util.forceIE8Redraw(RootPanel.get().getElement());
+    }
 }
index a29398706da8fce807b1ce801575841462ea5f6e..2cd01b2dd869e04323049c7253044d9b9cb00253 100644 (file)
@@ -881,6 +881,20 @@ public class Util {
         }
     }
 
+    /**
+     * Performs a hack to trigger a re-layout in the IE8. This is usually
+     * necessary in cases where IE8 "forgets" to update child elements when they
+     * resize.
+     * 
+     * @param e
+     *            The element to perform the hack on
+     */
+    public static final void forceIE8Redraw(Element e) {
+        if (BrowserInfo.get().isIE8()) {
+            setStyleTemporarily(e, "zoom", "1");
+        }
+    }
+
     /**
      * Detaches and re-attaches the element from its parent. The element is
      * reattached at the same position in the DOM as it was before.
@@ -1324,4 +1338,6 @@ public class Util {
             return a.getHref();
         }
     }
+
+
 }
index a4001733c6f0f96bdb66181a59b6f7980727878f..8cfc25a9dcf6ad18618d8e21299e518117605c26 100644 (file)
@@ -30,6 +30,7 @@ import com.vaadin.client.ConnectorHierarchyChangeEvent;
 import com.vaadin.client.LayoutManager;
 import com.vaadin.client.Paintable;
 import com.vaadin.client.UIDL;
+import com.vaadin.client.Util;
 import com.vaadin.client.ui.AbstractSingleComponentContainerConnector;
 import com.vaadin.client.ui.ClickEventHandler;
 import com.vaadin.client.ui.PostLayoutListener;
@@ -262,6 +263,10 @@ public class WindowConnector extends AbstractSingleComponentContainerConnector
         if (hasContent) {
             Element layoutElement = content.getWidget().getElement();
             Style childStyle = layoutElement.getStyle();
+
+            // IE8 needs some hackery to measure its content correctly
+            Util.forceIE8Redraw((com.google.gwt.user.client.Element) layoutElement);
+
             if (content.isRelativeHeight() && !BrowserInfo.get().isIE9()) {
                 childStyle.setPosition(Position.ABSOLUTE);