// XXX TODO // - check that the Component.onCompleted behavior is the same as 4.8 in the synchronous and // async if nested cases void QQmlEnginePrivate::incubate(QQmlIncubator &i, QQmlContextData *forContext) { QExplicitlySharedDataPointer<QQmlIncubatorPrivate> p(i.d); QQmlIncubator::IncubationMode mode = i.incubationMode(); if (!incubationController) mode = QQmlIncubator::Synchronous; if (mode == QQmlIncubator::AsynchronousIfNested) { mode = QQmlIncubator::Synchronous; // Need to find the first constructing context and see if it is asynchronous QExplicitlySharedDataPointer<QQmlIncubatorPrivate> parentIncubator; QQmlContextData *cctxt = forContext; while (cctxt) { if (cctxt->activeVMEData) { parentIncubator = (QQmlIncubatorPrivate *)cctxt->activeVMEData; break; } cctxt = cctxt->parent; } if (parentIncubator && parentIncubator->isAsynchronous) { mode = QQmlIncubator::Asynchronous; p->waitingOnMe = parentIncubator; parentIncubator->waitingFor.insert(p.data()); } } p->isAsynchronous = (mode != QQmlIncubator::Synchronous); inProgressCreations++; if (mode == QQmlIncubator::Synchronous) { QRecursionWatcher<QQmlIncubatorPrivate, &QQmlIncubatorPrivate::recursion> watcher(p.data()); p->changeStatus(QQmlIncubator::Loading); if (!watcher.hasRecursed()) { QQmlInstantiationInterrupt i; p->incubate(i); } } else { incubatorList.insert(p.data()); incubatorCount++; p->vmeGuard.guard(p->creator.data()); p->changeStatus(QQmlIncubator::Loading); if (incubationController) incubationController->incubatingObjectCountChanged(incubatorCount); } }