cctxt = cctxt->parent;
}
- if (parentIncubator && parentIncubator->mode != QDeclarativeIncubator::Synchronous) {
+ if (parentIncubator && parentIncubator->isAsynchronous) {
mode = QDeclarativeIncubator::Asynchronous;
p->waitingOnMe = parentIncubator;
parentIncubator->waitingFor.insert(p);
}
}
+ p->isAsynchronous = (mode != QDeclarativeIncubator::Synchronous);
+
inProgressCreations++;
p->changeStatus(QDeclarativeIncubator::Loading);
QDeclarativeIncubatorPrivate::QDeclarativeIncubatorPrivate(QDeclarativeIncubator *q,
QDeclarativeIncubator::IncubationMode m)
-: q(q), status(QDeclarativeIncubator::Null), mode(m), progress(Execute), result(0), component(0),
- vme(this), waitingOnMe(0)
+: q(q), status(QDeclarativeIncubator::Null), mode(m), isAsynchronous(false), progress(Execute),
+ result(0), component(0), vme(this), waitingOnMe(0)
{
}
QDeclarativeIncubator::Status status;
QDeclarativeIncubator::IncubationMode mode;
+ bool isAsynchronous;
QList<QDeclarativeError> errors;
--- /dev/null
+import Qt.test 1.0
+
+CallbackRegistering {
+ value: 19
+}
m_me = 0;
}
+CallbackRegisteringType::callback CallbackRegisteringType::m_callback = 0;
+void *CallbackRegisteringType::m_data = 0;
+CallbackRegisteringType::CallbackRegisteringType()
+: m_v(0)
+{
+}
+
+void CallbackRegisteringType::clearCallback()
+{
+ m_callback = 0;
+ m_data = 0;
+}
+
+void CallbackRegisteringType::registerCallback(callback c, void *d)
+{
+ m_callback = c;
+ m_data = d;
+}
+
void registerTypes()
{
qmlRegisterType<SelfRegisteringType>("Qt.test", 1,0, "SelfRegistering");
qmlRegisterType<CompletionRegisteringType>("Qt.test", 1,0, "CompletionRegistering");
+ qmlRegisterType<CallbackRegisteringType>("Qt.test", 1,0, "CallbackRegistering");
}
int m_v;
};
+class CallbackRegisteringType : public QObject
+{
+Q_OBJECT
+Q_PROPERTY(int value READ value WRITE setValue)
+public:
+ CallbackRegisteringType();
+
+ int value() const { return m_v; }
+ void setValue(int v) { if (m_callback) m_callback(this, m_data); m_v = v; }
+
+ typedef void (*callback)(CallbackRegisteringType *, void *);
+ static void clearCallback();
+ static void registerCallback(callback, void *);
+
+private:
+ static callback m_callback;
+ static void *m_data;
+
+ int m_v;
+};
+
class CompletionRegisteringType : public QObject, public QDeclarativeParserStatus
{
Q_OBJECT
delete nested.object();
delete incubator.object();
}
+
+ // AsynchronousIfNested within a synchronous AsynchronousIfNested behaves synchronously
+ {
+ SelfRegisteringType::clearMe();
+
+ QDeclarativeComponent component(&engine, TEST_FILE("asynchronousIfNested.3.qml"));
+ QVERIFY(component.isReady());
+
+ struct CallbackData {
+ CallbackData(QDeclarativeEngine *e) : engine(e), pass(false) {}
+ QDeclarativeEngine *engine;
+ bool pass;
+ static void callback(CallbackRegisteringType *o, void *data) {
+ CallbackData *d = (CallbackData *)data;
+
+ QDeclarativeComponent c(d->engine, TEST_FILE("asynchronousIfNested.1.qml"));
+ if (!c.isReady()) return;
+
+ QDeclarativeIncubator incubator(QDeclarativeIncubator::AsynchronousIfNested);
+ c.create(incubator, 0, qmlContext(o));
+
+ if (!incubator.isReady()) return;
+
+ if (incubator.object()->property("a").toInt() != 10) return;
+
+ d->pass = true;
+ }
+ };
+
+ CallbackData cd(&engine);
+ CallbackRegisteringType::registerCallback(&CallbackData::callback, &cd);
+
+ QDeclarativeIncubator incubator(QDeclarativeIncubator::AsynchronousIfNested);
+ component.create(incubator);
+
+ QVERIFY(incubator.isReady());
+ QCOMPARE(cd.pass, true);
+
+ delete incubator.object();
+ }
}
void tst_qdeclarativeincubator::nestedComponent()