]> source.dussan.org Git - vaadin-framework.git/commitdiff
Use computed style in more IE9 edge cases (#13359)
authorArtur Signell <artur@vaadin.com>
Fri, 19 Jun 2015 11:22:56 +0000 (14:22 +0300)
committerHenri Sara <hesara@vaadin.com>
Sat, 4 Jul 2015 10:22:22 +0000 (13:22 +0300)
Change-Id: Ifa84ad55462fcff90159ea08a61a11f613951adc

client/src/com/vaadin/client/WidgetUtil.java
uitest/src/com/vaadin/tests/components/orderedlayout/OrderedLayoutInfiniteLayoutPasses.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/orderedlayout/OrderedLayoutInfiniteLayoutPassesTest.java [new file with mode: 0644]

index fca6fbccbc7da20a1c0d902ff9cc926f58ff2e85..7d4f613e4ef5e1311cd9f09669df01fc24b76cf4 100644 (file)
@@ -553,10 +553,11 @@ public class WidgetUtil {
         double reqWidth = getRequiredWidthBoundingClientRectDouble(element);
         if (BrowserInfo.get().isIE() && !BrowserInfo.get().isIE8()) {
             double csWidth = getRequiredWidthComputedStyleDouble(element);
-            if (csWidth > reqWidth && csWidth < (reqWidth + 1)) {
+            if (csWidth > reqWidth && csWidth <= (reqWidth + 1)) {
                 // IE9 rounds reqHeight to integers BUT sometimes reports wrong
                 // csHeight it seems, so we only use csHeight if it is within a
                 // rounding error
+
                 return csWidth;
             }
         }
@@ -602,10 +603,14 @@ public class WidgetUtil {
         double reqHeight = getRequiredHeightBoundingClientRectDouble(element);
         if (BrowserInfo.get().isIE() && !BrowserInfo.get().isIE8()) {
             double csHeight = getRequiredHeightComputedStyleDouble(element);
-            if (csHeight > reqHeight && csHeight < (reqHeight + 1)) {
+            if (csHeight > reqHeight && csHeight <= (reqHeight + 1)) {
                 // IE9 rounds reqHeight to integers BUT sometimes reports wrong
                 // csHeight it seems, so we only use csHeight if it is within a
                 // rounding error
+
+                // Although sometimes it also happens that IE9 returns an
+                // incorrectly rounded down requiredHeight and a computed height
+                // which is exactly one larger, hence the "<="...
                 return csHeight;
             }
         }
diff --git a/uitest/src/com/vaadin/tests/components/orderedlayout/OrderedLayoutInfiniteLayoutPasses.java b/uitest/src/com/vaadin/tests/components/orderedlayout/OrderedLayoutInfiniteLayoutPasses.java
new file mode 100644 (file)
index 0000000..9c54dba
--- /dev/null
@@ -0,0 +1,68 @@
+package com.vaadin.tests.components.orderedlayout;
+
+import com.vaadin.server.Page;
+import com.vaadin.server.Page.Styles;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.UI;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.Window;
+
+@SuppressWarnings("serial")
+public class OrderedLayoutInfiniteLayoutPasses extends UI {
+
+    @Override
+    protected void init(VaadinRequest request) {
+        VerticalLayout layout = new VerticalLayout();
+        layout.addComponent(createOpenWindowButton());
+        setContent(layout);
+
+        Styles styles = Page.getCurrent().getStyles();
+        styles.add(".my-separator {background-color: lightgray; min-height:2px;max-height:2px} ");
+    }
+
+    private Button createOpenWindowButton() {
+        Button button = new Button("Open modal window");
+        button.addClickListener(new ClickListener() {
+
+            @Override
+            public void buttonClick(ClickEvent event) {
+                UI.getCurrent().addWindow(createWindow());
+            }
+        });
+        return button;
+    }
+
+    private Window createWindow() {
+        VerticalLayout contentHolder = new VerticalLayout();
+        contentHolder.addComponent(new Label("window content"));
+
+        Label separator = new Label();
+        separator.setWidth(100, Unit.PERCENTAGE);
+        separator.addStyleName("my-separator");
+
+        HorizontalLayout buttons = new HorizontalLayout();
+        buttons.addComponent(new Button("button 1"));
+        buttons.addComponent(new Button("button 2"));
+
+        VerticalLayout windowContent = new VerticalLayout();
+        windowContent.setSizeFull();
+        windowContent.addComponent(contentHolder);
+        windowContent.addComponent(separator);
+        windowContent.addComponent(buttons);
+        windowContent.setExpandRatio(contentHolder, 1.0f);
+
+        Window window = new Window();
+        window.setModal(true);
+        window.setWidth(680, Unit.PIXELS);
+        window.setHeight(700, Unit.PIXELS);
+        window.setContent(windowContent);
+
+        return window;
+    }
+
+}
\ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/orderedlayout/OrderedLayoutInfiniteLayoutPassesTest.java b/uitest/src/com/vaadin/tests/components/orderedlayout/OrderedLayoutInfiniteLayoutPassesTest.java
new file mode 100644 (file)
index 0000000..1a2a9cb
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ * 
+ * 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.vaadin.tests.components.orderedlayout;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.parallel.Browser;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class OrderedLayoutInfiniteLayoutPassesTest extends MultiBrowserTest {
+
+    @Override
+    protected boolean requireWindowFocusForIE() {
+        return true;
+    }
+
+    @Override
+    public List<DesiredCapabilities> getBrowsersToTest() {
+        List<DesiredCapabilities> b = super.getBrowsersToTest();
+        // Chrome and PhantomJS do not support browser zoom changes
+        b.remove(Browser.CHROME.getDesiredCapabilities());
+        b.remove(Browser.PHANTOMJS.getDesiredCapabilities());
+        return b;
+    }
+
+    @Test
+    public void ensureFiniteLayoutPhase() throws Exception {
+        openTestURL("debug");
+        zoomBrowserIn();
+        try {
+            $(ButtonElement.class).first().click();
+            assertNoErrorNotifications();
+            resetZoom();
+            assertNoErrorNotifications();
+        } finally {
+            // Reopen test to ensure that modal window does not prevent zoom
+            // reset from taking place
+            openTestURL();
+            resetZoom();
+        }
+    }
+
+    private void zoomBrowserIn() {
+        WebElement html = driver.findElement(By.tagName("html"));
+        html.sendKeys(Keys.chord(Keys.CONTROL, Keys.SUBTRACT));
+    }
+
+    private void resetZoom() {
+        WebElement html = driver.findElement(By.tagName("html"));
+        html.sendKeys(Keys.chord(Keys.CONTROL, "0"));
+    }
+}