From 655ee07843ce8e4ff58f07e892566fc0a4b83930 Mon Sep 17 00:00:00 2001 From: Anna Koskinen Date: Tue, 27 Oct 2020 20:02:37 +0200 Subject: [PATCH] Fix to LayoutManager size calculations during transform. ComputedStyle is slower but more reliable than using getBoundingClientRect, which does not work as expected if a transform has been applied to the element or one of its parents. This is a problem e.g. with PopupView, where getBoundingClientRect will return 0 for all the popup content sizes while the opening animation is active. ComputedStyle ignores the transform and returns the expected value. Fixes: #11187 --- .../main/java/com/vaadin/client/MeasuredSize.java | 12 ++++++++++++ .../tests/resources/FrontendInitialResourceUI.java | 4 ++-- .../resources/FrontendLaterLoadedResourceUI.java | 3 ++- .../resources/FrontendInitialResourceUITest.java | 2 +- .../resources/FrontendLaterLoadedResourceUITest.java | 2 +- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/client/src/main/java/com/vaadin/client/MeasuredSize.java b/client/src/main/java/com/vaadin/client/MeasuredSize.java index 89732dea6dc..c71c3e25d03 100644 --- a/client/src/main/java/com/vaadin/client/MeasuredSize.java +++ b/client/src/main/java/com/vaadin/client/MeasuredSize.java @@ -240,6 +240,12 @@ public MeasureResult measure(Element element) { Profiler.enter("Measure height"); double requiredHeight = WidgetUtil.getRequiredHeightDouble(element); + if (requiredHeight == 0 && element.getOffsetHeight() > 0) { + requiredHeight = computedStyle.getHeightIncludingBorderPadding(); + if (Double.isNaN(requiredHeight)) { + requiredHeight = 0; + } + } double outerHeight = requiredHeight + sumHeights(margins); double oldHeight = height; if (setOuterHeight(outerHeight)) { @@ -250,6 +256,12 @@ public MeasureResult measure(Element element) { Profiler.enter("Measure width"); double requiredWidth = WidgetUtil.getRequiredWidthDouble(element); + if (requiredWidth == 0 && element.getOffsetWidth() > 0) { + requiredWidth = computedStyle.getWidthIncludingBorderPadding(); + if (Double.isNaN(requiredWidth)) { + requiredWidth = 0; + } + } double outerWidth = requiredWidth + sumWidths(margins); double oldWidth = width; if (setOuterWidth(outerWidth)) { diff --git a/uitest/src/main/java/com/vaadin/tests/resources/FrontendInitialResourceUI.java b/uitest/src/main/java/com/vaadin/tests/resources/FrontendInitialResourceUI.java index 550372f5d4b..d239c6b706e 100644 --- a/uitest/src/main/java/com/vaadin/tests/resources/FrontendInitialResourceUI.java +++ b/uitest/src/main/java/com/vaadin/tests/resources/FrontendInitialResourceUI.java @@ -27,8 +27,8 @@ public class FrontendInitialResourceUI extends AbstractTestUIWithLog { @Override protected void setup(VaadinRequest request) { - getPage().getJavaScript() - .execute("document.body.innerHTML=window.jsFile;\n"); + getLayout().setId("layout"); + getPage().getJavaScript().execute("layout.innerHTML=window.jsFile;\n"); } diff --git a/uitest/src/main/java/com/vaadin/tests/resources/FrontendLaterLoadedResourceUI.java b/uitest/src/main/java/com/vaadin/tests/resources/FrontendLaterLoadedResourceUI.java index fdc84461f10..ca0e0338ecc 100644 --- a/uitest/src/main/java/com/vaadin/tests/resources/FrontendLaterLoadedResourceUI.java +++ b/uitest/src/main/java/com/vaadin/tests/resources/FrontendLaterLoadedResourceUI.java @@ -16,9 +16,10 @@ public static class MyButton extends Button { @Override protected void setup(VaadinRequest request) { + getLayout().setId("layout"); Button b = new MyButton(); b.addClickListener(event -> getPage().getJavaScript() - .execute("document.body.innerHTML=window.jsFile;\n")); + .execute("layout.innerHTML=window.jsFile;\n")); addComponent(b); } diff --git a/uitest/src/test/java/com/vaadin/tests/resources/FrontendInitialResourceUITest.java b/uitest/src/test/java/com/vaadin/tests/resources/FrontendInitialResourceUITest.java index 45b386a73ed..d0ea5482cf4 100644 --- a/uitest/src/test/java/com/vaadin/tests/resources/FrontendInitialResourceUITest.java +++ b/uitest/src/test/java/com/vaadin/tests/resources/FrontendInitialResourceUITest.java @@ -25,7 +25,7 @@ public void correctEs5Es6FileImportedThroughFrontend() { } assertEquals("/VAADIN/frontend/" + es + "/logFilename.js", - findElement(By.tagName("body")).getText()); + findElement(By.id("layout")).getText()); } } diff --git a/uitest/src/test/java/com/vaadin/tests/resources/FrontendLaterLoadedResourceUITest.java b/uitest/src/test/java/com/vaadin/tests/resources/FrontendLaterLoadedResourceUITest.java index bc3d5aa7e06..9c36ddc3546 100644 --- a/uitest/src/test/java/com/vaadin/tests/resources/FrontendLaterLoadedResourceUITest.java +++ b/uitest/src/test/java/com/vaadin/tests/resources/FrontendLaterLoadedResourceUITest.java @@ -26,7 +26,7 @@ public void correctEs5Es6FileImportedThroughFrontend() { } assertEquals("/VAADIN/frontend/" + es + "/logFilename.js", - findElement(By.tagName("body")).getText()); + findElement(By.id("layout")).getText()); } }