aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/context2d/qquickcanvasitem.cpp4
-rw-r--r--tests/auto/quick/qquickcanvasitem/data/tst_canvas.qml38
2 files changed, 40 insertions, 2 deletions
diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp
index 4b28517701..b39c4e49f8 100644
--- a/src/quick/items/context2d/qquickcanvasitem.cpp
+++ b/src/quick/items/context2d/qquickcanvasitem.cpp
@@ -592,7 +592,9 @@ void QQuickCanvasItem::geometryChanged(const QRectF &newGeometry, const QRectF &
QQuickItem::geometryChanged(newGeometry, oldGeometry);
- QSizeF newSize = newGeometry.size();
+ // Due to indirect recursion, newGeometry may be outdated
+ // after this call, so we use width and height instead.
+ QSizeF newSize = QSizeF(width(), height());
if (!d->hasCanvasSize && d->canvasSize != newSize) {
d->canvasSize = newSize;
emit canvasSizeChanged();
diff --git a/tests/auto/quick/qquickcanvasitem/data/tst_canvas.qml b/tests/auto/quick/qquickcanvasitem/data/tst_canvas.qml
index 79c89bb2fc..5960e53557 100644
--- a/tests/auto/quick/qquickcanvasitem/data/tst_canvas.qml
+++ b/tests/auto/quick/qquickcanvasitem/data/tst_canvas.qml
@@ -1,5 +1,10 @@
import QtQuick 2.0
+Item {
+ id: container
+ width: 200
+ height: 200
+
CanvasTestCase {
id:testCase
name: "canvas"
@@ -641,5 +646,36 @@ CanvasTestCase {
fail(exception.message);
}
}
-}
+ property Component implicitlySizedComponent: Item {
+ implicitWidth: 32
+ implicitHeight: implicitWidth
+ anchors.centerIn: parent
+
+ property alias canvas: canvas
+
+ Canvas {
+ id: canvas
+ width: Math.max(1, Math.min(parent.width, parent.height))
+ height: width
+
+ onPaint: {
+ var ctx = getContext("2d");
+ ctx.reset();
+ ctx.beginPath();
+ ctx.fillRect(0, 0, width, height);
+ }
+ }
+ }
+
+ function test_implicitlySizedParent() {
+ var implicitlySizedItem = implicitlySizedComponent.createObject(container);
+ verify(implicitlySizedItem);
+
+ var xCenter = implicitlySizedItem.width / 2;
+ var yCenter = implicitlySizedItem.height / 2;
+ waitForRendering(implicitlySizedItem);
+ comparePixel(implicitlySizedItem.canvas.context, xCenter, yCenter, 0, 0, 0, 255);
+ }
+}
+}