From 885ee642fb1342467d749f8a4bcafb8fbe6f0893 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Mon, 25 Jul 2011 16:43:55 +1000 Subject: Fix crash when assigning a list property to transitions. This fixes the crash, but doesn't actually assign any Transitions (the transitions list will now be empty, rather than contain a null Transition object). Correct assignment is a general language issue, and will be fixed separately. Change-Id: I6aaba4eaf6faa513e54d99b27fe9f9a705eea40b Task-number: QTBUG-20227 Reviewed-by: Alan Alpert --- src/declarative/util/qdeclarativestategroup.cpp | 35 +++++++++++++++++++++- .../data/transitionAssignmentBug.qml | 12 ++++++++ .../tst_qdeclarativeanimations.cpp | 13 ++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/transitionAssignmentBug.qml diff --git a/src/declarative/util/qdeclarativestategroup.cpp b/src/declarative/util/qdeclarativestategroup.cpp index a3f57d4..c098a38 100644 --- a/src/declarative/util/qdeclarativestategroup.cpp +++ b/src/declarative/util/qdeclarativestategroup.cpp @@ -73,6 +73,11 @@ public: static QDeclarativeState *at_state(QDeclarativeListProperty *list, int index); static void clear_states(QDeclarativeListProperty *list); + static void append_transition(QDeclarativeListProperty *list, QDeclarativeTransition *state); + static int count_transitions(QDeclarativeListProperty *list); + static QDeclarativeTransition *at_transition(QDeclarativeListProperty *list, int index); + static void clear_transitions(QDeclarativeListProperty *list); + QList states; QList transitions; @@ -218,7 +223,35 @@ void QDeclarativeStateGroupPrivate::clear_states(QDeclarativeListProperty QDeclarativeStateGroup::transitionsProperty() { Q_D(QDeclarativeStateGroup); - return QDeclarativeListProperty(this, d->transitions); + return QDeclarativeListProperty(this, &d->transitions, &QDeclarativeStateGroupPrivate::append_transition, + &QDeclarativeStateGroupPrivate::count_transitions, + &QDeclarativeStateGroupPrivate::at_transition, + &QDeclarativeStateGroupPrivate::clear_transitions); +} + +void QDeclarativeStateGroupPrivate::append_transition(QDeclarativeListProperty *list, QDeclarativeTransition *trans) +{ + QDeclarativeStateGroup *_this = static_cast(list->object); + if (trans) + _this->d_func()->transitions.append(trans); +} + +int QDeclarativeStateGroupPrivate::count_transitions(QDeclarativeListProperty *list) +{ + QDeclarativeStateGroup *_this = static_cast(list->object); + return _this->d_func()->transitions.count(); +} + +QDeclarativeTransition *QDeclarativeStateGroupPrivate::at_transition(QDeclarativeListProperty *list, int index) +{ + QDeclarativeStateGroup *_this = static_cast(list->object); + return _this->d_func()->transitions.at(index); +} + +void QDeclarativeStateGroupPrivate::clear_transitions(QDeclarativeListProperty *list) +{ + QDeclarativeStateGroup *_this = static_cast(list->object); + _this->d_func()->transitions.clear(); } /*! diff --git a/tests/auto/declarative/qdeclarativeanimations/data/transitionAssignmentBug.qml b/tests/auto/declarative/qdeclarativeanimations/data/transitionAssignmentBug.qml new file mode 100644 index 0000000..99b9ac5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/transitionAssignmentBug.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + + property bool nullObject + Component.onCompleted: nullObject = transitions.length > 0 && transitions[0] === null + + property list myTransitions: [Transition {}, Transition {}] + transitions: myTransitions +} diff --git a/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp b/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp index 00db2d4..5d90597 100644 --- a/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp +++ b/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp @@ -88,6 +88,7 @@ private slots: void registrationBug(); void doubleRegistrationBug(); void alwaysRunToEndRestartBug(); + void transitionAssignmentBug(); }; #define QTIMED_COMPARE(lhs, rhs) do { \ @@ -844,6 +845,18 @@ void tst_qdeclarativeanimations::alwaysRunToEndRestartBug() QCOMPARE(static_cast(&animation)->qtAnimation()->state(), QAbstractAnimation::Stopped); } +//QTBUG-20227 +void tst_qdeclarativeanimations::transitionAssignmentBug() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/transitionAssignmentBug.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + + QCOMPARE(rect->property("nullObject").toBool(), false); +} + QTEST_MAIN(tst_qdeclarativeanimations) #include "tst_qdeclarativeanimations.moc" -- cgit v0.12 From 8ef0e62055a2c98637e0b7423feda3ebca7983f4 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Tue, 26 Jul 2011 09:42:46 +1000 Subject: Cleanup QMLViewer properly when exiting via File->Quit. Change-Id: I7a20d46f753f5caa809e3150e44a58f4af55a506 Task-number: QTBUG-14972 Reviewed-by: Charles Yin --- tools/qml/qmlruntime.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/qml/qmlruntime.cpp b/tools/qml/qmlruntime.cpp index 4b0f2d5..f9961bc 100644 --- a/tools/qml/qmlruntime.cpp +++ b/tools/qml/qmlruntime.cpp @@ -1393,6 +1393,7 @@ void QDeclarativeViewer::appAboutToQuit() loggerWindow = 0; delete tester; tester = 0; + close(); } void QDeclarativeViewer::autoStartRecording() -- cgit v0.12