diff options
-rw-r--r-- | src/declarative/qml/qdeclarativeincubator_p.h | 2 | ||||
-rw-r--r-- | tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp | 37 |
2 files changed, 38 insertions, 1 deletions
diff --git a/src/declarative/qml/qdeclarativeincubator_p.h b/src/declarative/qml/qdeclarativeincubator_p.h index ebabbae1d2..8f76239c10 100644 --- a/src/declarative/qml/qdeclarativeincubator_p.h +++ b/src/declarative/qml/qdeclarativeincubator_p.h @@ -83,7 +83,7 @@ public: enum Progress { Execute, Completing, Completed }; Progress progress; - QObject *result; + QDeclarativeGuard<QObject> result; QDeclarativeGuardedContextData rootContext; QDeclarativeCompiledData *component; QDeclarativeVME vme; diff --git a/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp b/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp index 74a6b83bf4..fe618b87e8 100644 --- a/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp +++ b/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp @@ -79,6 +79,7 @@ private slots: void forceCompletion(); void setInitialState(); void clearDuringCompletion(); + void objectDeletionAfterInit(); void recursiveClear(); void statusChanged(); void asynchronousIfNested(); @@ -434,6 +435,42 @@ void tst_qdeclarativeincubator::clearDuringCompletion() QVERIFY(srt.isNull()); } +void tst_qdeclarativeincubator::objectDeletionAfterInit() +{ + QDeclarativeComponent component(&engine, TEST_FILE("clear.qml")); + QVERIFY(component.isReady()); + + struct MyIncubator : public QDeclarativeIncubator + { + MyIncubator(QDeclarativeIncubator::IncubationMode mode) + : QDeclarativeIncubator(mode), obj(0) {} + + virtual void setInitialState(QObject *o) { + obj = o; + } + + QObject *obj; + }; + + SelfRegisteringType::clearMe(); + MyIncubator incubator(QDeclarativeIncubator::Asynchronous); + component.create(incubator); + + while (!incubator.obj && incubator.isLoading()) { + bool b = false; + controller.incubateWhile(&b); + } + + QVERIFY(incubator.isLoading()); + QVERIFY(SelfRegisteringType::me() != 0); + + delete incubator.obj; + + incubator.clear(); + QCoreApplication::processEvents(QEventLoop::DeferredDeletion); + QVERIFY(incubator.isNull()); +} + class Switcher : public QObject { Q_OBJECT |