From 8945b432b571d9fa076e0f8a4899adc3908ae73c Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 19 Jun 2015 14:22:56 +0300 Subject: [PATCH] Use computed style in more IE9 edge cases (#13359) Change-Id: I847c9077199f46964ba8d1931e951529db6c5475 --- client/src/com/vaadin/client/WidgetUtil.java | 9 ++- .../OrderedLayoutInfiniteLayoutPasses.java | 68 ++++++++++++++++++ ...OrderedLayoutInfiniteLayoutPassesTest.java | 72 +++++++++++++++++++ 3 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 uitest/src/com/vaadin/tests/components/orderedlayout/OrderedLayoutInfiniteLayoutPasses.java create mode 100644 uitest/src/com/vaadin/tests/components/orderedlayout/OrderedLayoutInfiniteLayoutPassesTest.java diff --git a/client/src/com/vaadin/client/WidgetUtil.java b/client/src/com/vaadin/client/WidgetUtil.java index fca6fbccbc..7d4f613e4e 100644 --- a/client/src/com/vaadin/client/WidgetUtil.java +++ b/client/src/com/vaadin/client/WidgetUtil.java @@ -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 index 0000000000..9c54dbab8d --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/orderedlayout/OrderedLayoutInfiniteLayoutPasses.java @@ -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 index 0000000000..1a2a9cbedf --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/orderedlayout/OrderedLayoutInfiniteLayoutPassesTest.java @@ -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 getBrowsersToTest() { + List 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")); + } +} -- 2.39.5