summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorJohannes Dahlström <johannesd@vaadin.com>2014-04-24 17:17:42 +0300
committerVaadin Code Review <review@vaadin.com>2014-04-29 12:00:09 +0000
commita3311d8135bcf153a7df709f93575b3654c0bff4 (patch)
treebc4e53c5c4587ae0808ae3873980996e3f1b08bc /client
parent98be6b1978f3ff03a9486f34c22d11cc134bf1c9 (diff)
downloadvaadin-framework-a3311d8135bcf153a7df709f93575b3654c0bff4.tar.gz
vaadin-framework-a3311d8135bcf153a7df709f93575b3654c0bff4.zip
Prevent scroll position reset on GridLayout hierarchy change (#13386)
State change handling by default clears measured size if the size is set to undefined; this would cause GridLayout to shrink to zero size because its child cells have position: absolute. The layout phase recomputes the size, but in some cases the browser reflows first, affecting the scroll position of the layout parent. This patch prevents GridLayout from clearing once-computed sizes during state change. Change-Id: Id6e066c3ea360083d16d3fcc5c6d7d4bb6cea8b7
Diffstat (limited to 'client')
-rw-r--r--client/src/com/vaadin/client/ui/AbstractComponentConnector.java29
-rw-r--r--client/src/com/vaadin/client/ui/gridlayout/GridLayoutConnector.java14
2 files changed, 41 insertions, 2 deletions
diff --git a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
index f6c26cda05..47140348f9 100644
--- a/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
+++ b/client/src/com/vaadin/client/ui/AbstractComponentConnector.java
@@ -217,11 +217,24 @@ public abstract class AbstractComponentConnector extends AbstractConnector
}
+ /**
+ * Updates the component size based on the shared state, invoking the
+ * {@link LayoutManager layout manager} if necessary.
+ */
protected void updateComponentSize() {
updateComponentSize(getState().width == null ? "" : getState().width,
getState().height == null ? "" : getState().height);
}
+ /**
+ * Updates the component size, invoking the {@link LayoutManager layout
+ * manager} if necessary.
+ *
+ * @param newWidth
+ * The new width as a CSS string. Cannot be null.
+ * @param newHeight
+ * The new height as a CSS string. Cannot be null.
+ */
protected void updateComponentSize(String newWidth, String newHeight) {
Profiler.enter("AbstractComponentConnector.updateComponentSize");
@@ -255,13 +268,25 @@ public abstract class AbstractComponentConnector extends AbstractConnector
Profiler.leave("AbstractComponentConnector.updateComponentSize update styleNames");
Profiler.enter("AbstractComponentConnector.updateComponentSize update DOM");
- widget.setHeight(newHeight);
- widget.setWidth(newWidth);
+ updateWidgetSize(newWidth, newHeight);
Profiler.leave("AbstractComponentConnector.updateComponentSize update DOM");
Profiler.leave("AbstractComponentConnector.updateComponentSize");
}
+ /**
+ * Updates the DOM size of this connector's {@link #getWidget() widget}.
+ *
+ * @param newWidth
+ * The new width as a CSS string. Cannot be null.
+ * @param newHeight
+ * The new height as a CSS string. Cannot be null.
+ */
+ protected void updateWidgetSize(String newWidth, String newHeight) {
+ getWidget().setWidth(newWidth);
+ getWidget().setHeight(newHeight);
+ }
+
@Override
public boolean isRelativeHeight() {
return ComponentStateUtil.isRelativeHeight(getState());
diff --git a/client/src/com/vaadin/client/ui/gridlayout/GridLayoutConnector.java b/client/src/com/vaadin/client/ui/gridlayout/GridLayoutConnector.java
index cc052fa6d5..c306282349 100644
--- a/client/src/com/vaadin/client/ui/gridlayout/GridLayoutConnector.java
+++ b/client/src/com/vaadin/client/ui/gridlayout/GridLayoutConnector.java
@@ -210,4 +210,18 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector
public void layoutHorizontally() {
getWidget().updateWidth();
}
+
+ @Override
+ protected void updateWidgetSize(String newWidth, String newHeight) {
+ // Prevent the element from momentarily shrinking to zero size
+ // when the size is set to undefined by a state change but before
+ // it is recomputed in the layout phase. This may affect scroll
+ // position in some cases; see #13386.
+ if (!isUndefinedHeight()) {
+ getWidget().setHeight(newHeight);
+ }
+ if (!isUndefinedWidth()) {
+ getWidget().setWidth(newWidth);
+ }
+ }
}