diff options
author | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2015-11-19 17:14:23 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2016-01-12 18:00:47 +0000 |
commit | 258638f3726f63b308b6275090b1dad596f4fb56 (patch) | |
tree | cbbcfe5772a90b8e2dd0cfe493be465f9bc2003f /tests/auto/qml/debugger | |
parent | 11bd376d1399faff71ff17af9ee10f61b959901b (diff) |
Rewrite inspector service
The inspector service had bitrotted to a point where there was little
code to be rescued. Apparently it was never really finished and quite
some code didn't make any sense. This change removes some features
that were unused or didn't work correctly:
1. Panning and Zooming with mouse wheel and touch interaction. This
might be useful in some contexts, but the implementation was so broken
that it wasn't worth trying to fix it. The whole idea of doing this on
the layer of QQuickItems is not so great because there is no
distinction between spontaneous changes triggered by the application
and debugging interaction triggered from outside. It might be better to
implement such functionality on a lower level, e.g. in the renderer.
2. Reloading the scene with debug changes. Use one of the other debug
services to change properties. Clearing the component cache is a rather
drastic measure and not necessary here.
In turn, we get support for inspecting multiple windows, and all
subclasses of QQuickWindow are supported now. Also, show-on-top works
now.
Task-number: QTBUG-33376
Change-Id: I65497f49c6b46128a600b0e3a31483eeef40313c
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'tests/auto/qml/debugger')
9 files changed, 351 insertions, 160 deletions
diff --git a/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/data/qtquick2.qml b/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/data/qtquick2.qml index 9c36e13c5b..2e6cd2397c 100644 --- a/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/data/qtquick2.qml +++ b/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/data/qtquick2.qml @@ -1,5 +1,18 @@ import QtQuick 2.0 Item { + Rectangle { + id: rect1 + width: 20 + height: 20 + color: "green" + } + Rectangle { + id: rect2 + x: 20 + width: 20 + height: 20 + color: "red" + } } diff --git a/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp b/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp index 04b068161b..6215c655f3 100644 --- a/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp +++ b/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp @@ -58,6 +58,7 @@ public: : m_process(0) , m_inspectorClient(0) , m_engineDebugClient(0) + , m_recipient(0) { } @@ -69,33 +70,40 @@ private: QQmlDebugProcess *m_process; QQmlInspectorClient *m_inspectorClient; QQmlEngineDebugClient *m_engineDebugClient; + QQmlInspectorResultRecipient *m_recipient; private slots: void cleanup(); void connect_data(); void connect(); - void clearObjectReferenceHashonReloadQml(); + void objectLocationLookup(); + void select(); + void createObject(); + void moveObject(); + void destroyObject(); }; - QmlDebugObjectReference tst_QQmlEngineDebugInspectorIntegration::findRootObject() { bool success = false; m_engineDebugClient->queryAvailableEngines(&success); - QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result())); + if (!QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result()))) + return QmlDebugObjectReference(); m_engineDebugClient->queryRootContexts(m_engineDebugClient->engines()[0].debugId, &success); - QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result())); + if (!QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result()))) + return QmlDebugObjectReference(); + int count = m_engineDebugClient->rootContext().contexts.count(); m_engineDebugClient->queryObject( m_engineDebugClient->rootContext().contexts[count - 1].objects[0], &success); - QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result())); + if (!QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result()))) + return QmlDebugObjectReference(); return m_engineDebugClient->object(); } - void tst_QQmlEngineDebugInspectorIntegration::init(bool restrictServices) { const QString argument = QString::fromLatin1("-qmljsdebugger=port:%1,%2,block%3") @@ -103,9 +111,8 @@ void tst_QQmlEngineDebugInspectorIntegration::init(bool restrictServices) .arg(restrictServices ? QStringLiteral(",services:QmlDebugger,QmlInspector") : QString()); - // ### Still using qmlscene because of QTBUG-33376 - m_process = new QQmlDebugProcess(QLibraryInfo::location(QLibraryInfo::BinariesPath) - + "/qmlscene", this); + m_process = new QQmlDebugProcess(QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qml", + this); m_process->start(QStringList() << argument << testFile("qtquick2.qml")); QVERIFY2(m_process->waitForSessionStart(), "Could not launch application, or did not get 'Waiting for connection'."); @@ -113,6 +120,10 @@ void tst_QQmlEngineDebugInspectorIntegration::init(bool restrictServices) QQmlDebugConnection *m_connection = new QQmlDebugConnection(this); m_inspectorClient = new QQmlInspectorClient(m_connection); m_engineDebugClient = new QQmlEngineDebugClient(m_connection); + m_recipient = new QQmlInspectorResultRecipient(this); + QObject::connect(m_inspectorClient, &QQmlInspectorClient::responseReceived, + m_recipient, &QQmlInspectorResultRecipient::recordResponse); + QList<QQmlDebugClient *> others = QQmlDebugTest::createOtherClients(m_connection); m_connection->connectToHost(QLatin1String("127.0.0.1"), m_process->debugPort()); @@ -121,6 +132,9 @@ void tst_QQmlEngineDebugInspectorIntegration::init(bool restrictServices) QCOMPARE(other->state(), restrictServices ? QQmlDebugClient::Unavailable : QQmlDebugClient::Enabled); qDeleteAll(others); + + QTRY_COMPARE(m_inspectorClient->state(), QQmlDebugClient::Enabled); + QTRY_COMPARE(m_engineDebugClient->state(), QQmlDebugClient::Enabled); } void tst_QQmlEngineDebugInspectorIntegration::cleanup() @@ -130,8 +144,13 @@ void tst_QQmlEngineDebugInspectorIntegration::cleanup() qDebug() << "Application Output:" << m_process->output(); } delete m_process; + m_process = 0; delete m_engineDebugClient; + m_engineDebugClient = 0; delete m_inspectorClient; + m_inspectorClient = 0; + delete m_recipient; + m_recipient = 0; } void tst_QQmlEngineDebugInspectorIntegration::connect_data() @@ -145,16 +164,15 @@ void tst_QQmlEngineDebugInspectorIntegration::connect() { QFETCH(bool, restrictMode); init(restrictMode); - QTRY_COMPARE(m_inspectorClient->state(), QQmlDebugClient::Enabled); - QTRY_COMPARE(m_engineDebugClient->state(), QQmlDebugClient::Enabled); } -void tst_QQmlEngineDebugInspectorIntegration::clearObjectReferenceHashonReloadQml() +void tst_QQmlEngineDebugInspectorIntegration::objectLocationLookup() { init(true); - QTRY_COMPARE(m_engineDebugClient->state(), QQmlDebugClient::Enabled); + bool success = false; QmlDebugObjectReference rootObject = findRootObject(); + QVERIFY(rootObject.debugId != -1); const QString fileName = QFileInfo(rootObject.source.url.toString()).fileName(); int lineNumber = rootObject.source.lineNumber; int columnNumber = rootObject.source.columnNumber; @@ -172,38 +190,94 @@ void tst_QQmlEngineDebugInspectorIntegration::clearObjectReferenceHashonReloadQm QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result()))); } +} - QTRY_COMPARE(m_inspectorClient->state(), QQmlDebugClient::Enabled); +void tst_QQmlEngineDebugInspectorIntegration::select() +{ + init(true); + QmlDebugObjectReference rootObject = findRootObject(); + QList<int> childIds; + int requestId = 0; + foreach (const QmlDebugObjectReference &child, rootObject.children) { + requestId = m_inspectorClient->select(QList<int>() << child.debugId); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); + childIds << child.debugId; + } + requestId = m_inspectorClient->select(childIds); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); +} - QByteArray contents; - contents.append("import QtQuick 2.0\n" - "Text {" - "y: 10\n" - "text: \"test\"\n" - "}"); - - QHash<QString, QByteArray> changesHash; - changesHash.insert("test.qml", contents); - m_inspectorClient->reloadQml(changesHash); - QVERIFY(QQmlDebugTest::waitForSignal(m_inspectorClient, SIGNAL(responseReceived()))); - - lineNumber = rootObject.source.lineNumber; - columnNumber = rootObject.source.columnNumber; - success = false; - m_engineDebugClient->queryObjectsForLocation(fileName, lineNumber, - columnNumber, &success); +void tst_QQmlEngineDebugInspectorIntegration::createObject() +{ + init(true); + + QString qml = QLatin1String("Rectangle {\n" + " id: xxxyxxx\n" + " width: 10\n" + " height: 10\n" + " color: \"blue\"\n" + "}"); + + QmlDebugObjectReference rootObject = findRootObject(); + QVERIFY(rootObject.debugId != -1); + QCOMPARE(rootObject.children.length(), 2); + + int requestId = m_inspectorClient->createObject( + qml, rootObject.debugId, QStringList() << QLatin1String("import QtQuick 2.0"), + QLatin1String("testcreate.qml")); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); + + rootObject = findRootObject(); + QVERIFY(rootObject.debugId != -1); + QCOMPARE(rootObject.children.length(), 3); + QCOMPARE(rootObject.children[2].idString, QLatin1String("xxxyxxx")); +} + +void tst_QQmlEngineDebugInspectorIntegration::moveObject() +{ + init(true); + QmlDebugObjectReference rootObject = findRootObject(); + QVERIFY(rootObject.debugId != -1); + QCOMPARE(rootObject.children.length(), 2); + + int childId = rootObject.children[0].debugId; + int requestId = m_inspectorClient->moveObject(childId, rootObject.children[1].debugId); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); + + rootObject = findRootObject(); + QVERIFY(rootObject.debugId != -1); + QCOMPARE(rootObject.children.length(), 1); + bool success = false; + m_engineDebugClient->queryObject(rootObject.children[0], &success); QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result()))); + QCOMPARE(m_engineDebugClient->object().children.length(), 1); + QCOMPARE(m_engineDebugClient->object().children[0].debugId, childId); +} - foreach (QmlDebugObjectReference child, rootObject.children) { - success = false; - lineNumber = child.source.lineNumber; - columnNumber = child.source.columnNumber; - m_engineDebugClient->queryObjectsForLocation(fileName, lineNumber, - columnNumber, &success); - QVERIFY(success); - QVERIFY(QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result()))); - } +void tst_QQmlEngineDebugInspectorIntegration::destroyObject() +{ + init(true); + QmlDebugObjectReference rootObject = findRootObject(); + QVERIFY(rootObject.debugId != -1); + QCOMPARE(rootObject.children.length(), 2); + + int requestId = m_inspectorClient->destroyObject(rootObject.children[0].debugId); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); + + rootObject = findRootObject(); + QVERIFY(rootObject.debugId != -1); + QCOMPARE(rootObject.children.length(), 1); + bool success = false; + m_engineDebugClient->queryObject(rootObject.children[0], &success); + QVERIFY(success); + QVERIFY(QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result()))); + QCOMPARE(m_engineDebugClient->object().children.length(), 0); } QTEST_MAIN(tst_QQmlEngineDebugInspectorIntegration) diff --git a/tests/auto/qml/debugger/qqmlinspector/data/changes.txt b/tests/auto/qml/debugger/qqmlinspector/data/changes.txt deleted file mode 100644 index 38b17caeff..0000000000 --- a/tests/auto/qml/debugger/qqmlinspector/data/changes.txt +++ /dev/null @@ -1,8 +0,0 @@ -import QtQuick 2.0 -Item { - id: test - Component.onCompleted: { - console.log("version 2.0"); - Qt.quit() - } -} diff --git a/tests/auto/qml/debugger/qqmlinspector/data/qtquick2.qml b/tests/auto/qml/debugger/qqmlinspector/data/qtquick2.qml index 9c36e13c5b..f44c653840 100644 --- a/tests/auto/qml/debugger/qqmlinspector/data/qtquick2.qml +++ b/tests/auto/qml/debugger/qqmlinspector/data/qtquick2.qml @@ -1,5 +1,44 @@ import QtQuick 2.0 -Item { +Rectangle { + width: 100 + height: 100 + color: "blue" + RotationAnimation on rotation { + duration: 3600 + loops: Animation.Infinite + from: 0 + to: 360 + } + + Timer { + interval: 300 + repeat: true + running: true + property int prevHit: -1 + property int prevRotation: -1 + onTriggered: { + var date = new Date; + var millis = date.getMilliseconds() + + if (prevHit < 0) { + prevHit = millis; + prevRotation = parent.rotation + return; + } + + var milliDelta = millis - prevHit; + if (milliDelta < 0) + milliDelta += 1000; + console.log(milliDelta, "milliseconds "); + prevHit = millis; + + var delta = parent.rotation - prevRotation; + if (delta < 0) + delta += 360 + prevRotation = parent.rotation + console.log(delta, "degrees "); + } + } } diff --git a/tests/auto/qml/debugger/qqmlinspector/data/window.qml b/tests/auto/qml/debugger/qqmlinspector/data/window.qml index 29eaced121..20baa153c5 100644 --- a/tests/auto/qml/debugger/qqmlinspector/data/window.qml +++ b/tests/auto/qml/debugger/qqmlinspector/data/window.qml @@ -2,6 +2,8 @@ import QtQuick 2.0 import QtQuick.Window 2.0 Window { + visible: true + height: 100 width: 100 } diff --git a/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp b/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp index d5aa1f41ad..1b11ebc829 100644 --- a/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp +++ b/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp @@ -49,55 +49,54 @@ #define STR_PORT_TO "3782" - class tst_QQmlInspector : public QQmlDataTest { Q_OBJECT -public: - tst_QQmlInspector() - : m_process(0) - , m_connection(0) - , m_client(0) - { - } - private: - void startQmlsceneProcess(const char *qmlFile, bool restrictMode = true); + void startQmlProcess(const QString &qmlFile, bool restrictMode = true); + void checkAnimationSpeed(int targetMillisPerDegree); private: - QQmlDebugProcess *m_process; - QQmlDebugConnection *m_connection; - QQmlInspectorClient *m_client; + QScopedPointer<QQmlDebugProcess> m_process; + QScopedPointer<QQmlDebugConnection> m_connection; + QScopedPointer<QQmlInspectorClient> m_client; + QScopedPointer<QQmlInspectorResultRecipient> m_recipient; private slots: void cleanup(); void connect_data(); void connect(); + void setAnimationSpeed(); void showAppOnTop(); - void reloadQml(); - void reloadQmlWindow(); }; -void tst_QQmlInspector::startQmlsceneProcess(const char * /* qmlFile */, bool restrictServices) +void tst_QQmlInspector::startQmlProcess(const QString &qmlFile, bool restrictServices) { const QString argument = QString::fromLatin1("-qmljsdebugger=port:%1,%2,block%3") .arg(STR_PORT_FROM).arg(STR_PORT_TO) .arg(restrictServices ? QStringLiteral(",services:QmlInspector") : QString()); - // ### This should be using qml instead of qmlscene, but can't because of QTBUG-33376 (same as the XFAIL testcase) - m_process = new QQmlDebugProcess(QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qmlscene", this); - m_process->start(QStringList() << argument << testFile("qtquick2.qml")); + m_process.reset(new QQmlDebugProcess(QLibraryInfo::location(QLibraryInfo::BinariesPath) + + "/qml")); + // Make sure the animation timing is exact + m_process->addEnvironment(QLatin1String("QSG_RENDER_LOOP=basic")); + m_process->start(QStringList() << argument << testFile(qmlFile)); QVERIFY2(m_process->waitForSessionStart(), "Could not launch application, or did not get 'Waiting for connection'."); - m_connection = new QQmlDebugConnection(); - m_client = new QQmlInspectorClient(m_connection); - QList<QQmlDebugClient *> others = QQmlDebugTest::createOtherClients(m_connection); + m_client.reset(); + m_connection.reset(new QQmlDebugConnection); + m_client.reset(new QQmlInspectorClient(m_connection.data())); + + m_recipient.reset(new QQmlInspectorResultRecipient); + QObject::connect(m_client.data(), &QQmlInspectorClient::responseReceived, + m_recipient.data(), &QQmlInspectorResultRecipient::recordResponse); + + QList<QQmlDebugClient *> others = QQmlDebugTest::createOtherClients(m_connection.data()); m_connection->connectToHost(QLatin1String("127.0.0.1"), m_process->debugPort()); - QVERIFY(m_client); QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); foreach (QQmlDebugClient *other, others) @@ -106,99 +105,104 @@ void tst_QQmlInspector::startQmlsceneProcess(const char * /* qmlFile */, bool re qDeleteAll(others); } +void tst_QQmlInspector::checkAnimationSpeed(int targetMillisPerDegree) +{ + QString degreesString = QStringLiteral("degrees"); + QString millisecondsString = QStringLiteral("milliseconds"); + for (int i = 0; i < 2; ++i) { // skip one period; the change might have happened inside it + int position = m_process->output().length(); + while (!m_process->output().mid(position).contains(degreesString) || + !m_process->output().mid(position).contains(millisecondsString)) { + QVERIFY(QQmlDebugTest::waitForSignal(m_process.data(), + SIGNAL(readyReadStandardOutput()))); + } + } + + QStringList words = m_process->output().split(QLatin1Char(' ')); + int degreesMarker = words.lastIndexOf(degreesString); + QVERIFY(degreesMarker > 1); + double degrees = words[degreesMarker - 1].toDouble(); + int millisecondsMarker = words.lastIndexOf(millisecondsString); + QVERIFY(millisecondsMarker > 1); + int milliseconds = words[millisecondsMarker - 1].toInt(); + + double millisecondsPerDegree = milliseconds / degrees; + QVERIFY(millisecondsPerDegree > targetMillisPerDegree - 3); + QVERIFY(millisecondsPerDegree < targetMillisPerDegree + 3); + +} + void tst_QQmlInspector::cleanup() { if (QTest::currentTestFailed()) { qDebug() << "Process State:" << m_process->state(); qDebug() << "Application Output:" << m_process->output(); } - delete m_client; - m_client = 0; - delete m_connection; - m_connection = 0; - delete m_process; - m_process = 0; } void tst_QQmlInspector::connect_data() { + QTest::addColumn<QString>("file"); QTest::addColumn<bool>("restrictMode"); - QTest::newRow("unrestricted") << false; - QTest::newRow("restricted") << true; + QTest::newRow("rectangle/unrestricted") << "qtquick2.qml" << false; + QTest::newRow("rectangle/restricted") << "qtquick2.qml" << true; + QTest::newRow("window/unrestricted") << "window.qml" << false; + QTest::newRow("window/restricted") << "window.qml" << true; } void tst_QQmlInspector::connect() { + QFETCH(QString, file); QFETCH(bool, restrictMode); - startQmlsceneProcess("qtquick2.qml", restrictMode); -} - -void tst_QQmlInspector::showAppOnTop() -{ - startQmlsceneProcess("qtquick2.qml"); + startQmlProcess(file, restrictMode); QVERIFY(m_client); QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); - m_client->setShowAppOnTop(true); - QVERIFY(QQmlDebugTest::waitForSignal(m_client, SIGNAL(responseReceived()))); - QCOMPARE(m_client->m_requestResult, true); + int requestId = m_client->setInspectToolEnabled(true); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); - m_client->setShowAppOnTop(false); - QVERIFY(QQmlDebugTest::waitForSignal(m_client, SIGNAL(responseReceived()))); - QCOMPARE(m_client->m_requestResult, true); + requestId = m_client->setInspectToolEnabled(false); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); } -void tst_QQmlInspector::reloadQml() +void tst_QQmlInspector::showAppOnTop() { - startQmlsceneProcess("qtquick2.qml"); + startQmlProcess("qtquick2.qml"); QVERIFY(m_client); QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); - QByteArray fileContents; - - QFile file(testFile("changes.txt")); - if (file.open(QFile::ReadOnly)) - fileContents = file.readAll(); - file.close(); - - QHash<QString, QByteArray> changesHash; - changesHash.insert("qtquick2.qml", fileContents); - - m_client->reloadQml(changesHash); - QVERIFY(QQmlDebugTest::waitForSignal(m_client, SIGNAL(responseReceived()))); + int requestId = m_client->setShowAppOnTop(true); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); - QTRY_COMPARE(m_process->output().contains( - QString("version 2.0")), true); - - QCOMPARE(m_client->m_requestResult, true); - QCOMPARE(m_client->m_reloadRequestId, m_client->m_responseId); + requestId = m_client->setShowAppOnTop(false); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); } -void tst_QQmlInspector::reloadQmlWindow() +void tst_QQmlInspector::setAnimationSpeed() { - startQmlsceneProcess("window.qml"); + startQmlProcess("qtquick2.qml"); QVERIFY(m_client); QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); - - QByteArray fileContents; - - QFile file(testFile("changes.txt")); - if (file.open(QFile::ReadOnly)) - fileContents = file.readAll(); - file.close(); - - QHash<QString, QByteArray> changesHash; - changesHash.insert("window.qml", fileContents); - - m_client->reloadQml(changesHash); - QVERIFY(QQmlDebugTest::waitForSignal(m_client, SIGNAL(responseReceived()))); - - QEXPECT_FAIL("", "cannot debug with a QML file containing a top-level Window", Abort); // QTBUG-33376 - // TODO: remove the timeout once we don't expect it to fail anymore. - QTRY_VERIFY_WITH_TIMEOUT(m_process->output().contains(QString("version 2.0")), 1); - - QCOMPARE(m_client->m_requestResult, true); - QCOMPARE(m_client->m_reloadRequestId, m_client->m_responseId); + checkAnimationSpeed(10); + + int requestId = m_client->setAnimationSpeed(0.5); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); + checkAnimationSpeed(5); + + requestId = m_client->setAnimationSpeed(2.0); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); + checkAnimationSpeed(20); + + requestId = m_client->setAnimationSpeed(1.0); + QTRY_COMPARE(m_recipient->lastResponseId, requestId); + QVERIFY(m_recipient->lastResult); + checkAnimationSpeed(10); } QTEST_MAIN(tst_QQmlInspector) diff --git a/tests/auto/qml/debugger/shared/debugutil_p.h b/tests/auto/qml/debugger/shared/debugutil_p.h index d29bef4362..38e6cb2b12 100644 --- a/tests/auto/qml/debugger/shared/debugutil_p.h +++ b/tests/auto/qml/debugger/shared/debugutil_p.h @@ -130,4 +130,23 @@ private: int m_receivedBindErrors; }; +class QQmlInspectorResultRecipient : public QObject +{ + Q_OBJECT +public: + QQmlInspectorResultRecipient(QObject *parent = 0) : + QObject(parent), lastResponseId(-1), lastResult(false) {} + + int lastResponseId; + bool lastResult; + +public slots: + + void recordResponse(int requestId, bool result) + { + lastResponseId = requestId; + lastResult = result; + } +}; + #endif // DEBUGUTIL_P_H diff --git a/tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp b/tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp index 5fce58c17d..e313f75844 100644 --- a/tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp +++ b/tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp @@ -37,24 +37,78 @@ #include <private/qqmldebugconnection_p.h> #include <QtCore/qdebug.h> -void QQmlInspectorClient::setShowAppOnTop(bool showOnTop) +QQmlInspectorClient::QQmlInspectorClient(QQmlDebugConnection *connection) : + QQmlDebugClient(QLatin1String("QmlInspector"), connection), + m_lastRequestId(-1) +{ +} + +int QQmlInspectorClient::setInspectToolEnabled(bool enabled) { QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("request") << m_requestId++ + ds << QByteArray("request") << ++m_lastRequestId + << QByteArray(enabled ? "enable" : "disable"); + + sendMessage(ds.data()); + return m_lastRequestId; +} + +int QQmlInspectorClient::setShowAppOnTop(bool showOnTop) +{ + QPacket ds(connection()->currentDataStreamVersion()); + ds << QByteArray("request") << ++m_lastRequestId << QByteArray("showAppOnTop") << showOnTop; sendMessage(ds.data()); + return m_lastRequestId; } -void QQmlInspectorClient::reloadQml(const QHash<QString, QByteArray> &changesHash) +int QQmlInspectorClient::setAnimationSpeed(qreal speed) { QPacket ds(connection()->currentDataStreamVersion()); - m_reloadRequestId = m_requestId; + ds << QByteArray("request") << ++m_lastRequestId + << QByteArray("setAnimationSpeed") << speed; - ds << QByteArray("request") << m_requestId++ - << QByteArray("reload") << changesHash; + sendMessage(ds.data()); + return m_lastRequestId; +} +int QQmlInspectorClient::select(const QList<int> &objectIds) +{ + QPacket ds(connection()->currentDataStreamVersion()); + ds << QByteArray("request") << ++m_lastRequestId + << QByteArray("select") << objectIds; + + sendMessage(ds.data()); + return m_lastRequestId; +} + +int QQmlInspectorClient::createObject(const QString &qml, int parentId, const QStringList &imports, + const QString &filename) +{ + QPacket ds(connection()->currentDataStreamVersion()); + ds << QByteArray("request") << ++m_lastRequestId + << QByteArray("createObject") << qml << parentId << imports << filename; + sendMessage(ds.data()); + return m_lastRequestId; +} + +int QQmlInspectorClient::moveObject(int childId, int newParentId) +{ + QPacket ds(connection()->currentDataStreamVersion()); + ds << QByteArray("request") << ++m_lastRequestId + << QByteArray("moveObject") << childId << newParentId; + sendMessage(ds.data()); + return m_lastRequestId; +} + +int QQmlInspectorClient::destroyObject(int objectId) +{ + QPacket ds(connection()->currentDataStreamVersion()); + ds << QByteArray("request") << ++m_lastRequestId + << QByteArray("destroyObject") << objectId; sendMessage(ds.data()); + return m_lastRequestId; } void QQmlInspectorClient::messageReceived(const QByteArray &message) @@ -68,7 +122,8 @@ void QQmlInspectorClient::messageReceived(const QByteArray &message) return; } - m_requestResult = false; - ds >> m_responseId >> m_requestResult; - emit responseReceived(); + int responseId; + bool result; + ds >> responseId >> result; + emit responseReceived(responseId, result); } diff --git a/tests/auto/qml/debugger/shared/qqmlinspectorclient.h b/tests/auto/qml/debugger/shared/qqmlinspectorclient.h index 964dac7701..9306ef3e79 100644 --- a/tests/auto/qml/debugger/shared/qqmlinspectorclient.h +++ b/tests/auto/qml/debugger/shared/qqmlinspectorclient.h @@ -40,32 +40,25 @@ class QQmlInspectorClient : public QQmlDebugClient Q_OBJECT public: - QQmlInspectorClient(QQmlDebugConnection *connection) - : QQmlDebugClient(QLatin1String("QmlInspector"), connection) - , m_showAppOnTop(false) - , m_requestId(0) - , m_requestResult(false) - , m_responseId(-1) - { - } + QQmlInspectorClient(QQmlDebugConnection *connection); - void setShowAppOnTop(bool showOnTop); - void reloadQml(const QHash<QString, QByteArray> &changesHash); + int setInspectToolEnabled(bool enabled); + int setShowAppOnTop(bool showOnTop); + int setAnimationSpeed(qreal speed); + int select(const QList<int> &objectIds); + int createObject(const QString &qml, int parentId, const QStringList &imports, + const QString &filename); + int moveObject(int childId, int newParentId); + int destroyObject(int objectId); signals: - void responseReceived(); + void responseReceived(int requestId, bool result); protected: void messageReceived(const QByteArray &message); private: - bool m_showAppOnTop; - int m_requestId; - -public: - bool m_requestResult; - int m_responseId; - int m_reloadRequestId; + int m_lastRequestId; }; #endif // QQMLINSPECTORCLIENT_H |