summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcaalador <mikael.grankvist@gmail.com>2017-01-23 13:29:39 +0200
committerAleksi Hietanen <aleksi@vaadin.com>2017-01-23 13:29:39 +0200
commit0c44f88a4ceadfac26d0849b4dfc65c78ae9b348 (patch)
tree016f4a75a818094864e171001e9ab03739d01c1f
parente9a97953f122b2c82b4708029ae5d37c76b981a9 (diff)
downloadvaadin-framework-0c44f88a4ceadfac26d0849b4dfc65c78ae9b348.tar.gz
vaadin-framework-0c44f88a4ceadfac26d0849b4dfc65c78ae9b348.zip
Fix absolute layout component sizing on size change in Vaadin7 (#8304)
Changing from relative to defined size leaves the component positioned wrong, also changing from defined size to relative size leaves the component in the wrong position with the wrong size. Change makes the wrapper rerun setChildWidgetPosition() that adds/removes necessary css definitions to/from the cssPosition String.
-rw-r--r--client/src/main/java/com/vaadin/client/ui/absolutelayout/AbsoluteLayoutConnector.java4
-rw-r--r--uitest/src/main/java/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizeComponents.java87
-rw-r--r--uitest/src/test/java/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizeComponentsTest.java108
3 files changed, 199 insertions, 0 deletions
diff --git a/client/src/main/java/com/vaadin/client/ui/absolutelayout/AbsoluteLayoutConnector.java b/client/src/main/java/com/vaadin/client/ui/absolutelayout/AbsoluteLayoutConnector.java
index 477d59289e..2749ea014f 100644
--- a/client/src/main/java/com/vaadin/client/ui/absolutelayout/AbsoluteLayoutConnector.java
+++ b/client/src/main/java/com/vaadin/client/ui/absolutelayout/AbsoluteLayoutConnector.java
@@ -71,6 +71,10 @@ public class AbsoluteLayoutConnector extends AbstractComponentContainerConnector
getWidget().setWidgetWrapperStyleNames(child.getWidget(),
childStyles.toArray(new String[childStyles.size()]));
}
+
+ if (stateChangeEvent.hasPropertyChanged("height") || stateChangeEvent.hasPropertyChanged("width")) {
+ setChildWidgetPosition(child);
+ }
}
};
diff --git a/uitest/src/main/java/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizeComponents.java b/uitest/src/main/java/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizeComponents.java
new file mode 100644
index 0000000000..6ac140402e
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizeComponents.java
@@ -0,0 +1,87 @@
+package com.vaadin.tests.components.absolutelayout;
+
+import com.vaadin.server.Sizeable;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.AbsoluteLayout;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.CssLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Panel;
+
+/**
+ * Test UI with different cases for component size changes
+ */
+public class AbsoluteLayoutResizeComponents extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ AbsoluteLayout layout = new AbsoluteLayout();
+
+ addStartWithFullWidth(layout);
+ addStartWithDefinedWidth(layout);
+ addStartWithDefinedWidthAbsoluteLayout(layout);
+
+ setContent(layout);
+ }
+
+ /**
+ * Build test layout for #8255
+ */
+ private void addStartWithFullWidth(AbsoluteLayout layout) {
+ final Panel full = new Panel(new CssLayout(new Label("Start Width 100%")));
+ full.setWidth("100%");
+ full.setId("expanding-panel");
+
+ layout.addComponent(full, "right:0;top:10px;");
+ layout.addComponent(expandButton(full), "left: 10x; top: 50px;");
+ }
+
+ /**
+ * Build test layout for #8256
+ */
+ private void addStartWithDefinedWidth(AbsoluteLayout layout) {
+ final Panel small = new Panel(new CssLayout(new Label("Start Width 250px")));
+ small.setWidth("250px");
+ small.setId("small-panel");
+
+ layout.addComponent(small, "right:0;top:100px;");
+ layout.addComponent(expandButton(small), "left: 10x; top: 150px;");
+ }
+
+
+ /**
+ * Build test layout for #8257
+ */
+ private void addStartWithDefinedWidthAbsoluteLayout(AbsoluteLayout layout) {
+ AbsoluteLayout layoutExpading = new AbsoluteLayout();
+ layoutExpading.setWidth("250px");
+ layoutExpading.addComponent(new Panel(new CssLayout(new Label("Start Width 250px"))));
+ layoutExpading.setId("absolute-expanding");
+
+ layout.addComponent(layoutExpading, "right:0;top:200px;");
+ layout.addComponent(expandButton(layoutExpading), "left: 10x; top: 250px;");
+ }
+
+ /**
+ * Create size change button for component
+ *
+ * @param component Component to controll with button
+ * @return Created Expand Button
+ */
+ private Button expandButton(final Component component) {
+ Button button = new Button("Change Size", new Button.ClickListener() {
+ @Override
+ public void buttonClick(Button.ClickEvent clickEvent) {
+ if (component.getWidthUnits().equals(Sizeable.Unit.PERCENTAGE)) {
+ component.setWidth("250px");
+ } else {
+ component.setWidth("100%");
+ }
+ }
+ });
+ button.setId(component.getId() + "-button");
+ return button;
+ }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizeComponentsTest.java b/uitest/src/test/java/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizeComponentsTest.java
new file mode 100644
index 0000000000..be85a684d0
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/components/absolutelayout/AbsoluteLayoutResizeComponentsTest.java
@@ -0,0 +1,108 @@
+package com.vaadin.tests.components.absolutelayout;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+/**
+ * Tests for component positioning after width changes from defined to relative and relative to defined
+ */
+public class AbsoluteLayoutResizeComponentsTest extends MultiBrowserTest {
+
+ @Test
+ public void testFullWithComponentWithRightAlignmentShouldMoveRightWhenSettingAbsoluteWidth() {
+ openTestURL();
+
+ String componentId = "expanding-panel";
+
+ WebElement panelWrapper = getComponentWrapper(componentId);
+
+ Assert.assertNotNull("No wrapper element found for expanding panel [ID: " + componentId + "]", panelWrapper);
+
+ String left = panelWrapper.getCssValue("left");
+ Assert.assertEquals("Component wrapper was missing left:0; from its css positioning", "0px", left);
+
+ WebElement panelComponent = findElement(By.id(componentId));
+ Assert.assertEquals("Panel is not on the left side of the screen", 0, panelComponent.getLocation().getX());
+
+ // Click button to change component size
+ $(ButtonElement.class).id(componentId + "-button").click();
+
+ left = panelWrapper.getCssValue("left");
+ Assert.assertEquals("Component wrapper did not have its left positioning reset to auto", "auto", left);
+ Assert.assertNotEquals("Panel is still on the left side of the screen", 0, panelComponent.getLocation().getX());
+ }
+
+ @Test
+ public void testDefinedWidthComponentShouldExpandToFullWidth() {
+ openTestURL();
+
+ String componentId = "small-panel";
+
+ WebElement panelWrapper = getComponentWrapper(componentId);
+
+ Assert.assertNotNull("No wrapper element found for panel [ID: " + componentId + "]", panelWrapper);
+
+ String left = panelWrapper.getCssValue("left");
+ Assert.assertEquals("Component wrapper has a set Left marker", "auto", left);
+
+ WebElement panelComponent = findElement(By.id(componentId));
+ Assert.assertNotEquals("Panel is positioned to the left side of the screen", 0, panelComponent.getLocation().getX());
+
+ // Click button to change component size
+ $(ButtonElement.class).id(componentId + "-button").click();
+
+
+ left = panelWrapper.getCssValue("left");
+ Assert.assertEquals("Component wrapper was missing left:0; from its css positioning", "0px", left);
+
+ Assert.assertEquals("Panel is not on the left side of the screen", 0, panelComponent.getLocation().getX());
+ }
+
+ @Test
+ public void testDefinedWidthAbsoluteLayoutToFullWidthShouldBeFullWidth() {
+ openTestURL();
+
+ String componentId = "absolute-expanding";
+
+ WebElement panelWrapper = getComponentWrapper(componentId);
+
+ Assert.assertNotNull("No wrapper element found for AbsoluteLayout [ID: " + componentId + "].", panelWrapper);
+
+ String left = panelWrapper.getCssValue("left");
+ Assert.assertEquals("Component wrapper did not have its left positioning reset to auto", "auto", left);
+
+ WebElement panelComponent = findElement(By.id(componentId));
+ Assert.assertNotEquals("Panel is positioned to the left side of the screen", 0, panelComponent.getLocation().getX());
+
+ // Click button to change component size
+ $(ButtonElement.class).id(componentId + "-button").click();
+
+ left = panelWrapper.getCssValue("left");
+ Assert.assertEquals("Component wrapper was missing left:0; from its css positioning", "0px", left);
+
+ Assert.assertEquals("Panel is not on the left side of the screen", 0, panelComponent.getLocation().getX());
+ }
+
+ /**
+ * Search for the AbsoluteLayout wrapper element that contains component for componentId
+ *
+ * @param componentId Id of component contained in Wrapper component
+ * @return WrapperComponent or null
+ */
+ private WebElement getComponentWrapper(String componentId) {
+ WebElement panelWrapper = null;
+
+ for (WebElement wrapper : findElements(By.className("v-absolutelayout-wrapper"))) {
+ // Check if this wrapper contains element with the wanted id.
+ if (!wrapper.findElements(By.id(componentId)).isEmpty()) {
+ panelWrapper = wrapper;
+ break;
+ }
+ }
+ return panelWrapper;
+ }
+}