summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/util/qdeclarativestateoperations.cpp12
-rw-r--r--tests/auto/declarative/qdeclarativestates/data/anchorChangesCrash.qml14
-rw-r--r--tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp15
3 files changed, 41 insertions, 0 deletions
diff --git a/src/declarative/util/qdeclarativestateoperations.cpp b/src/declarative/util/qdeclarativestateoperations.cpp
index 2cc1fcc..410a269 100644
--- a/src/declarative/util/qdeclarativestateoperations.cpp
+++ b/src/declarative/util/qdeclarativestateoperations.cpp
@@ -1090,6 +1090,9 @@ bool QDeclarativeAnchorChanges::changesBindings()
void QDeclarativeAnchorChanges::saveOriginals()
{
Q_D(QDeclarativeAnchorChanges);
+ if (!d->target)
+ return;
+
d->origLeft = d->target->anchors()->left();
d->origRight = d->target->anchors()->right();
d->origHCenter = d->target->anchors()->horizontalCenter();
@@ -1146,6 +1149,9 @@ void QDeclarativeAnchorChanges::copyOriginals(QDeclarativeActionEvent *other)
void QDeclarativeAnchorChanges::clearBindings()
{
Q_D(QDeclarativeAnchorChanges);
+ if (!d->target)
+ return;
+
d->fromX = d->target->x();
d->fromY = d->target->y();
d->fromWidth = d->target->width();
@@ -1242,6 +1248,9 @@ void QDeclarativeAnchorChanges::rewind()
void QDeclarativeAnchorChanges::saveCurrentValues()
{
Q_D(QDeclarativeAnchorChanges);
+ if (!d->target)
+ return;
+
d->rewindLeft = d->target->anchors()->left();
d->rewindRight = d->target->anchors()->right();
d->rewindHCenter = d->target->anchors()->horizontalCenter();
@@ -1259,6 +1268,9 @@ void QDeclarativeAnchorChanges::saveCurrentValues()
void QDeclarativeAnchorChanges::saveTargetValues()
{
Q_D(QDeclarativeAnchorChanges);
+ if (!d->target)
+ return;
+
d->toX = d->target->x();
d->toY = d->target->y();
d->toWidth = d->target->width();
diff --git a/tests/auto/declarative/qdeclarativestates/data/anchorChangesCrash.qml b/tests/auto/declarative/qdeclarativestates/data/anchorChangesCrash.qml
new file mode 100644
index 0000000..861ef8f
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativestates/data/anchorChangesCrash.qml
@@ -0,0 +1,14 @@
+import Qt 4.7
+
+Rectangle {
+ id: container
+ width: 400
+ height: 400
+
+ states: State {
+ name: "reanchored"
+ AnchorChanges {
+ anchors.top: container.top
+ }
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp b/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp
index 2ab21a4..e7c595a 100644
--- a/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp
+++ b/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp
@@ -94,6 +94,7 @@ private slots:
void anchorChanges3();
void anchorChanges4();
void anchorChanges5();
+ void anchorChangesCrash();
void script();
void restoreEntryValues();
void explicitChanges();
@@ -716,6 +717,20 @@ void tst_qdeclarativestates::anchorChanges5()
delete rect;
}
+//QTBUG-9609
+void tst_qdeclarativestates::anchorChangesCrash()
+{
+ QDeclarativeEngine engine;
+
+ QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorChangesCrash.qml");
+ QDeclarativeRectangle *rect = qobject_cast<QDeclarativeRectangle*>(rectComponent.create());
+ QVERIFY(rect != 0);
+
+ rect->setState("reanchored");
+
+ delete rect;
+}
+
void tst_qdeclarativestates::script()
{
QDeclarativeEngine engine;