diff options
author | Johannes Dahlström <johannesd@vaadin.com> | 2014-04-24 17:17:42 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2014-04-29 12:00:09 +0000 |
commit | a3311d8135bcf153a7df709f93575b3654c0bff4 (patch) | |
tree | bc4e53c5c4587ae0808ae3873980996e3f1b08bc /client | |
parent | 98be6b1978f3ff03a9486f34c22d11cc134bf1c9 (diff) | |
download | vaadin-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.java | 29 | ||||
-rw-r--r-- | client/src/com/vaadin/client/ui/gridlayout/GridLayoutConnector.java | 14 |
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); + } + } } |