diff options
author | Aurindam Jana <aurindam.jana@nokia.com> | 2012-05-10 09:21:26 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-12 11:00:34 +0200 |
commit | 6f9b3893c8c7bc0b6663acb34c17c120852ef7b7 (patch) | |
tree | f992993047106aead5d5228fb490120df7da490d /tests/auto/qml/debugger | |
parent | 36d6307dd19d34354fb1ada7b6e5883977d43db8 (diff) |
QQmlDebugService: Fetch Objects for location info
Fetch Objects for given filename, line number and column
number.
Change-Id: I9a81e4c7fa75faaf87f02453026c5320b7f86003
Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
Diffstat (limited to 'tests/auto/qml/debugger')
3 files changed, 134 insertions, 0 deletions
diff --git a/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugclient.cpp b/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugclient.cpp index eb04fb2c2e..3807cf50a4 100644 --- a/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugclient.cpp +++ b/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugclient.cpp @@ -217,6 +217,24 @@ quint32 QQmlEngineDebugClient::queryObject( return id; } +quint32 QQmlEngineDebugClient::queryObjectsForLocation( + const QString &file, int lineNumber, int columnNumber, bool *success) +{ + m_objects.clear(); + quint32 id; + *success = false; + if (state() == QQmlDebugClient::Enabled) { + id = getId(); + QByteArray message; + QDataStream ds(&message, QIODevice::WriteOnly); + ds << QByteArray("FETCH_OBJECTS_FOR_LOCATION") << id << file << lineNumber + << columnNumber << false << true; + sendMessage(message); + *success = true; + } + return id; +} + quint32 QQmlEngineDebugClient::queryObjectRecursive( const QmlDebugObjectReference &object, bool *success) { @@ -235,6 +253,24 @@ quint32 QQmlEngineDebugClient::queryObjectRecursive( return id; } +quint32 QQmlEngineDebugClient::queryObjectsForLocationRecursive(const QString &file, + int lineNumber, int columnNumber, bool *success) +{ + m_objects.clear(); + quint32 id; + *success = false; + if (state() == QQmlDebugClient::Enabled) { + id = getId(); + QByteArray message; + QDataStream ds(&message, QIODevice::WriteOnly); + ds << QByteArray("FETCH_OBJECTS_FOR_LOCATION") << id << file << lineNumber + << columnNumber << true << true; + sendMessage(message); + *success = true; + } + return id; +} + quint32 QQmlEngineDebugClient::queryExpressionResult( int objectDebugId, const QString &expr, bool *success) { @@ -390,6 +426,19 @@ void QQmlEngineDebugClient::decode(QDataStream &ds, } void QQmlEngineDebugClient::decode(QDataStream &ds, + QList<QmlDebugObjectReference> &o, + bool simple) +{ + int count; + ds >> count; + for (int i = 0; i < count; i++) { + QmlDebugObjectReference obj; + decode(ds, obj, simple); + o << obj; + } +} + +void QQmlEngineDebugClient::decode(QDataStream &ds, QmlDebugContextReference &c) { ds >> c.name >> c.debugId; @@ -443,6 +492,10 @@ void QQmlEngineDebugClient::messageReceived(const QByteArray &data) if (!ds.atEnd()) decode(ds, m_object, false); + } else if (type == "FETCH_OBJECTS_FOR_LOCATION_R") { + if (!ds.atEnd()) + decode(ds, m_objects, false); + } else if (type == "EVAL_EXPRESSION_R") {; ds >> m_exprResult; diff --git a/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugclient.h b/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugclient.h index 34d4e971a1..be965757b4 100644 --- a/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugclient.h +++ b/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugclient.h @@ -192,8 +192,12 @@ public: bool *success); quint32 queryObject(const QmlDebugObjectReference &, bool *success); + quint32 queryObjectsForLocation(const QString &file, + int lineNumber, int columnNumber, bool *success); quint32 queryObjectRecursive(const QmlDebugObjectReference &, bool *success); + quint32 queryObjectsForLocationRecursive(const QString &file, + int lineNumber, int columnNumber, bool *success); quint32 queryExpressionResult(int objectDebugId, const QString &expr, bool *success); @@ -213,10 +217,12 @@ public: void decode(QDataStream &, QmlDebugContextReference &); void decode(QDataStream &, QmlDebugObjectReference &, bool simple); + void decode(QDataStream &ds, QList<QmlDebugObjectReference> &o, bool simple); QList<QmlDebugEngineReference> engines() { return m_engines; } QmlDebugContextReference rootContext() { return m_rootContext; } QmlDebugObjectReference object() { return m_object; } + QList<QmlDebugObjectReference> objects() { return m_objects; } QVariant resultExpr() { return m_exprResult; } bool valid() { return m_valid; } @@ -234,6 +240,7 @@ private: QList<QmlDebugEngineReference> m_engines; QmlDebugContextReference m_rootContext; QmlDebugObjectReference m_object; + QList<QmlDebugObjectReference> m_objects; QVariant m_exprResult; }; diff --git a/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp b/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp index 17b22b43a2..3c57c36f96 100644 --- a/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp +++ b/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp @@ -118,6 +118,8 @@ private slots: void queryRootContexts(); void queryObject(); void queryObject_data(); + void queryObjectsForLocation(); + void queryObjectsForLocation_data(); void queryExpressionResult(); void queryExpressionResult_data(); void queryExpressionResultInRootContext(); @@ -688,6 +690,78 @@ void tst_QQmlEngineDebugService::queryObject_data() QTest::newRow("recursive") << true; } +void tst_QQmlEngineDebugService::queryObjectsForLocation() +{ + QFETCH(bool, recursive); + + bool success; + + QmlDebugObjectReference rootObject = findRootObject(); + + const QString fileName = QFileInfo(rootObject.source.url.toString()).fileName(); + int lineNumber = rootObject.source.lineNumber; + int columnNumber = rootObject.source.columnNumber; + + QQmlEngineDebugClient *unconnected = new QQmlEngineDebugClient(0); + recursive ? unconnected->queryObjectsForLocationRecursive(fileName, lineNumber, + columnNumber, &success) + : unconnected->queryObjectsForLocation(fileName, lineNumber, + columnNumber, &success); + QVERIFY(!success); + delete unconnected; + + recursive ? m_dbg->queryObjectsForLocationRecursive(fileName, lineNumber, + columnNumber, &success) + : m_dbg->queryObjectsForLocation(fileName, lineNumber, + columnNumber, &success); + QVERIFY(success); + QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); + + QVERIFY(m_dbg->objects().count() == 1); + QmlDebugObjectReference obj = m_dbg->objects().first(); + + // check source as defined in main() + QmlDebugFileReference source = obj.source; + QCOMPARE(source.url, QUrl(fileName)); + QCOMPARE(source.lineNumber, lineNumber); + QCOMPARE(source.columnNumber, columnNumber); + + // generically test all properties, children and childrens' properties + recursiveObjectTest(m_rootItem, obj, recursive); + + if (recursive) { + foreach (const QmlDebugObjectReference &child, obj.children) + QVERIFY(child.properties.count() > 0); + + QmlDebugObjectReference rect; + QmlDebugObjectReference text; + foreach (const QmlDebugObjectReference &child, obj.children) { + if (child.className == "Rectangle") + rect = child; + else if (child.className == "Text") + text = child; + } + + // test specific property values + QCOMPARE(findProperty(rect.properties, "width").value, qVariantFromValue(500)); + QCOMPARE(findProperty(rect.properties, "height").value, qVariantFromValue(600)); + QCOMPARE(findProperty(rect.properties, "color").value, qVariantFromValue(QColor("blue"))); + + QCOMPARE(findProperty(text.properties, "color").value, qVariantFromValue(QColor("blue"))); + } else { + foreach (const QmlDebugObjectReference &child, obj.children) + QCOMPARE(child.properties.count(), 0); + } +} + +void tst_QQmlEngineDebugService::queryObjectsForLocation_data() +{ + QTest::addColumn<bool>("recursive"); + + QTest::newRow("non-recursive") << false; + QTest::newRow("recursive") << true; +} + void tst_QQmlEngineDebugService::queryExpressionResult() { QFETCH(QString, expr); |