aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-10-06 17:33:39 +1000
committerQt by Nokia <qt-info@nokia.com>2011-10-07 04:26:50 +0200
commitd517e9c541e5869e87006faeccd60be5690bee5b (patch)
treefaf429942478baa9bf11fa7cad6a63153b6bfaa7 /src
parentff79fc671407c2457edee1b0a3404928897e6948 (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.cpp27
-rw-r--r--src/declarative/qml/qdeclarativeincubator.cpp18
-rw-r--r--src/declarative/qml/qdeclarativevme.cpp31
-rw-r--r--src/declarative/qml/qdeclarativevme_p.h4
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 };