From 6028d8ebceccc4edd7c31ba0d16773ae866336c3 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 5 Oct 2011 18:15:03 +1000 Subject: [PATCH] Always delete object if incubator is cancelled Change-Id: Iad04340bac9d1345069e540e6bf9dbf671ce9226 Reviewed-on: http://codereview.qt-project.org/6088 Reviewed-by: Qt Sanity Bot Reviewed-by: Aaron Kennedy --- src/declarative/qml/qdeclarativeincubator.cpp | 2 + .../data/clearDuringCompletion.qml | 6 ++++ .../qdeclarativeincubator/testtypes.cpp | 25 ++++++++++++++++ .../declarative/qdeclarativeincubator/testtypes.h | 17 +++++++++++ .../tst_qdeclarativeincubator.cpp | 31 ++++++++++++++++++++ 5 files changed, 81 insertions(+), 0 deletions(-) create mode 100644 tests/auto/declarative/qdeclarativeincubator/data/clearDuringCompletion.qml diff --git a/src/declarative/qml/qdeclarativeincubator.cpp b/src/declarative/qml/qdeclarativeincubator.cpp index ed75c9a..4779caf 100644 --- a/src/declarative/qml/qdeclarativeincubator.cpp +++ b/src/declarative/qml/qdeclarativeincubator.cpp @@ -486,6 +486,8 @@ void QDeclarativeIncubator::clear() if (s == Loading) { Q_ASSERT(d->component); enginePriv = QDeclarativeEnginePrivate::get(d->component->engine); + delete d->result; + d->result = 0; } d->clear(); diff --git a/tests/auto/declarative/qdeclarativeincubator/data/clearDuringCompletion.qml b/tests/auto/declarative/qdeclarativeincubator/data/clearDuringCompletion.qml new file mode 100644 index 0000000..556f460 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeincubator/data/clearDuringCompletion.qml @@ -0,0 +1,6 @@ +import Qt.test 1.0 + +SelfRegistering { + property variant a: CompletionRegistering {} + property variant b: CompletionRegistering {} +} diff --git a/tests/auto/declarative/qdeclarativeincubator/testtypes.cpp b/tests/auto/declarative/qdeclarativeincubator/testtypes.cpp index c1f07ac..3ff15a7 100644 --- a/tests/auto/declarative/qdeclarativeincubator/testtypes.cpp +++ b/tests/auto/declarative/qdeclarativeincubator/testtypes.cpp @@ -58,7 +58,32 @@ void SelfRegisteringType::clearMe() m_me = 0; } +CompletionRegisteringType *CompletionRegisteringType::m_me = 0; +CompletionRegisteringType::CompletionRegisteringType() +{ +} + +void CompletionRegisteringType::classBegin() +{ +} + +void CompletionRegisteringType::componentComplete() +{ + m_me = this; +} + +CompletionRegisteringType *CompletionRegisteringType::me() +{ + return m_me; +} + +void CompletionRegisteringType::clearMe() +{ + m_me = 0; +} + void registerTypes() { qmlRegisterType("Qt.test", 1,0, "SelfRegistering"); + qmlRegisterType("Qt.test", 1,0, "CompletionRegistering"); } diff --git a/tests/auto/declarative/qdeclarativeincubator/testtypes.h b/tests/auto/declarative/qdeclarativeincubator/testtypes.h index a023410..85ee4a6 100644 --- a/tests/auto/declarative/qdeclarativeincubator/testtypes.h +++ b/tests/auto/declarative/qdeclarativeincubator/testtypes.h @@ -42,6 +42,7 @@ #define TESTTYPES_H #include +#include class SelfRegisteringType : public QObject { @@ -62,6 +63,22 @@ private: int m_v; }; +class CompletionRegisteringType : public QObject, public QDeclarativeParserStatus +{ +Q_OBJECT +public: + CompletionRegisteringType(); + + virtual void classBegin(); + virtual void componentComplete(); + + static CompletionRegisteringType *me(); + static void clearMe(); + +private: + static CompletionRegisteringType *m_me; +}; + void registerTypes(); #endif // TESTTYPES_H diff --git a/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp b/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp index e7fc777..f870ffb 100644 --- a/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp +++ b/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp @@ -77,6 +77,7 @@ private slots: void noIncubationController(); void forceCompletion(); void setInitialState(); + void clearDuringCompletion(); private: QDeclarativeIncubationController controller; @@ -395,6 +396,36 @@ void tst_qdeclarativeincubator::setInitialState() } } +void tst_qdeclarativeincubator::clearDuringCompletion() +{ + CompletionRegisteringType::clearMe(); + SelfRegisteringType::clearMe(); + + QDeclarativeComponent component(&engine, TEST_FILE("clearDuringCompletion.qml")); + QVERIFY(component.isReady()); + + QDeclarativeIncubator incubator; + component.create(incubator); + + QCOMPARE(incubator.status(), QDeclarativeIncubator::Loading); + QVERIFY(CompletionRegisteringType::me() == 0); + + while (CompletionRegisteringType::me() == 0 && incubator.isLoading()) { + bool b = false; + controller.incubateWhile(&b); + } + + QVERIFY(CompletionRegisteringType::me() != 0); + QVERIFY(SelfRegisteringType::me() != 0); + QVERIFY(incubator.isLoading()); + + QPointer srt = SelfRegisteringType::me(); + + incubator.clear(); + QVERIFY(incubator.isNull()); + QVERIFY(srt.isNull()); +} + QTEST_MAIN(tst_qdeclarativeincubator) #include "tst_qdeclarativeincubator.moc" -- 1.7.2.5