Fix crash on exit when overriding signal handlers in states.
authorMichael Brasser <michael.brasser@nokia.com>
Wed, 9 Nov 2011 04:28:41 +0000 (14:28 +1000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 9 Nov 2011 07:23:57 +0000 (08:23 +0100)
Cherry-picked from 93c64e1be3a2d68eb504d7c4f7c60f66ce1ff650 in 4.7.

Task-number: QTBUG-21617
Change-Id: I99ce8292d53954f5229867a384f47bedf7fad315
Reviewed-by: Martin Jones <martin.jones@nokia.com>
src/declarative/util/qdeclarativepropertychanges.cpp
src/qtquick1/util/qdeclarativepropertychanges.cpp
tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash3.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp
tests/auto/qtquick1/qdeclarativestates/data/signalOverrideCrash3.qml [new file with mode: 0644]
tests/auto/qtquick1/qdeclarativestates/tst_qdeclarativestates.cpp

index 0ad6019..72add56 100644 (file)
@@ -170,7 +170,8 @@ public:
         reverseExpression = rewindExpression;
     }
 
-    /*virtual void copyOriginals(QDeclarativeActionEvent *other)
+    virtual bool needsCopy() { return true; }
+    virtual void copyOriginals(QDeclarativeActionEvent *other)
     {
         QDeclarativeReplaceSignalHandler *rsh = static_cast<QDeclarativeReplaceSignalHandler*>(other);
         saveCurrentValues();
@@ -181,7 +182,7 @@ public:
             ownedExpression = rsh->ownedExpression;
             rsh->ownedExpression = 0;
         }
-    }*/
+    }
 
     virtual void rewind() {
         ownedExpression = QDeclarativePropertyPrivate::setSignalExpression(property, rewindExpression);
index 692d7bb..3ea22e8 100644 (file)
@@ -174,7 +174,8 @@ public:
         reverseExpression = rewindExpression;
     }
 
-    /*virtual void copyOriginals(QDeclarative1ActionEvent *other)
+    virtual bool needsCopy() { return true; }
+    virtual void copyOriginals(QDeclarative1ActionEvent *other)
     {
         QDeclarative1ReplaceSignalHandler *rsh = static_cast<QDeclarative1ReplaceSignalHandler*>(other);
         saveCurrentValues();
@@ -185,7 +186,7 @@ public:
             ownedExpression = rsh->ownedExpression;
             rsh->ownedExpression = 0;
         }
-    }*/
+    }
 
     virtual void rewind() {
         ownedExpression = QDeclarativePropertyPrivate::setSignalExpression(property, rewindExpression);
diff --git a/tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash3.qml b/tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash3.qml
new file mode 100644 (file)
index 0000000..98d4c57
--- /dev/null
@@ -0,0 +1,27 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: myRect
+    width: 400
+    height: 400
+
+    onHeightChanged:  console.log("base state")
+
+    states: [
+        State {
+            name: "state1"
+            PropertyChanges {
+                target: myRect
+                onHeightChanged: console.log("state1")
+                color: "green"
+            }
+        },
+        State {
+            name: "state2";
+            PropertyChanges {
+                target: myRect
+                onHeightChanged: console.log("state2")
+                color: "red"
+        }
+    }]
+}
index f6ab652..05975aa 100644 (file)
@@ -111,6 +111,7 @@ private slots:
     void signalOverride();
     void signalOverrideCrash();
     void signalOverrideCrash2();
+    void signalOverrideCrash3();
     void parentChange();
     void parentChangeErrors();
     void anchorChanges();
@@ -519,6 +520,22 @@ void tst_qdeclarativestates::signalOverrideCrash2()
     delete rect;
 }
 
+void tst_qdeclarativestates::signalOverrideCrash3()
+{
+    QDeclarativeEngine engine;
+
+    QDeclarativeComponent rectComponent(&engine, TESTDATA("signalOverrideCrash3.qml"));
+    QQuickRectangle *rect = qobject_cast<QQuickRectangle*>(rectComponent.create());
+    QVERIFY(rect != 0);
+
+    QQuickItemPrivate::get(rect)->setState("state1");
+    QQuickItemPrivate::get(rect)->setState("");
+    QQuickItemPrivate::get(rect)->setState("state2");
+    QQuickItemPrivate::get(rect)->setState("");
+
+    delete rect;
+}
+
 void tst_qdeclarativestates::parentChange()
 {
     QDeclarativeEngine engine;
diff --git a/tests/auto/qtquick1/qdeclarativestates/data/signalOverrideCrash3.qml b/tests/auto/qtquick1/qdeclarativestates/data/signalOverrideCrash3.qml
new file mode 100644 (file)
index 0000000..ed1f22f
--- /dev/null
@@ -0,0 +1,27 @@
+import QtQuick 1.0
+
+Rectangle {
+    id: myRect
+    width: 400
+    height: 400
+
+    onHeightChanged:  console.log("base state")
+
+    states: [
+        State {
+            name: "state1"
+            PropertyChanges {
+                target: myRect
+                onHeightChanged: console.log("state1")
+                color: "green"
+            }
+        },
+        State {
+            name: "state2";
+            PropertyChanges {
+                target: myRect
+                onHeightChanged: console.log("state2")
+                color: "red"
+        }
+    }]
+}
index 809d9ca..ba4177e 100644 (file)
@@ -108,6 +108,7 @@ private slots:
     void signalOverride();
     void signalOverrideCrash();
     void signalOverrideCrash2();
+    void signalOverrideCrash3();
     void parentChange();
     void parentChangeErrors();
     void anchorChanges();
@@ -515,6 +516,22 @@ void tst_qdeclarativestates::signalOverrideCrash2()
     delete rect;
 }
 
+void tst_qdeclarativestates::signalOverrideCrash3()
+{
+    QDeclarativeEngine engine;
+
+    QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/signalOverrideCrash3.qml");
+    QDeclarative1Rectangle *rect = qobject_cast<QDeclarative1Rectangle*>(rectComponent.create());
+    QVERIFY(rect != 0);
+
+    QDeclarativeItemPrivate::get(rect)->setState("state1");
+    QDeclarativeItemPrivate::get(rect)->setState("");
+    QDeclarativeItemPrivate::get(rect)->setState("state2");
+    QDeclarativeItemPrivate::get(rect)->setState("");
+
+    delete rect;
+}
+
 void tst_qdeclarativestates::parentChange()
 {
     QDeclarativeEngine engine;