diff --git a/src/declarative/qml/qdeclarativeincubator_p.h b/src/declarative/qml/qdeclarativeincubator_p.h index ebabbae1d2300a8650155ec8d2bdcc72b5134a32..8f76239c1038506ec6e909caa93823d4e8d34d24 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 74a6b83bf4beca783a40871a677e205711c4150d..fe618b87e8359e5f3d6ec3f02c4b14e3095d846d 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