aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/debugger
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@theqtcompany.com>2015-11-19 17:14:23 +0100
committerSimon Hausmann <simon.hausmann@theqtcompany.com>2016-01-12 18:00:47 +0000
commit258638f3726f63b308b6275090b1dad596f4fb56 (patch)
treecbbcfe5772a90b8e2dd0cfe493be465f9bc2003f /tests/auto/qml/debugger
parent11bd376d1399faff71ff17af9ee10f61b959901b (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')
-rw-r--r--tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/data/qtquick2.qml13
-rw-r--r--tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp154
-rw-r--r--tests/auto/qml/debugger/qqmlinspector/data/changes.txt8
-rw-r--r--tests/auto/qml/debugger/qqmlinspector/data/qtquick2.qml41
-rw-r--r--tests/auto/qml/debugger/qqmlinspector/data/window.qml2
-rw-r--r--tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp172
-rw-r--r--tests/auto/qml/debugger/shared/debugutil_p.h19
-rw-r--r--tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp73
-rw-r--r--tests/auto/qml/debugger/shared/qqmlinspectorclient.h29
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