From 35a36e91606eaf8374a2273cbb0101e0e614321e Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Tue, 15 Feb 2011 14:00:27 +0100
Subject: QDeclarativeDebug: Fix crash when serializing list of QObjects

Task-number: QTBUG-17444
Reviewed-by: Aaron Kennedy
---
 src/declarative/qml/qdeclarativeenginedebug.cpp        | 18 ++++++++++--------
 .../qdeclarativedebug/tst_qdeclarativedebug.cpp        | 16 +++++++++++++---
 2 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/src/declarative/qml/qdeclarativeenginedebug.cpp b/src/declarative/qml/qdeclarativeenginedebug.cpp
index 8c7f3ad..31fd516 100644
--- a/src/declarative/qml/qdeclarativeenginedebug.cpp
+++ b/src/declarative/qml/qdeclarativeenginedebug.cpp
@@ -167,17 +167,19 @@ QDeclarativeEngineDebugServer::propertyData(QObject *obj, int propIdx)
 QVariant QDeclarativeEngineDebugServer::valueContents(const QVariant &value) const
 {
     int userType = value.userType();
-    if (QDeclarativeValueTypeFactory::isValueType(userType))
-        return value;
 
-    /*
-    if (QDeclarativeMetaType::isList(userType)) {
-        int count = QDeclarativeMetaType::listCount(value);
+    if (value.type() == QVariant::List) {
         QVariantList contents;
-        for (int i=0; i<count; i++)
-            contents << valueContents(QDeclarativeMetaType::listAt(value, i));
+        QVariantList list = value.toList();
+        int count = list.size();
+        for (int i = 0; i < count; i++)
+            contents << valueContents(list.at(i));
         return contents;
-    } else */
+    }
+
+    if (QDeclarativeValueTypeFactory::isValueType(userType))
+        return value;
+
     if (QDeclarativeMetaType::isQObject(userType)) {
         QObject *o = QDeclarativeMetaType::toQObject(value);
         if (o) {
diff --git a/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
index 917b8d8..d01463e 100644
--- a/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
+++ b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp
@@ -166,8 +166,8 @@ void tst_QDeclarativeDebug::recursiveObjectTest(QObject *o, const QDeclarativeDe
 {
     const QMetaObject *meta = o->metaObject();
 
-    QDeclarativeType *type = QDeclarativeMetaType::qmlType(o->metaObject());
-    QString className = type ? type->qmlTypeName() : QString();
+    QDeclarativeType *type = QDeclarativeMetaType::qmlType(meta);
+    QString className = type ? QString(type->qmlTypeName()) : QString(meta->className());
     className = className.mid(className.lastIndexOf(QLatin1Char('/'))+1);
 
     QCOMPARE(oref.debugId(), QDeclarativeDebugService::idForObject(o));
@@ -292,12 +292,21 @@ void tst_QDeclarativeDebug::initTestCase()
     QList<QByteArray> qml;
     qml << "import QtQuick 1.0\n"
             "Item {"
+                "id: root\n"
                 "width: 10; height: 20; scale: blueRect.scale;"
                 "Rectangle { id: blueRect; width: 500; height: 600; color: \"blue\"; }"
                 "Text { color: blueRect.color; }"
                 "MouseArea {"
                     "onEntered: { console.log('hello') }"
                 "}"
+                "property variant varObj\n"
+                "property variant varObjList: []\n"
+                "Component.onCompleted: {\n"
+                    "varObj = blueRect;\n"
+                    "var list = varObjList;\n"
+                    "list[0] = blueRect;\n"
+                    "varObjList = list;\n"
+                "}\n"
             "}";
 
     // add second component to test multiple root contexts
@@ -741,7 +750,6 @@ void tst_QDeclarativeDebug::queryObject()
         QCOMPARE(findProperty(rect.properties(), "color").value(), qVariantFromValue(QColor("blue")));
 
         QCOMPARE(findProperty(text.properties(), "color").value(), qVariantFromValue(QColor("blue")));
-
     } else {
         foreach(const QDeclarativeDebugObjectReference &child, obj.children())
             QCOMPARE(child.properties().count(), 0);
@@ -798,6 +806,8 @@ void tst_QDeclarativeDebug::queryExpressionResult_data()
     QTest::newRow("width + 50") << "width + 50" << qVariantFromValue(60);
     QTest::newRow("blueRect.width") << "blueRect.width" << qVariantFromValue(500);
     QTest::newRow("bad expr") << "aeaef" << qVariantFromValue(QString("<undefined>"));
+    QTest::newRow("QObject*") << "varObj" << qVariantFromValue(QString("<unnamed object>"));
+    QTest::newRow("list of QObject*") << "varObjList" << qVariantFromValue(QString("<unknown value>"));
 }
 
 void tst_QDeclarativeDebug::tst_QDeclarativeDebugFileReference()
-- 
cgit v0.12