Browse Source

Render nested invalid layouts correctly (#17598)

Change-Id: Iaaf86a6d0d3dbd33beb0d76f64383548be196f4d
tags/7.5.1
Artur Signell 9 years ago
parent
commit
ac4e85f4e3

+ 36
- 5
server/src/com/vaadin/server/ComponentSizeValidator.java View 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();

+ 87
- 0
uitest/src/com/vaadin/tests/components/orderedlayout/NestedInvalidLayouts.java View File

@@ -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);
}

}

+ 57
- 0
uitest/src/com/vaadin/tests/components/orderedlayout/NestedInvalidLayoutsTest.java View File

@@ -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);
}
}
}

+ 2
- 0
uitest/src/com/vaadin/tests/components/table/SelectAllConstantViewport.java View File

@@ -72,6 +72,8 @@ public class SelectAllConstantViewport extends AbstractTestUIWithLog {
layout.addComponent(table);
layout.setSizeFull();
addComponent(layout);
getContent().setSizeFull();
getLayout().setSizeFull();
}

/*

Loading…
Cancel
Save