QDeclarativeIncubator wasn't calling statusChanged() for nested cases
authorAaron Kennedy <aaron.kennedy@nokia.com>
Fri, 14 Oct 2011 01:45:09 +0000 (11:45 +1000)
committerQt by Nokia <qt-info@nokia.com>
Fri, 14 Oct 2011 02:43:49 +0000 (04:43 +0200)
Change-Id: I1811951bdcdd69d4ad1643ed54a8ea097fa718b5
Reviewed-on: http://codereview.qt-project.org/6638
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
src/declarative/qml/qdeclarativeincubator.cpp
src/declarative/qml/qdeclarativeincubator_p.h
tests/auto/declarative/qdeclarativeincubator/data/statusChanged.nested.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp

index 9644d3a..c771a6d 100644 (file)
@@ -81,8 +81,7 @@ void QDeclarativeEnginePrivate::incubate(QDeclarativeIncubator &i, QDeclarativeC
 
     inProgressCreations++;
 
-    Q_ASSERT(i.isLoading());
-    i.statusChanged(i.status());
+    p->changeStatus(QDeclarativeIncubator::Loading);
 
     if (mode == QDeclarativeIncubator::Synchronous) {
         QDeclarativeVME::Interrupt i;
@@ -122,7 +121,8 @@ QDeclarativeIncubationController *QDeclarativeEngine::incubationController() con
 
 QDeclarativeIncubatorPrivate::QDeclarativeIncubatorPrivate(QDeclarativeIncubator *q, 
                                                            QDeclarativeIncubator::IncubationMode m)
-: q(q), mode(m), progress(Execute), result(0), component(0), vme(this), waitingOnMe(0)
+: q(q), status(QDeclarativeIncubator::Null), mode(m), progress(Execute), result(0), component(0), 
+  vme(this), waitingOnMe(0)
 {
 }
 
@@ -250,8 +250,6 @@ 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);
@@ -290,12 +288,7 @@ void QDeclarativeIncubatorPrivate::incubate(QDeclarativeVME::Interrupt &i)
         else
             progress = QDeclarativeIncubatorPrivate::Completed;
 
-        QDeclarativeIncubator::Status newStatus = q->status();
-        
-        if (oldStatus != newStatus) {
-            q->statusChanged(newStatus);
-            oldStatus = newStatus;
-        }
+        changeStatus(calculateStatus());
 
         if (watcher.hasRecursed())
             return;
@@ -324,11 +317,7 @@ finishIncubate:
 
         enginePriv->inProgressCreations--;
 
-        QDeclarativeIncubator::Status newStatus = q->status();
-        if (newStatus != oldStatus) {
-            q->statusChanged(newStatus);
-            oldStatus = newStatus;
-        }
+        changeStatus(calculateStatus());
 
         if (0 == enginePriv->inProgressCreations) {
             while (enginePriv->erroredBindings) {
@@ -548,6 +537,7 @@ void QDeclarativeIncubator::clear()
         }
     }
 
+    d->changeStatus(Null);
 }
 
 /*!
@@ -619,11 +609,7 @@ Return the current status of the incubator.
 */
 QDeclarativeIncubator::Status QDeclarativeIncubator::status() const
 {
-    if (!d->errors.isEmpty()) return Error;
-    else if (d->result && d->progress == QDeclarativeIncubatorPrivate::Completed && 
-             d->waitingFor.isEmpty()) return Ready;
-    else if (d->component) return Loading;
-    else return Null;
+    return d->status;
 }
 
 /*!
@@ -658,3 +644,26 @@ void QDeclarativeIncubator::setInitialState(QObject *object)
 {
     Q_UNUSED(object);
 }
+
+void QDeclarativeIncubatorPrivate::changeStatus(QDeclarativeIncubator::Status s)
+{
+    if (s == status) 
+        return;
+
+    status = s;
+    q->statusChanged(status);
+}
+
+QDeclarativeIncubator::Status QDeclarativeIncubatorPrivate::calculateStatus() const
+{
+    if (!errors.isEmpty()) 
+        return QDeclarativeIncubator::Error;
+    else if (result && progress == QDeclarativeIncubatorPrivate::Completed && 
+             waitingFor.isEmpty()) 
+        return QDeclarativeIncubator::Ready;
+    else if (component) 
+        return QDeclarativeIncubator::Loading;
+    else 
+        return QDeclarativeIncubator::Null;
+}
+
index d45f6d1..b17dbe8 100644 (file)
@@ -70,6 +70,10 @@ public:
 
     QDeclarativeIncubator *q;
 
+    QDeclarativeIncubator::Status calculateStatus() const;
+    void changeStatus(QDeclarativeIncubator::Status);
+    QDeclarativeIncubator::Status status;
+
     QDeclarativeIncubator::IncubationMode mode;
 
     QList<QDeclarativeError> errors;
diff --git a/tests/auto/declarative/qdeclarativeincubator/data/statusChanged.nested.qml b/tests/auto/declarative/qdeclarativeincubator/data/statusChanged.nested.qml
new file mode 100644 (file)
index 0000000..3a496ea
--- /dev/null
@@ -0,0 +1,12 @@
+import QtQuick 2.0
+
+QtObject {
+    id: root
+
+    property bool test: false
+
+    Component.onCompleted: {
+        var c = Qt.createComponent("statusChanged.qml");
+        c.incubateObject(root, null, Qt.Synchronous);
+    }
+}
index 224426e..672387e 100644 (file)
@@ -488,10 +488,10 @@ void tst_qdeclarativeincubator::statusChanged()
         virtual void setInitialState(QObject *) { statuses << -1; }
     };
 
+    {
     QDeclarativeComponent component(&engine, TEST_FILE("statusChanged.qml"));
     QVERIFY(component.isReady());
 
-    {
     MyIncubator incubator(QDeclarativeIncubator::Synchronous);
     component.create(incubator);
     QVERIFY(incubator.isReady());
@@ -503,6 +503,9 @@ void tst_qdeclarativeincubator::statusChanged()
     }
 
     {
+    QDeclarativeComponent component(&engine, TEST_FILE("statusChanged.qml"));
+    QVERIFY(component.isReady());
+
     MyIncubator incubator(QDeclarativeIncubator::Asynchronous);
     component.create(incubator);
     QVERIFY(incubator.isLoading());
@@ -520,6 +523,29 @@ void tst_qdeclarativeincubator::statusChanged()
     QCOMPARE(incubator.statuses.at(2), int(QDeclarativeIncubator::Ready));
     delete incubator.object();
     }
+
+    {
+    QDeclarativeComponent component2(&engine, TEST_FILE("statusChanged.nested.qml"));
+    QVERIFY(component2.isReady());
+
+    MyIncubator incubator(QDeclarativeIncubator::Asynchronous);
+    component2.create(incubator);
+    QVERIFY(incubator.isLoading());
+    QCOMPARE(incubator.statuses.count(), 1);
+    QCOMPARE(incubator.statuses.at(0), int(QDeclarativeIncubator::Loading));
+
+    {
+    bool b = true;
+    controller.incubateWhile(&b);
+    }
+
+    QVERIFY(incubator.isReady());
+    QCOMPARE(incubator.statuses.count(), 3);
+    QCOMPARE(incubator.statuses.at(0), int(QDeclarativeIncubator::Loading));
+    QCOMPARE(incubator.statuses.at(1), -1);
+    QCOMPARE(incubator.statuses.at(2), int(QDeclarativeIncubator::Ready));
+    delete incubator.object();
+    }
 }
 
 void tst_qdeclarativeincubator::asynchronousIfNested()