diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2011-10-06 17:33:39 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-10-07 04:26:50 +0200 |
commit | d517e9c541e5869e87006faeccd60be5690bee5b (patch) | |
tree | faf429942478baa9bf11fa7cad6a63153b6bfaa7 /src | |
parent | ff79fc671407c2457edee1b0a3404928897e6948 (diff) |
QDeclarativeIncubator autotests
Change-Id: I5c4594c40fccfe6cb8b198a5fd6c11b468b0562e
Reviewed-on: http://codereview.qt-project.org/6118
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/declarative/qml/qdeclarativecomponent.cpp | 27 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativeincubator.cpp | 18 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativevme.cpp | 31 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativevme_p.h | 4 |
4 files changed, 50 insertions, 30 deletions
diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp index e4c3003047..f9be4ca9f6 100644 --- a/src/declarative/qml/qdeclarativecomponent.cpp +++ b/src/declarative/qml/qdeclarativecomponent.cpp @@ -747,33 +747,10 @@ QDeclarativeComponentPrivate::beginCreate(QDeclarativeContextData *context) QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Creating); enginePriv->referenceScarceResources(); - state.vme.init(context, cc, start); + state.vme.init(context, cc, start, creationContext); QObject *rv = state.vme.execute(&state.errors); enginePriv->dereferenceScarceResources(); - if (rv && creationContext && start != -1) { - // A component that is logically created within another component instance shares the same - // instances of script imports. For example: - // - // import QtQuick 1.0 - // import "test.js" as Test - // ListView { - // model: Test.getModel() - // delegate: Component { - // Text { text: Test.getValue(index); } - // } - // } - // - // Has the same "Test" instance. To implement this, we simply copy the v8 handles into - // the inner context. We have to create a fresh persistent handle for each to prevent - // double dispose. It is possible we could do this more efficiently using some form of - // referencing instead. - QDeclarativeContextData *objectContext = QDeclarativeData::get(rv, false)->outerContext; - objectContext->importedScripts = creationContext->importedScripts; - for (int ii = 0; ii < objectContext->importedScripts.count(); ++ii) - objectContext->importedScripts[ii] = qPersistentNew<v8::Object>(objectContext->importedScripts[ii]); - } - if (rv) { QDeclarativeData *ddata = QDeclarativeData::get(rv); Q_ASSERT(ddata); @@ -919,7 +896,7 @@ void QDeclarativeComponent::create(QDeclarativeIncubator &i, QDeclarativeContext QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(d->engine); p->component = d->cc; p->component->addref(); - p->vme.init(contextData, d->cc, d->start); + p->vme.init(contextData, d->cc, d->start, d->creationContext); enginePriv->incubate(i, forContextData); } diff --git a/src/declarative/qml/qdeclarativeincubator.cpp b/src/declarative/qml/qdeclarativeincubator.cpp index ae1ae2dc53..9644d3a20d 100644 --- a/src/declarative/qml/qdeclarativeincubator.cpp +++ b/src/declarative/qml/qdeclarativeincubator.cpp @@ -81,6 +81,9 @@ void QDeclarativeEnginePrivate::incubate(QDeclarativeIncubator &i, QDeclarativeC inProgressCreations++; + Q_ASSERT(i.isLoading()); + i.statusChanged(i.status()); + if (mode == QDeclarativeIncubator::Synchronous) { QDeclarativeVME::Interrupt i; p->incubate(i); @@ -247,6 +250,8 @@ void QDeclarativeIncubatorPrivate::incubate(QDeclarativeVME::Interrupt &i) bool guardOk = vmeGuard.isOK(); vmeGuard.clear(); + QDeclarativeIncubator::Status oldStatus = q->status(); + if (!guardOk) { QDeclarativeError error; error.setUrl(component->url); @@ -285,7 +290,12 @@ void QDeclarativeIncubatorPrivate::incubate(QDeclarativeVME::Interrupt &i) else progress = QDeclarativeIncubatorPrivate::Completed; - q->statusChanged(q->status()); + QDeclarativeIncubator::Status newStatus = q->status(); + + if (oldStatus != newStatus) { + q->statusChanged(newStatus); + oldStatus = newStatus; + } if (watcher.hasRecursed()) return; @@ -314,7 +324,11 @@ finishIncubate: enginePriv->inProgressCreations--; - q->statusChanged(q->status()); + QDeclarativeIncubator::Status newStatus = q->status(); + if (newStatus != oldStatus) { + q->statusChanged(newStatus); + oldStatus = newStatus; + } if (0 == enginePriv->inProgressCreations) { while (enginePriv->erroredBindings) { diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp index 53bcd8c3d2..dbef83b143 100644 --- a/src/declarative/qml/qdeclarativevme.cpp +++ b/src/declarative/qml/qdeclarativevme.cpp @@ -91,12 +91,17 @@ using namespace QDeclarativeVMETypes; goto exceptionExit; \ } -void QDeclarativeVME::init(QDeclarativeContextData *ctxt, QDeclarativeCompiledData *comp, int start) +void QDeclarativeVME::init(QDeclarativeContextData *ctxt, QDeclarativeCompiledData *comp, int start, + QDeclarativeContextData *creation) { Q_ASSERT(ctxt); Q_ASSERT(comp); - if (start == -1) start = 0; + if (start == -1) { + start = 0; + } else { + creationContext = creation; + } State initState; initState.context = ctxt; @@ -307,6 +312,27 @@ QObject *QDeclarativeVME::run(QList<QDeclarativeError> *errors, rootContext = CTXT; rootContext->activeVME = this; } + if (states.count() == 1 && !creationContext.isNull()) { + // A component that is logically created within another component instance shares the + // same instances of script imports. For example: + // + // import QtQuick 1.0 + // import "test.js" as Test + // ListView { + // model: Test.getModel() + // delegate: Component { + // Text { text: Test.getValue(index); } + // } + // } + // + // Has the same "Test" instance. To implement this, we simply copy the v8 handles into + // the inner context. We have to create a fresh persistent handle for each to prevent + // double dispose. It is possible we could do this more efficiently using some form of + // referencing instead. + CTXT->importedScripts = creationContext->importedScripts; + for (int ii = 0; ii < CTXT->importedScripts.count(); ++ii) + CTXT->importedScripts[ii] = qPersistentNew<v8::Object>(CTXT->importedScripts[ii]); + } QML_END_INSTR(Init) QML_BEGIN_INSTR(DeferInit) @@ -1204,6 +1230,7 @@ void QDeclarativeVME::reset() finalizeCallbacks.clear(); states.clear(); rootContext = 0; + creationContext = 0; } // Must be called with a handle scope and context diff --git a/src/declarative/qml/qdeclarativevme_p.h b/src/declarative/qml/qdeclarativevme_p.h index 5809ccc12c..19db2ef217 100644 --- a/src/declarative/qml/qdeclarativevme_p.h +++ b/src/declarative/qml/qdeclarativevme_p.h @@ -119,7 +119,8 @@ public: QDeclarativeComponentAttached *componentAttached; QList<QDeclarativeEnginePrivate::FinalizeCallback> finalizeCallbacks; - void init(QDeclarativeContextData *, QDeclarativeCompiledData *, int start); + void init(QDeclarativeContextData *, QDeclarativeCompiledData *, int start, + QDeclarativeContextData * = 0); bool initDeferred(QObject *); void reset(); @@ -150,6 +151,7 @@ private: QFiniteStack<QDeclarativeAbstractBinding *> bindValues; QFiniteStack<QDeclarativeParserStatus *> parserStatus; QDeclarativeGuardedContextData rootContext; + QDeclarativeGuardedContextData creationContext; struct State { enum Flag { Deferred = 0x00000001 }; |