]> source.dussan.org Git - vaadin-framework.git/commitdiff
Render nested invalid layouts correctly (#17598)
authorArtur Signell <artur@vaadin.com>
Wed, 20 May 2015 17:59:55 +0000 (20:59 +0300)
committerVaadin Code Review <review@vaadin.com>
Thu, 11 Jun 2015 14:59:38 +0000 (14:59 +0000)
Change-Id: I959d62091f79c171a8c9f2c9b4ed2c7a67c65c39

server/src/com/vaadin/server/ComponentSizeValidator.java
uitest/src/com/vaadin/tests/components/orderedlayout/NestedInvalidLayouts.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/orderedlayout/NestedInvalidLayoutsTest.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewport.java

index 2d88ae3b530b8d8b59da80dd8190862bc7a4ae0a..1fbd84093266d5287ea964b2a46a8f440739c4f3 100644 (file)
@@ -415,7 +415,7 @@ public class ComponentSizeValidator implements Serializable {
             // main window, valid situation
             return true;
         }
-        if (parent.getHeight() < 0) {
+        if (isEffectiveUndefinedHeight(component)) {
             // Undefined height
             if (parent instanceof Window) {
                 // Sub window with undefined size has a min-height
@@ -513,10 +513,7 @@ public class ComponentSizeValidator implements Serializable {
             // Sub window with undefined size has a min-width
             return true;
         }
-
-        if (parent.getWidth() < 0) {
-            // Undefined width
-
+        if (isEffectiveUndefinedWidth(parent)) {
             if (parent instanceof AbstractOrderedLayout) {
                 AbstractOrderedLayout ol = (AbstractOrderedLayout) parent;
                 boolean horizontal = true;
@@ -591,6 +588,40 @@ public class ComponentSizeValidator implements Serializable {
 
     }
 
+    /**
+     * Checks if this component will be rendered with undefined width, either
+     * because it has been set to undefined wide or because the parent forces it
+     * to be (100% inside undefined)
+     * 
+     */
+    private static boolean isEffectiveUndefinedWidth(Component parent) {
+        if (parent == null) {
+            return false;
+        } else if (parent.getWidth() < 0) {
+            return true;
+        } else if (parent.getWidthUnits() == Unit.PERCENTAGE) {
+            return isEffectiveUndefinedWidth(parent.getParent());
+        }
+        return false;
+    }
+
+    /**
+     * Checks if this component will be rendered with undefined Height, either
+     * because it has been set to undefined wide or because the parent forces it
+     * to be (100% inside undefined)
+     * 
+     */
+    private static boolean isEffectiveUndefinedHeight(Component parent) {
+        if (parent == null) {
+            return false;
+        } else if (parent.getHeight() < 0) {
+            return true;
+        } else if (parent.getHeightUnits() == Unit.PERCENTAGE) {
+            return isEffectiveUndefinedHeight(parent.getParent());
+        }
+        return false;
+    }
+
     private static boolean hasNonRelativeWidthComponent(Form form) {
         Layout layout = form.getLayout();
         Layout footer = form.getFooter();
diff --git a/uitest/src/com/vaadin/tests/components/orderedlayout/NestedInvalidLayouts.java b/uitest/src/com/vaadin/tests/components/orderedlayout/NestedInvalidLayouts.java
new file mode 100644 (file)
index 0000000..9bc8a41
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * 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 com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.NativeButton;
+import com.vaadin.ui.VerticalLayout;
+
+/**
+ * 
+ * @since
+ * @author Vaadin Ltd
+ */
+public class NestedInvalidLayouts extends AbstractTestUI {
+    @Override
+    protected void setup(VaadinRequest request) {
+        fullWidthTest(getLayout(), null);
+        fullWidthTest(getLayout(), "100%");
+        fullHeightTest(getLayout(), null);
+        fullHeightTest(getLayout(), "100%");
+    }
+
+    private void fullWidthTest(VerticalLayout layout, String rootWidth) {
+        // Contains
+        // HL (-1)
+        // * VL (100%)
+        // ** Button (-1) (wide)
+        // ** Button (100%)
+
+        // This should be rendered just as if VL width was -1 (which it will
+        // become when sending width to client), i.e. both buttons should be
+        // equally wide
+
+        final VerticalLayout l = new VerticalLayout();
+        l.setWidth(rootWidth);
+        final Button c = new Button("blaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+        c.setWidth(null);
+        l.addComponent(c);
+        final Button b = new Button("c");
+        b.setWidth("100%");
+        l.addComponent(b);
+        layout.addComponent(new HorizontalLayout(l));
+    }
+
+    private void fullHeightTest(VerticalLayout layout, String rootHeight) {
+        // Contains (height)
+        // VL (-1)
+        // * HL (100%)
+        // ** Button (200px) (high)
+        // ** Button (100%)
+
+        // This should be rendered just as if HL height was -1 (which it will
+        // become when sending height to client), i.e. both buttons should be
+        // equally high
+
+        final HorizontalLayout l = new HorizontalLayout();
+        l.setHeight(rootHeight);
+
+        final NativeButton c = new NativeButton("hiiiigh");
+        c.setWidth(null);
+        c.setHeight("200px");
+        l.addComponent(c);
+        final NativeButton b = new NativeButton("c");
+        b.setHeight("100%");
+        l.addComponent(b);
+        VerticalLayout vl = new VerticalLayout(l);
+        vl.setHeight("100%");
+        layout.addComponent(vl);
+    }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/orderedlayout/NestedInvalidLayoutsTest.java b/uitest/src/com/vaadin/tests/components/orderedlayout/NestedInvalidLayoutsTest.java
new file mode 100644 (file)
index 0000000..cbae7ac
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * 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.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.NativeButtonElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class NestedInvalidLayoutsTest extends SingleBrowserTest {
+
+    @Test
+    public void ensureCorrectSizes() {
+        openTestURL();
+
+        // All Button components should have equal width
+        List<Integer> widths = new ArrayList<Integer>();
+        List<ButtonElement> all = $(ButtonElement.class).state(
+                "primaryStyleName", "v-button").all();
+        for (ButtonElement button : all) {
+            widths.add(button.getSize().getWidth());
+        }
+        assertAllEqual(widths);
+
+        // All NativeButton components should have equal height
+        List<Integer> heights = new ArrayList<Integer>();
+        for (NativeButtonElement button : $(NativeButtonElement.class).all()) {
+            heights.add(button.getSize().getHeight());
+        }
+        assertAllEqual(heights);
+    }
+
+    private void assertAllEqual(List<Integer> values) {
+        Integer first = values.get(0);
+        for (Integer w : values) {
+            Assert.assertEquals(first, w);
+        }
+    }
+}
index 5a406eac489ac1b4b7196cc4b29503acd4d97afe..3bd17c163c3264895091c132368977b52121352c 100644 (file)
@@ -72,6 +72,8 @@ public class SelectAllConstantViewport extends AbstractTestUIWithLog {
         layout.addComponent(table);
         layout.setSizeFull();
         addComponent(layout);
+        getContent().setSizeFull();
+        getLayout().setSizeFull();
     }
 
     /*