aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/qml/qdeclarativeincubator_p.h2
-rw-r--r--tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp37
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