summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAurindam Jana <aurindam.jana@digia.com>2012-11-22 17:29:53 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-11-27 17:03:35 +0100
commit70579cf5f1b82460443b764aef1f2d2b23732acd (patch)
treef1ebdf69b9346dae6b3daef348d85cf5215fe052
parented0616b199dde58c8c87097dce31128dd0bfb5b8 (diff)
QtQuick1: Fix ObserverMode
Although ObserverMode was enabled, the messages to the plugin were not delivered and hence the feature did not work. Change-Id: I58ec83a4ee727b32833c011a4942cde0cd6a02c8 Reviewed-by: Christiaan Janssen <christiaan.janssen@digia.com>
-rw-r--r--src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.cpp2
-rw-r--r--src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.h5
-rw-r--r--tests/auto/declarative/declarative.pro1
-rw-r--r--tests/auto/declarative/qdeclarativedebugobservermode/app/app.pro18
-rw-r--r--tests/auto/declarative/qdeclarativedebugobservermode/app/main.cpp63
-rw-r--r--tests/auto/declarative/qdeclarativedebugobservermode/app/mainwindow.cpp27
-rw-r--r--tests/auto/declarative/qdeclarativedebugobservermode/app/mainwindow.h19
-rw-r--r--tests/auto/declarative/qdeclarativedebugobservermode/data/qtquick1.qml5
-rw-r--r--tests/auto/declarative/qdeclarativedebugobservermode/qdeclarativedebugobservermode.pro4
-rw-r--r--tests/auto/declarative/qdeclarativedebugobservermode/tst_qdeclarativedebugobservermode.cpp244
-rw-r--r--tests/auto/declarative/qdeclarativedebugobservermode/tst_qdeclarativedebugobservermode.pro21
11 files changed, 407 insertions, 2 deletions
diff --git a/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.cpp b/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.cpp
index 9d0cee64..1920e802 100644
--- a/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.cpp
+++ b/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.cpp
@@ -63,6 +63,8 @@ AbstractViewInspector::AbstractViewInspector(QObject *parent) :
m_slowDownFactor(1.0),
m_debugService(QDeclarativeInspectorService::instance())
{
+ connect(m_debugService, SIGNAL(gotMessage(QByteArray)),
+ this, SLOT(handleMessage(QByteArray)));
}
void AbstractViewInspector::createQmlObject(const QString &qml, QObject *parent,
diff --git a/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.h b/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.h
index 642ffb50..171740ca 100644
--- a/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.h
+++ b/src/plugins/qmltooling/qmldbg_inspector/abstractviewinspector.h
@@ -72,8 +72,6 @@ class AbstractViewInspector : public QObject
public:
explicit AbstractViewInspector(QObject *parent = 0);
- void handleMessage(const QByteArray &message);
-
void createQmlObject(const QString &qml, QObject *parent,
const QStringList &importList,
const QString &filename = QString());
@@ -102,6 +100,9 @@ public:
virtual void setWindowFlags(Qt::WindowFlags flags) = 0;
virtual QDeclarativeEngine *declarativeEngine() const = 0;
+public slots:
+ void handleMessage(const QByteArray &message);
+
signals:
void designModeBehaviorChanged(bool inDesignMode);
void showAppOnTopChanged(bool showAppOnTop);
diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro
index 26304efd..dbadbad5 100644
--- a/tests/auto/declarative/declarative.pro
+++ b/tests/auto/declarative/declarative.pro
@@ -36,6 +36,7 @@ contains(QT_CONFIG, private_tests) {
qdeclarativedebugclient \
qdeclarativedebugservice \
qdeclarativedebugjs \
+ qdeclarativedebugobservermode \
qdeclarativedom \
qdeclarativeecmascript \
qdeclarativeflickable \
diff --git a/tests/auto/declarative/qdeclarativedebugobservermode/app/app.pro b/tests/auto/declarative/qdeclarativedebugobservermode/app/app.pro
new file mode 100644
index 00000000..3c7ed484
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativedebugobservermode/app/app.pro
@@ -0,0 +1,18 @@
+TEMPLATE = app
+
+QT += declarative declarative-private gui widgets
+CONFIG += declarative_debug
+
+CONFIG += console
+CONFIG -= app_bundle
+
+DESTDIR = ./
+
+INSTALLS =
+
+SOURCES += main.cpp \
+ mainwindow.cpp
+DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+
+HEADERS += \
+ mainwindow.h
diff --git a/tests/auto/declarative/qdeclarativedebugobservermode/app/main.cpp b/tests/auto/declarative/qdeclarativedebugobservermode/app/main.cpp
new file mode 100644
index 00000000..7769e3ac
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativedebugobservermode/app/main.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QApplication>
+#include <QDebug>
+#include <QDeclarativeComponent>
+#include <QDeclarativeEngine>
+#include <QStringList>
+#include <QtDeclarative/private/qdeclarativedebugservice_p.h>
+
+#include "mainwindow.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ const QUrl path = QUrl::fromLocalFile(app.arguments().last());
+
+ MainWindow window;
+
+ if (!window.loadQML(path)) {
+ return -1;
+ }
+ return app.exec();
+}
diff --git a/tests/auto/declarative/qdeclarativedebugobservermode/app/mainwindow.cpp b/tests/auto/declarative/qdeclarativedebugobservermode/app/mainwindow.cpp
new file mode 100644
index 00000000..d6399d81
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativedebugobservermode/app/mainwindow.cpp
@@ -0,0 +1,27 @@
+#include "mainwindow.h"
+
+#include <QDeclarativeError>
+#include <QDebug>
+
+MainWindow::MainWindow(QWidget *parent) :
+ QMainWindow(parent)
+{
+}
+
+MainWindow::~MainWindow()
+{
+ delete m_view;
+}
+
+bool MainWindow::loadQML(const QUrl &source)
+{
+ m_view = new QDeclarativeView(source, this);
+ if (m_view->status() == QDeclarativeView::Error) {
+ QList<QDeclarativeError> errors = m_view->errors();
+ foreach (const QDeclarativeError &error, errors) {
+ qWarning() << error.toString();
+ }
+ return false;
+ }
+ return true;
+}
diff --git a/tests/auto/declarative/qdeclarativedebugobservermode/app/mainwindow.h b/tests/auto/declarative/qdeclarativedebugobservermode/app/mainwindow.h
new file mode 100644
index 00000000..4eeba4ca
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativedebugobservermode/app/mainwindow.h
@@ -0,0 +1,19 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+#include <QDeclarativeView>
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+public:
+ explicit MainWindow(QWidget *parent = 0);
+ ~MainWindow();
+ bool loadQML(const QUrl &source);
+
+private:
+ QDeclarativeView *m_view;
+};
+
+#endif // MAINWINDOW_H
diff --git a/tests/auto/declarative/qdeclarativedebugobservermode/data/qtquick1.qml b/tests/auto/declarative/qdeclarativedebugobservermode/data/qtquick1.qml
new file mode 100644
index 00000000..3e0e826f
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativedebugobservermode/data/qtquick1.qml
@@ -0,0 +1,5 @@
+import QtQuick 1.0
+
+Rectangle {
+}
+
diff --git a/tests/auto/declarative/qdeclarativedebugobservermode/qdeclarativedebugobservermode.pro b/tests/auto/declarative/qdeclarativedebugobservermode/qdeclarativedebugobservermode.pro
new file mode 100644
index 00000000..7eac3c59
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativedebugobservermode/qdeclarativedebugobservermode.pro
@@ -0,0 +1,4 @@
+TEMPLATE = subdirs
+
+SUBDIRS = tst_qdeclarativedebugobservermode.pro \
+ app
diff --git a/tests/auto/declarative/qdeclarativedebugobservermode/tst_qdeclarativedebugobservermode.cpp b/tests/auto/declarative/qdeclarativedebugobservermode/tst_qdeclarativedebugobservermode.cpp
new file mode 100644
index 00000000..ef2a492e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativedebugobservermode/tst_qdeclarativedebugobservermode.cpp
@@ -0,0 +1,244 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <qdeclarativedatatest.h>
+#include <QtDeclarative/private/qdeclarativedebugclient_p.h>
+#include <QtCore/QFileInfo>
+#include <QtCore/QDir>
+#include <QtCore/QProcess>
+#include "../shared/debugutil_p.h"
+
+class QDeclarativeObserverModeClient : public QDeclarativeDebugClient
+{
+ Q_OBJECT
+public:
+ enum Message {
+ AnimationSpeedChanged = 0,
+ AnimationPausedChanged = 19, // highest value
+ ChangeTool = 1,
+ ClearComponentCache = 2,
+ ColorChanged = 3,
+ CreateObject = 5,
+ CurrentObjectsChanged = 6,
+ DestroyObject = 7,
+ MoveObject = 8,
+ ObjectIdList = 9,
+ Reload = 10,
+ Reloaded = 11,
+ SetAnimationSpeed = 12,
+ SetAnimationPaused = 18,
+ SetCurrentObjects = 14,
+ SetDesignMode = 15,
+ ShowAppOnTop = 16,
+ ToolChanged = 17
+ };
+
+ QDeclarativeObserverModeClient(QDeclarativeDebugConnection *connection) : QDeclarativeDebugClient(QLatin1String("QDeclarativeObserverMode"), connection) {}
+
+ void setDesignMode(bool set)
+ {
+ QByteArray message;
+ QDataStream ds(&message, QIODevice::WriteOnly);
+ ds << SetDesignMode << set;
+
+ sendMessage(message);
+ }
+
+ Message msg;
+
+signals:
+ void statusHasChanged();
+ void responseReceived();
+
+protected:
+ virtual void statusChanged(Status status);
+ virtual void messageReceived(const QByteArray &data);
+};
+
+class QJSDebugProcess : public QObject
+{
+ Q_OBJECT
+public:
+ QJSDebugProcess();
+ ~QJSDebugProcess();
+
+ void start(const QString &binary, const QStringList &arguments);
+ bool waitForStarted();
+
+private slots:
+ void processAppOutput();
+
+private:
+ QProcess m_process;
+ QTimer m_timer;
+ QEventLoop m_eventLoop;
+ bool m_started;
+};
+
+class tst_QDeclarativeDebugObserverMode : public QDeclarativeDataTest
+{
+ Q_OBJECT
+private:
+ QDeclarativeDebugConnection *m_conn;
+ QDeclarativeEngine *m_engine;
+ QDeclarativeObserverModeClient *m_client;
+
+private slots:
+ void initTestCase();
+ void setDesignMode();
+
+private:
+ QString m_binary;
+};
+
+void QDeclarativeObserverModeClient::statusChanged(Status /*status*/)
+{
+ emit statusHasChanged();
+}
+
+void QDeclarativeObserverModeClient::messageReceived(const QByteArray &data)
+{
+ QByteArray rwData = data;
+ QDataStream stream(&rwData, QIODevice::ReadOnly);
+
+ int type;
+ stream >> type;
+ msg = (Message)type;
+ if (msg != ToolChanged)
+ emit responseReceived();
+}
+
+QJSDebugProcess::QJSDebugProcess()
+ : m_started(false)
+{
+ m_process.setProcessChannelMode(QProcess::MergedChannels);
+ connect(&m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(processAppOutput()));
+ connect(&m_timer, SIGNAL(timeout()), &m_eventLoop, SLOT(quit()));
+ m_timer.setSingleShot(true);
+ m_timer.setInterval(5000);
+ QStringList environment = QProcess::systemEnvironment();
+ m_process.setEnvironment(environment);
+}
+
+QJSDebugProcess::~QJSDebugProcess()
+{
+ if (m_process.state() != QProcess::NotRunning) {
+ m_process.kill();
+ m_process.waitForFinished(5000);
+ }
+}
+
+void QJSDebugProcess::start(const QString &binary, const QStringList &arguments)
+{
+ m_process.start(binary, arguments);
+ QVERIFY2(m_process.waitForStarted(),
+ qPrintable(QString::fromLatin1("Unable to launch %1: %2").arg(binary, m_process.errorString())));
+ m_timer.start();
+}
+
+bool QJSDebugProcess::waitForStarted()
+{
+ m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
+
+ return m_started;
+}
+
+void QJSDebugProcess::processAppOutput()
+{
+ const QString appOutput = m_process.readAll();
+ static QRegExp newline("[\n\r]{1,2}");
+ QStringList lines = appOutput.split(newline);
+ foreach (const QString &line, lines) {
+ if (line.isEmpty())
+ continue;
+ if (line.startsWith("Qml debugging is enabled")) // ignore
+ continue;
+ if (line.startsWith("QDeclarativeDebugServer:")) {
+ if (line.contains("Waiting for connection ")) {
+ m_started = true;
+ m_eventLoop.quit();
+ continue;
+ }
+ if (line.contains("Connection established")) {
+ continue;
+ }
+ }
+ qDebug() << line;
+ }
+}
+
+void tst_QDeclarativeDebugObserverMode::initTestCase()
+{
+ QDeclarativeDataTest::initTestCase();
+ const QString appFolder = QFINDTESTDATA("app");
+ QVERIFY2(!appFolder.isEmpty(), qPrintable(QString::fromLatin1("Unable to locate app folder from %1").arg(QDir::currentPath())));
+ m_binary = appFolder + QStringLiteral("/app");
+#ifdef Q_OS_WIN
+ m_binary += QStringLiteral(".exe");
+#endif // Q_OS_WIN
+ const QFileInfo fi(m_binary);
+ QVERIFY2(fi.isExecutable(), qPrintable(QString::fromLatin1("%1 is not executable.").arg(m_binary)));
+}
+
+void tst_QDeclarativeDebugObserverMode::setDesignMode()
+{
+ QJSDebugProcess process;
+ process.start(m_binary, QStringList() << "-qmljsdebugger=port:3771"
+ << QDeclarativeDataTest::instance()->testFile("qtquick1.qml"));
+ QVERIFY(process.waitForStarted());
+
+ QDeclarativeDebugConnection connection;
+ connection.connectToHost("127.0.0.1", 3771);
+ QVERIFY(connection.waitForConnected());
+
+ QDeclarativeObserverModeClient client(&connection);
+ QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged())));
+ QCOMPARE(client.status(), QDeclarativeObserverModeClient::Enabled);
+
+ client.setDesignMode(true);
+ QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(responseReceived())));
+ QCOMPARE(client.msg, QDeclarativeObserverModeClient::SetDesignMode);
+}
+
+QTEST_MAIN(tst_QDeclarativeDebugObserverMode)
+
+#include "tst_qdeclarativedebugobservermode.moc"
diff --git a/tests/auto/declarative/qdeclarativedebugobservermode/tst_qdeclarativedebugobservermode.pro b/tests/auto/declarative/qdeclarativedebugobservermode/tst_qdeclarativedebugobservermode.pro
new file mode 100644
index 00000000..5c3aaf03
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativedebugobservermode/tst_qdeclarativedebugobservermode.pro
@@ -0,0 +1,21 @@
+CONFIG += testcase
+TARGET = tst_qdeclarativedebugobservermode
+
+QT += testlib
+contains(QT_CONFIG,declarative): QT += declarative declarative-private network script core-private gui-private widgets-private
+macx:CONFIG -= app_bundle
+
+HEADERS += ../shared/debugutil_p.h
+
+SOURCES += tst_qdeclarativedebugobservermode.cpp \
+ ../shared/debugutil.cpp
+
+include(../shared/qdeclarativedatatest.pri)
+
+# QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage
+# LIBS += -lgcov
+
+OTHER_FILES = data/qtquick1.qml
+
+CONFIG += parallel_test
+DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0