From 70579cf5f1b82460443b764aef1f2d2b23732acd Mon Sep 17 00:00:00 2001 From: Aurindam Jana Date: Thu, 22 Nov 2012 17:29:53 +0100 Subject: 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 --- .../qmldbg_inspector/abstractviewinspector.cpp | 2 + .../qmldbg_inspector/abstractviewinspector.h | 5 +- tests/auto/declarative/declarative.pro | 1 + .../qdeclarativedebugobservermode/app/app.pro | 18 ++ .../qdeclarativedebugobservermode/app/main.cpp | 63 ++++++ .../app/mainwindow.cpp | 27 +++ .../qdeclarativedebugobservermode/app/mainwindow.h | 19 ++ .../data/qtquick1.qml | 5 + .../qdeclarativedebugobservermode.pro | 4 + .../tst_qdeclarativedebugobservermode.cpp | 244 +++++++++++++++++++++ .../tst_qdeclarativedebugobservermode.pro | 21 ++ 11 files changed, 407 insertions(+), 2 deletions(-) create mode 100644 tests/auto/declarative/qdeclarativedebugobservermode/app/app.pro create mode 100644 tests/auto/declarative/qdeclarativedebugobservermode/app/main.cpp create mode 100644 tests/auto/declarative/qdeclarativedebugobservermode/app/mainwindow.cpp create mode 100644 tests/auto/declarative/qdeclarativedebugobservermode/app/mainwindow.h create mode 100644 tests/auto/declarative/qdeclarativedebugobservermode/data/qtquick1.qml create mode 100644 tests/auto/declarative/qdeclarativedebugobservermode/qdeclarativedebugobservermode.pro create mode 100644 tests/auto/declarative/qdeclarativedebugobservermode/tst_qdeclarativedebugobservermode.cpp create mode 100644 tests/auto/declarative/qdeclarativedebugobservermode/tst_qdeclarativedebugobservermode.pro 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 +#include +#include +#include +#include +#include + +#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 +#include + +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 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 +#include + +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 +#include +#include +#include +#include +#include +#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 -- cgit v1.2.3