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/qqmlinspector | |
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/qqmlinspector')
4 files changed, 130 insertions, 93 deletions
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) |