From 462edd23f953af6ce37d1c42400e2cb4443f5a24 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Thu, 26 Apr 2012 16:12:21 +1000 Subject: More robust tracking of signal handler expression ownership. Reference count the expressions, and improve testing. Change-Id: I810509eae1c7608b367e9ff5f7891a294667a692 Reviewed-by: Chris Adams --- .../qquickstates/data/signalOverrideCrash4.qml | 22 +++++++++++++++++++++ tests/auto/quick/qquickstates/tst_qquickstates.cpp | 23 ++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 tests/auto/quick/qquickstates/data/signalOverrideCrash4.qml (limited to 'tests/auto/quick/qquickstates') diff --git a/tests/auto/quick/qquickstates/data/signalOverrideCrash4.qml b/tests/auto/quick/qquickstates/data/signalOverrideCrash4.qml new file mode 100644 index 0000000000..705ad07715 --- /dev/null +++ b/tests/auto/quick/qquickstates/data/signalOverrideCrash4.qml @@ -0,0 +1,22 @@ +import QtQuick 2.0 + +Rectangle { + id: root + width: 400; height: 400 + property int someProp + + states: [ + State { + name: "state1" + PropertyChanges { target: root; onSomePropChanged: h1() } + }, + State { + name: "state2" + PropertyChanges { target: root; onSomePropChanged: h2() } + } + ] + + // non-default handlers + function h1() {} + function h2() {} +} diff --git a/tests/auto/quick/qquickstates/tst_qquickstates.cpp b/tests/auto/quick/qquickstates/tst_qquickstates.cpp index 7fd8fc4498..1aca63a628 100644 --- a/tests/auto/quick/qquickstates/tst_qquickstates.cpp +++ b/tests/auto/quick/qquickstates/tst_qquickstates.cpp @@ -112,6 +112,7 @@ private slots: void signalOverrideCrash(); void signalOverrideCrash2(); void signalOverrideCrash3(); + void signalOverrideCrash4(); void parentChange(); void parentChangeErrors(); void anchorChanges(); @@ -475,6 +476,8 @@ void tst_qquickstates::signalOverride() QQuickItemPrivate::get(rect)->setState("green"); rect->doSomething(); QCOMPARE(rect->color(),QColor("green")); + + delete rect; } { @@ -492,6 +495,8 @@ void tst_qquickstates::signalOverride() QCOMPARE(rect->color(),QColor("blue")); QCOMPARE(innerRect->color(),QColor("green")); QCOMPARE(innerRect->property("extendedColor").value(),QColor("green")); + + delete rect; } } @@ -538,6 +543,24 @@ void tst_qquickstates::signalOverrideCrash3() delete rect; } +void tst_qquickstates::signalOverrideCrash4() +{ + QQmlEngine engine; + QQmlComponent c(&engine, testFileUrl("signalOverrideCrash4.qml")); + QQuickRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + + QQuickItemPrivate *rectPrivate = QQuickItemPrivate::get(rect); + + rectPrivate->setState("state1"); + rectPrivate->setState("state2"); + rectPrivate->setState("state1"); + rectPrivate->setState("state2"); + rectPrivate->setState(""); + + delete rect; +} + void tst_qquickstates::parentChange() { QQmlEngine engine; -- cgit v1.2.3