QmlEngineDebugClient: Simplify the client and utility classes

Change-Id: I86033bdbdef94c6f17e706f8e13ce390969171c6
Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
This commit is contained in:
Aurindam Jana
2012-03-07 16:19:55 +01:00
parent 8966d82af3
commit 4cd2e32659
15 changed files with 526 additions and 1316 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -40,256 +40,157 @@
namespace QmlJsDebugClient { namespace QmlJsDebugClient {
class QDeclarativeDebugConnection; class QDeclarativeDebugConnection;
class QDeclarativeDebugWatch; class QmlDebugPropertyReference;
class QDeclarativeDebugPropertyWatch; class QmlDebugContextReference;
class QDeclarativeDebugObjectExpressionWatch; class QmlDebugObjectReference;
class QDeclarativeDebugEnginesQuery; class QmlDebugFileReference;
class QDeclarativeDebugRootContextQuery; class QmlDebugEngineReference;
class QDeclarativeDebugObjectQuery;
class QDeclarativeDebugExpressionQuery;
class QDeclarativeDebugPropertyReference;
class QDeclarativeDebugContextReference;
class QDeclarativeDebugObjectReference;
class QDeclarativeDebugFileReference;
class QDeclarativeDebugEngineReference;
class QmlEngineDebugClientPrivate;
class QMLJSDEBUGCLIENT_EXPORT QmlEngineDebugClient : public QDeclarativeDebugClient class QMLJSDEBUGCLIENT_EXPORT QmlEngineDebugClient : public QDeclarativeDebugClient
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit QmlEngineDebugClient(QDeclarativeDebugConnection *); QmlEngineDebugClient(QDeclarativeDebugConnection *conn);
~QmlEngineDebugClient();
QDeclarativeDebugPropertyWatch *addWatch(const QDeclarativeDebugPropertyReference &, quint32 addWatch(const QmlDebugPropertyReference &property);
QObject *parent = 0); quint32 addWatch(const QmlDebugContextReference &context, const QString &id);
QDeclarativeDebugWatch *addWatch(const QDeclarativeDebugContextReference &, const QString &, quint32 addWatch(const QmlDebugObjectReference &object, const QString &expr);
QObject *parent = 0); quint32 addWatch(const QmlDebugObjectReference &object);
QDeclarativeDebugObjectExpressionWatch *addWatch(const QDeclarativeDebugObjectReference &, const QString &, quint32 addWatch(const QmlDebugFileReference &file);
QObject *parent = 0);
QDeclarativeDebugWatch *addWatch(const QDeclarativeDebugObjectReference &,
QObject *parent = 0);
QDeclarativeDebugWatch *addWatch(const QDeclarativeDebugFileReference &,
QObject *parent = 0);
void removeWatch(QDeclarativeDebugWatch *watch); void removeWatch(quint32 watch);
QDeclarativeDebugEnginesQuery *queryAvailableEngines(QObject *parent = 0); quint32 queryAvailableEngines();
QDeclarativeDebugRootContextQuery *queryRootContexts(const QDeclarativeDebugEngineReference &, quint32 queryRootContexts(const QmlDebugEngineReference &context);
QObject *parent = 0); quint32 queryObject(const QmlDebugObjectReference &object);
QDeclarativeDebugObjectQuery *queryObject(const QDeclarativeDebugObjectReference &, quint32 queryObjectRecursive(const QmlDebugObjectReference &object);
QObject *parent = 0); quint32 queryExpressionResult(int objectDebugId,
QDeclarativeDebugObjectQuery *queryObjectRecursive(const QDeclarativeDebugObjectReference &, const QString &expr);
QObject *parent = 0); quint32 setBindingForObject(int objectDebugId, const QString &propertyName,
QDeclarativeDebugExpressionQuery *queryExpressionResult(int objectDebugId, const QVariant &bindingExpression,
const QString &expr, bool isLiteralValue,
QObject *parent = 0); QString source, int line);
bool setBindingForObject(int objectDebugId, const QString &propertyName, quint32 resetBindingForObject(int objectDebugId,
const QVariant &bindingExpression, bool isLiteralValue, const QString &propertyName);
QString source = QString(), int line = -1); quint32 setMethodBody(int objectDebugId, const QString &methodName,
bool resetBindingForObject(int objectDebugId, const QString &propertyName); const QString &methodBody);
bool setMethodBody(int objectDebugId, const QString &methodName, const QString &methodBody);
QmlEngineDebugClientPrivate *priv() const { return d; } signals:
Q_SIGNALS:
void newObjects();
void newStatus(QDeclarativeDebugClient::Status status); void newStatus(QDeclarativeDebugClient::Status status);
void newObjects();
void valueChanged(int debugId, const QByteArray &name,
const QVariant &value);
void result(quint32 queryId, const QVariant &result);
protected: protected:
virtual void statusChanged(Status status); virtual void statusChanged(Status status);
virtual void messageReceived(const QByteArray &); virtual void messageReceived(const QByteArray &);
private: private:
friend class QmlEngineDebugClientPrivate; quint32 getId() { return m_nextId++; }
QmlEngineDebugClientPrivate *d;
void decode(QDataStream &d, QmlDebugContextReference &context);
void decode(QDataStream &d, QmlDebugObjectReference &object, bool simple);
private:
quint32 m_nextId;
}; };
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugWatch : public QObject class QmlDebugFileReference
{ {
Q_OBJECT
public: public:
enum State { Waiting, Active, Inactive, Dead }; QmlDebugFileReference() : m_lineNumber(-1), m_columnNumber(-1) {}
QDeclarativeDebugWatch(QObject *); QUrl url() const { return m_url; }
~QDeclarativeDebugWatch(); int lineNumber() const { return m_lineNumber; }
int columnNumber() const { return m_columnNumber; }
int queryId() const;
int objectDebugId() const;
State state() const;
Q_SIGNALS:
void stateChanged(QDeclarativeDebugWatch::State);
//void objectChanged(int, const QDeclarativeDebugObjectReference &);
//void valueChanged(int, const QVariant &);
// Server sends value as string if it is a user-type variant
void valueChanged(const QByteArray &name, const QVariant &value);
private: private:
friend class QmlEngineDebugClient; friend class QmlEngineDebugClient;
friend class QmlEngineDebugClientPrivate;
void setState(State);
State m_state;
int m_queryId;
QmlEngineDebugClient *m_client;
int m_objectDebugId;
};
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugPropertyWatch : public QDeclarativeDebugWatch
{
Q_OBJECT
public:
QDeclarativeDebugPropertyWatch(QObject *parent);
QString name() const;
private:
friend class QmlEngineDebugClient;
QString m_name;
};
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugObjectExpressionWatch : public QDeclarativeDebugWatch
{
Q_OBJECT
public:
QDeclarativeDebugObjectExpressionWatch(QObject *parent);
QString expression() const;
private:
friend class QmlEngineDebugClient;
QString m_expr;
int m_debugId;
};
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugQuery : public QObject
{
Q_OBJECT
public:
enum State { Waiting, Error, Completed };
State state() const;
bool isWaiting() const;
Q_SIGNALS:
void stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State);
protected:
QDeclarativeDebugQuery(QObject *);
private:
friend class QmlEngineDebugClient;
friend class QmlEngineDebugClientPrivate;
void setState(State);
State m_state;
};
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugFileReference
{
public:
QDeclarativeDebugFileReference();
QDeclarativeDebugFileReference(const QDeclarativeDebugFileReference &);
QDeclarativeDebugFileReference &operator=(const QDeclarativeDebugFileReference &);
QUrl url() const;
void setUrl(const QUrl &);
int lineNumber() const;
void setLineNumber(int);
int columnNumber() const;
void setColumnNumber(int);
private:
friend class QmlEngineDebugClientPrivate;
QUrl m_url; QUrl m_url;
int m_lineNumber; int m_lineNumber;
int m_columnNumber; int m_columnNumber;
}; };
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugEngineReference class QmlDebugEngineReference
{ {
public: public:
QDeclarativeDebugEngineReference(); QmlDebugEngineReference() : m_debugId(-1) {}
QDeclarativeDebugEngineReference(int); QmlDebugEngineReference(int id) : m_debugId(id) {}
QDeclarativeDebugEngineReference(const QDeclarativeDebugEngineReference &);
QDeclarativeDebugEngineReference &operator=(const QDeclarativeDebugEngineReference &);
int debugId() const; int debugId() const { return m_debugId; }
QString name() const; QString name() const { return m_name; }
private: private:
friend class QmlEngineDebugClientPrivate; friend class QmlEngineDebugClient;
int m_debugId; int m_debugId;
QString m_name; QString m_name;
}; };
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugObjectReference typedef QList<QmlDebugEngineReference> QmlDebugEngineReferenceList;
class QmlDebugObjectReference
{ {
public: public:
QDeclarativeDebugObjectReference(); QmlDebugObjectReference() : m_debugId(-1), m_contextDebugId(-1) {}
QDeclarativeDebugObjectReference(int); QmlDebugObjectReference(int id) : m_debugId(id), m_contextDebugId(-1) {}
QDeclarativeDebugObjectReference(const QDeclarativeDebugObjectReference &);
QDeclarativeDebugObjectReference &operator=(const QDeclarativeDebugObjectReference &);
int debugId() const; int debugId() const { return m_debugId; }
QString className() const; QString className() const { return m_className; }
QString idString() const; QString idString() const { return m_idString; }
QString name() const; QString name() const { return m_name; }
QDeclarativeDebugFileReference source() const; QmlDebugFileReference source() const { return m_source; }
int contextDebugId() const; int contextDebugId() const { return m_contextDebugId; }
QList<QDeclarativeDebugPropertyReference> properties() const; QList<QmlDebugPropertyReference> properties() const { return m_properties; }
QList<QDeclarativeDebugObjectReference> children() const; QList<QmlDebugObjectReference> children() const { return m_children; }
private: private:
friend class QmlEngineDebugClientPrivate; friend class QmlEngineDebugClient;
int m_debugId; int m_debugId;
QString m_class; QString m_className;
QString m_idString; QString m_idString;
QString m_name; QString m_name;
QDeclarativeDebugFileReference m_source; QmlDebugFileReference m_source;
int m_contextDebugId; int m_contextDebugId;
QList<QDeclarativeDebugPropertyReference> m_properties; QList<QmlDebugPropertyReference> m_properties;
QList<QDeclarativeDebugObjectReference> m_children; QList<QmlDebugObjectReference> m_children;
}; };
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugContextReference class QmlDebugContextReference
{ {
public: public:
QDeclarativeDebugContextReference(); QmlDebugContextReference() : m_debugId(-1) {}
QDeclarativeDebugContextReference(const QDeclarativeDebugContextReference &);
QDeclarativeDebugContextReference &operator=(const QDeclarativeDebugContextReference &);
int debugId() const; int debugId() const { return m_debugId; }
QString name() const; QString name() const { return m_name; }
QList<QDeclarativeDebugObjectReference> objects() const; QList<QmlDebugObjectReference> objects() const { return m_objects; }
QList<QDeclarativeDebugContextReference> contexts() const; QList<QmlDebugContextReference> contexts() const { return m_contexts; }
private: private:
friend class QmlEngineDebugClientPrivate; friend class QmlEngineDebugClient;
int m_debugId; int m_debugId;
QString m_name; QString m_name;
QList<QDeclarativeDebugObjectReference> m_objects; QList<QmlDebugObjectReference> m_objects;
QList<QDeclarativeDebugContextReference> m_contexts; QList<QmlDebugContextReference> m_contexts;
}; };
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugPropertyReference class QmlDebugPropertyReference
{ {
public: public:
QDeclarativeDebugPropertyReference(); QmlDebugPropertyReference() : m_objectDebugId(-1), m_hasNotifySignal(false) {}
QDeclarativeDebugPropertyReference(const QDeclarativeDebugPropertyReference &);
QDeclarativeDebugPropertyReference &operator=(const QDeclarativeDebugPropertyReference &);
int objectDebugId() const; int debugId() const { return m_objectDebugId; }
QString name() const; QString name() const { return m_name; }
QVariant value() const; QVariant value() const { return m_value; }
QString valueTypeName() const; QString valueTypeName() const { return m_valueTypeName; }
QString binding() const; QString binding() const { return m_binding; }
bool hasNotifySignal() const; bool hasNotifySignal() const { return m_hasNotifySignal; }
private: private:
friend class QmlEngineDebugClientPrivate; friend class QmlEngineDebugClient;
int m_objectDebugId; int m_objectDebugId;
QString m_name; QString m_name;
QVariant m_value; QVariant m_value;
@@ -298,75 +199,11 @@ private:
bool m_hasNotifySignal; bool m_hasNotifySignal;
}; };
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugEnginesQuery : public QDeclarativeDebugQuery
{
Q_OBJECT
public:
virtual ~QDeclarativeDebugEnginesQuery();
QList<QDeclarativeDebugEngineReference> engines() const;
private:
friend class QmlEngineDebugClient;
friend class QmlEngineDebugClientPrivate;
QDeclarativeDebugEnginesQuery(QObject *);
QmlEngineDebugClient *m_client;
int m_queryId;
QList<QDeclarativeDebugEngineReference> m_engines;
};
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugRootContextQuery : public QDeclarativeDebugQuery
{
Q_OBJECT
public:
virtual ~QDeclarativeDebugRootContextQuery();
QDeclarativeDebugContextReference rootContext() const;
private:
friend class QmlEngineDebugClient;
friend class QmlEngineDebugClientPrivate;
QDeclarativeDebugRootContextQuery(QObject *);
QmlEngineDebugClient *m_client;
int m_queryId;
QDeclarativeDebugContextReference m_context;
};
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugObjectQuery : public QDeclarativeDebugQuery
{
Q_OBJECT
public:
virtual ~QDeclarativeDebugObjectQuery();
QDeclarativeDebugObjectReference object() const;
private:
friend class QmlEngineDebugClient;
friend class QmlEngineDebugClientPrivate;
QDeclarativeDebugObjectQuery(QObject *);
QmlEngineDebugClient *m_client;
int m_queryId;
QDeclarativeDebugObjectReference m_object;
};
class QMLJSDEBUGCLIENT_EXPORT QDeclarativeDebugExpressionQuery : public QDeclarativeDebugQuery
{
Q_OBJECT
public:
virtual ~QDeclarativeDebugExpressionQuery();
QVariant expression() const;
QVariant result() const;
private:
friend class QmlEngineDebugClient;
friend class QmlEngineDebugClientPrivate;
QDeclarativeDebugExpressionQuery(QObject *);
QmlEngineDebugClient *m_client;
int m_queryId;
QVariant m_expr;
QVariant m_result;
};
} // namespace QmlJsDebugClient } // namespace QmlJsDebugClient
Q_DECLARE_METATYPE(QmlJsDebugClient::QDeclarativeDebugEngineReference) Q_DECLARE_METATYPE(QmlJsDebugClient::QmlDebugObjectReference)
Q_DECLARE_METATYPE(QmlJsDebugClient::QDeclarativeDebugObjectReference) Q_DECLARE_METATYPE(QmlJsDebugClient::QmlDebugEngineReference)
Q_DECLARE_METATYPE(QmlJsDebugClient::QDeclarativeDebugContextReference) Q_DECLARE_METATYPE(QmlJsDebugClient::QmlDebugEngineReferenceList)
Q_DECLARE_METATYPE(QmlJsDebugClient::QDeclarativeDebugPropertyReference) Q_DECLARE_METATYPE(QmlJsDebugClient::QmlDebugContextReference)
#endif // QMLENGINEDEBUGCLIENT_H #endif // QMLENGINEDEBUGCLIENT_H

View File

@@ -311,7 +311,17 @@ QmlJsDebugClient::QmlEngineDebugClient *QmlAdapter::engineDebugClient() const
void QmlAdapter::setEngineDebugClient(QmlJsDebugClient::QmlEngineDebugClient *client) void QmlAdapter::setEngineDebugClient(QmlJsDebugClient::QmlEngineDebugClient *client)
{ {
Internal::QmlEngine *engine =
qobject_cast<Internal::QmlEngine *>(d->m_engine.data());
if (engine && d->m_engineDebugClient)
disconnect(d->m_engineDebugClient, SIGNAL(result(quint32,QVariant)),
engine,
SLOT(expressionEvaluated(quint32,QVariant)));
d->m_engineDebugClient = client; d->m_engineDebugClient = client;
if (engine && d->m_engineDebugClient)
connect(d->m_engineDebugClient, SIGNAL(result(quint32,QVariant)),
engine,
SLOT(expressionEvaluated(quint32,QVariant)));
} }
QmlJsDebugClient::QDebugMessageClient *QmlAdapter::messageClient() const QmlJsDebugClient::QDebugMessageClient *QmlAdapter::messageClient() const

View File

@@ -57,6 +57,7 @@
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <projectexplorer/applicationlauncher.h> #include <projectexplorer/applicationlauncher.h>
#include <qmljsdebugclient/qdeclarativeoutputparser.h> #include <qmljsdebugclient/qdeclarativeoutputparser.h>
#include <qmljsdebugclient/qmlenginedebugclient.h>
#include <qmljseditor/qmljseditorconstants.h> #include <qmljseditor/qmljseditorconstants.h>
#include <qmljs/parser/qmljsast_p.h> #include <qmljs/parser/qmljsast_p.h>
#include <qmljs/qmljsmodelmanagerinterface.h> #include <qmljs/qmljsmodelmanagerinterface.h>
@@ -120,6 +121,7 @@ private:
bool m_validContext; bool m_validContext;
QHash<QString,BreakpointModelId> pendingBreakpoints; QHash<QString,BreakpointModelId> pendingBreakpoints;
bool m_retryOnConnectFail; bool m_retryOnConnectFail;
QList<quint32> queryIds;
}; };
QmlEnginePrivate::QmlEnginePrivate(QmlEngine *q) QmlEnginePrivate::QmlEnginePrivate(QmlEngine *q)
@@ -1038,21 +1040,14 @@ void QmlEngine::synchronizeWatchers()
} }
} }
void QmlEngine::onDebugQueryStateChanged( void QmlEngine::expressionEvaluated(quint32 queryId, const QVariant &result)
QmlJsDebugClient::QDeclarativeDebugQuery::State state)
{ {
QmlJsDebugClient::QDeclarativeDebugExpressionQuery *query = if (d->queryIds.contains(queryId)) {
qobject_cast<QmlJsDebugClient::QDeclarativeDebugExpressionQuery *>( d->queryIds.removeOne(queryId);
sender()); QtMessageLogItem *item = constructLogItemTree(result);
if (query && state != QmlJsDebugClient::QDeclarativeDebugQuery::Error) {
QtMessageLogItem *item = constructLogItemTree(query->result());
if (item) if (item)
qtMessageLogHandler()->appendItem(item); qtMessageLogHandler()->appendItem(item);
} else }
qtMessageLogHandler()->
appendItem(new QtMessageLogItem(QtMessageLogHandler::ErrorType,
_("Error evaluating expression.")));
delete query;
} }
bool QmlEngine::hasCapability(unsigned cap) const bool QmlEngine::hasCapability(unsigned cap) const
@@ -1154,16 +1149,19 @@ bool QmlEngine::evaluateScriptExpression(const QString& expression)
int id = d->m_adapter.currentSelectedDebugId(); int id = d->m_adapter.currentSelectedDebugId();
if (engineDebug && id != -1) { if (engineDebug && id != -1) {
QDeclarativeDebugExpressionQuery *query = quint32 queryId =
engineDebug->queryExpressionResult(id, expression); engineDebug->queryExpressionResult(
connect(query, id, expression);
SIGNAL(stateChanged( if (queryId) {
QmlJsDebugClient::QDeclarativeDebugQuery d->queryIds << queryId;
::State)), } else {
this, didEvaluate = false;
SLOT(onDebugQueryStateChanged( qtMessageLogHandler()->
QmlJsDebugClient::QDeclarativeDebugQuery appendItem(
::State))); new QtMessageLogItem(
QtMessageLogHandler::ErrorType,
_("Error evaluating expression.")));
}
} }
} else { } else {
executeDebuggerCommand(expression); executeDebuggerCommand(expression);

View File

@@ -34,7 +34,6 @@
#define DEBUGGER_QMLENGINE_H #define DEBUGGER_QMLENGINE_H
#include "debuggerengine.h" #include "debuggerengine.h"
#include <qmljsdebugclient/qmlenginedebugclient.h>
#include <qmljsdebugclient/qdebugmessageclient.h> #include <qmljsdebugclient/qdebugmessageclient.h>
#include <utils/outputformat.h> #include <utils/outputformat.h>
#include <qmljs/qmljsdocument.h> #include <qmljs/qmljsdocument.h>
@@ -96,6 +95,7 @@ public:
public slots: public slots:
void disconnected(); void disconnected();
void documentUpdated(QmlJS::Document::Ptr doc); void documentUpdated(QmlJS::Document::Ptr doc);
void expressionEvaluated(quint32 queryId, const QVariant &result);
private slots: private slots:
void errorMessageBoxFinished(int result); void errorMessageBoxFinished(int result);
@@ -171,8 +171,6 @@ private slots:
void appendMessage(const QString &msg, Utils::OutputFormat); void appendMessage(const QString &msg, Utils::OutputFormat);
void synchronizeWatchers(); void synchronizeWatchers();
void onDebugQueryStateChanged(
QmlJsDebugClient::QDeclarativeDebugQuery::State state);
private: private:
void closeConnection(); void closeConnection();

View File

@@ -53,13 +53,14 @@ ClientProxy::ClientProxy(Debugger::QmlAdapter *adapter, QObject *parent)
, m_adapter(adapter) , m_adapter(adapter)
, m_engineClient(0) , m_engineClient(0)
, m_inspectorClient(0) , m_inspectorClient(0)
, m_engineQuery(0) , m_engineQueryId(0)
, m_contextQuery(0) , m_contextQueryId(0)
, m_isConnected(false) , m_isConnected(false)
{ {
m_requestObjectsTimer.setSingleShot(true); m_requestObjectsTimer.setSingleShot(true);
m_requestObjectsTimer.setInterval(3000); m_requestObjectsTimer.setInterval(3000);
connect(&m_requestObjectsTimer, SIGNAL(timeout()), this, SLOT(refreshObjectTree())); connect(&m_requestObjectsTimer, SIGNAL(timeout()),
this, SLOT(refreshObjectTree()));
connectToServer(); connectToServer();
} }
@@ -74,15 +75,22 @@ void ClientProxy::connectToServer()
m_engineClient = new QmlEngineDebugClient(m_adapter.data()->connection()); m_engineClient = new QmlEngineDebugClient(m_adapter.data()->connection());
connect(m_engineClient, SIGNAL(newObjects()), this, SLOT(newObjects())); connect(m_engineClient, SIGNAL(newObjects()), this, SLOT(newObjects()));
connect(m_engineClient, SIGNAL(statusChanged(QDeclarativeDebugClient::Status)), connect(m_engineClient, SIGNAL(newStatus(QDeclarativeDebugClient::Status)),
SLOT(clientStatusChanged(QDeclarativeDebugClient::Status)));
connect(m_engineClient, SIGNAL(newStatus(QDeclarativeDebugClient::Status)),
SLOT(engineClientStatusChanged(QDeclarativeDebugClient::Status)));
connect(m_engineClient, SIGNAL(result(quint32,QVariant)),
SLOT(onResult(quint32,QVariant)));
connect(m_engineClient, SIGNAL(valueChanged(int,QByteArray,QVariant)),
SLOT(objectWatchTriggered(int,QByteArray,QVariant)));
m_inspectorClient =
new QmlJSInspectorClient(m_adapter.data()->connection(), this);
connect(m_inspectorClient,
SIGNAL(connectedStatusChanged(QDeclarativeDebugClient::Status)),
this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status))); this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status)));
connect(m_engineClient, SIGNAL(statusChanged(QDeclarativeDebugClient::Status)),
this, SLOT(engineClientStatusChanged(QDeclarativeDebugClient::Status)));
m_inspectorClient = new QmlJSInspectorClient(m_adapter.data()->connection(), this);
connect(m_inspectorClient, SIGNAL(connectedStatusChanged(QDeclarativeDebugClient::Status)),
this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status)));
connect(m_inspectorClient, SIGNAL(currentObjectsChanged(QList<int>)), connect(m_inspectorClient, SIGNAL(currentObjectsChanged(QList<int>)),
SLOT(onCurrentObjectsChanged(QList<int>))); SLOT(onCurrentObjectsChanged(QList<int>)));
connect(m_inspectorClient, SIGNAL(colorPickerActivated()), connect(m_inspectorClient, SIGNAL(colorPickerActivated()),
@@ -127,26 +135,27 @@ void ClientProxy::clientStatusChanged(QDeclarativeDebugClient::Status status)
void ClientProxy::engineClientStatusChanged(QDeclarativeDebugClient::Status status) void ClientProxy::engineClientStatusChanged(QDeclarativeDebugClient::Status status)
{ {
if (status == QDeclarativeDebugClient::Enabled) { if (status == QDeclarativeDebugClient::Enabled) {
m_adapter.data()->setEngineDebugClient(qobject_cast<QmlEngineDebugClient *>(sender())); m_adapter.data()->setEngineDebugClient(
qobject_cast<QmlEngineDebugClient *>(sender()));
} }
} }
void ClientProxy::refreshObjectTree() void ClientProxy::refreshObjectTree()
{ {
if (!m_contextQuery) { if (!m_contextQueryId) {
m_requestObjectsTimer.stop(); m_requestObjectsTimer.stop();
qDeleteAll(m_objectTreeQuery); m_objectTreeQueryIds.clear();
m_objectTreeQuery.clear();
queryEngineContext(m_engines.value(0).debugId()); queryEngineContext(m_engines.value(0).debugId());
} }
} }
void ClientProxy::onCurrentObjectsChanged(const QList<int> &debugIds, bool requestIfNeeded) void ClientProxy::onCurrentObjectsChanged(const QList<int> &debugIds,
bool requestIfNeeded)
{ {
QList<QDeclarativeDebugObjectReference> selectedItems; QList<QmlDebugObjectReference> selectedItems;
foreach (int debugId, debugIds) { foreach (int debugId, debugIds) {
QDeclarativeDebugObjectReference ref = objectReferenceForId(debugId); QmlDebugObjectReference ref = objectReferenceForId(debugId);
if (ref.debugId() != -1) { if (ref.debugId() != -1) {
selectedItems << ref; selectedItems << ref;
} else if (requestIfNeeded) { } else if (requestIfNeeded) {
@@ -171,12 +180,13 @@ void ClientProxy::setSelectedItemsByDebugId(const QList<int> &debugIds)
m_inspectorClient->setCurrentObjects(debugIds); m_inspectorClient->setCurrentObjects(debugIds);
} }
void ClientProxy::setSelectedItemsByObjectId(const QList<QDeclarativeDebugObjectReference> &objectRefs) void ClientProxy::setSelectedItemsByObjectId(
const QList<QmlDebugObjectReference> &objectRefs)
{ {
if (isConnected()) { if (isConnected()) {
QList<int> debugIds; QList<int> debugIds;
foreach (const QDeclarativeDebugObjectReference &ref, objectRefs) { foreach (const QmlDebugObjectReference &ref, objectRefs) {
debugIds << ref.debugId(); debugIds << ref.debugId();
} }
@@ -184,14 +194,14 @@ void ClientProxy::setSelectedItemsByObjectId(const QList<QDeclarativeDebugObject
} }
} }
QDeclarativeDebugObjectReference ClientProxy::objectReferenceForId(int debugId) const QmlDebugObjectReference ClientProxy::objectReferenceForId(int debugId) const
{ {
foreach (const QDeclarativeDebugObjectReference& it, m_rootObjects) { foreach (const QmlDebugObjectReference& it, m_rootObjects) {
QDeclarativeDebugObjectReference result = objectReferenceForId(debugId, it); QmlDebugObjectReference result = objectReferenceForId(debugId, it);
if (result.debugId() == debugId) if (result.debugId() == debugId)
return result; return result;
} }
return QDeclarativeDebugObjectReference(); return QmlDebugObjectReference();
} }
void ClientProxy::log(LogDirection direction, const QString &message) void ClientProxy::log(LogDirection direction, const QString &message)
@@ -208,71 +218,76 @@ void ClientProxy::log(LogDirection direction, const QString &message)
m_adapter.data()->logServiceActivity("QDeclarativeDebug", msg); m_adapter.data()->logServiceActivity("QDeclarativeDebug", msg);
} }
QList<QDeclarativeDebugObjectReference> QmlJSInspector::Internal::ClientProxy::rootObjectReference() const QList<QmlDebugObjectReference>
QmlJSInspector::Internal::ClientProxy::rootObjectReference() const
{ {
return m_rootObjects; return m_rootObjects;
} }
QDeclarativeDebugObjectReference ClientProxy::objectReferenceForId(int debugId, QmlDebugObjectReference
const QDeclarativeDebugObjectReference &objectRef) const ClientProxy::objectReferenceForId(int debugId,
const QmlDebugObjectReference &objectRef) const
{ {
if (objectRef.debugId() == debugId) if (objectRef.debugId() == debugId)
return objectRef; return objectRef;
foreach (const QDeclarativeDebugObjectReference &child, objectRef.children()) { foreach (const QmlDebugObjectReference &child, objectRef.children()) {
QDeclarativeDebugObjectReference result = objectReferenceForId(debugId, child); QmlDebugObjectReference result = objectReferenceForId(debugId, child);
if (result.debugId() == debugId) if (result.debugId() == debugId)
return result; return result;
} }
return QDeclarativeDebugObjectReference(); return QmlDebugObjectReference();
} }
QDeclarativeDebugObjectReference ClientProxy::objectReferenceForId(const QString &objectId) const QmlDebugObjectReference ClientProxy::objectReferenceForId(
const QString &objectId) const
{ {
if (!objectId.isEmpty() && objectId[0].isLower()) { if (!objectId.isEmpty() && objectId[0].isLower()) {
const QList<QDeclarativeDebugObjectReference> refs = objectReferences(); const QList<QmlDebugObjectReference> refs = objectReferences();
foreach (const QDeclarativeDebugObjectReference &ref, refs) { foreach (const QmlDebugObjectReference &ref, refs) {
if (ref.idString() == objectId) if (ref.idString() == objectId)
return ref; return ref;
} }
} }
return QDeclarativeDebugObjectReference(); return QmlDebugObjectReference();
} }
QDeclarativeDebugObjectReference ClientProxy::objectReferenceForLocation(const int line, const int column) const QmlDebugObjectReference ClientProxy::objectReferenceForLocation(
const int line, const int column) const
{ {
const QList<QDeclarativeDebugObjectReference> refs = objectReferences(); const QList<QmlDebugObjectReference> refs = objectReferences();
foreach (const QDeclarativeDebugObjectReference &ref, refs) { foreach (const QmlDebugObjectReference &ref, refs) {
if (ref.source().lineNumber() == line && ref.source().columnNumber() == column) if (ref.source().lineNumber() == line && ref.source().columnNumber() == column)
return ref; return ref;
} }
return QDeclarativeDebugObjectReference(); return QmlDebugObjectReference();
} }
QList<QDeclarativeDebugObjectReference> ClientProxy::objectReferences() const QList<QmlDebugObjectReference> ClientProxy::objectReferences() const
{ {
QList<QDeclarativeDebugObjectReference> result; QList<QmlDebugObjectReference> result;
foreach (const QDeclarativeDebugObjectReference &it, m_rootObjects) { foreach (const QmlDebugObjectReference &it, m_rootObjects) {
result.append(objectReferences(it)); result.append(objectReferences(it));
} }
return result; return result;
} }
QList<QDeclarativeDebugObjectReference> ClientProxy::objectReferences(const QDeclarativeDebugObjectReference &objectRef) const QList<QmlDebugObjectReference>
ClientProxy::objectReferences(const QmlDebugObjectReference &objectRef) const
{ {
QList<QDeclarativeDebugObjectReference> result; QList<QmlDebugObjectReference> result;
result.append(objectRef); result.append(objectRef);
foreach (const QDeclarativeDebugObjectReference &child, objectRef.children()) { foreach (const QmlDebugObjectReference &child, objectRef.children()) {
result.append(objectReferences(child)); result.append(objectReferences(child));
} }
return result; return result;
} }
bool ClientProxy::setBindingForObject(int objectDebugId, quint32 ClientProxy::setBindingForObject(int objectDebugId,
const QString &propertyName, const QString &propertyName,
const QVariant &value, const QVariant &value,
bool isLiteralValue, bool isLiteralValue,
@@ -288,17 +303,23 @@ bool ClientProxy::setBindingForObject(int objectDebugId,
if (!isConnected()) if (!isConnected())
return false; return false;
log(LogSend, QString("SET_BINDING %1 %2 %3 %4").arg(QString::number(objectDebugId), propertyName, value.toString(), QString(isLiteralValue ? "true" : "false"))); log(LogSend, QString("SET_BINDING %1 %2 %3 %4").arg(
QString::number(objectDebugId), propertyName, value.toString(),
QString(isLiteralValue ? "true" : "false")));
bool result = m_engineClient->setBindingForObject(objectDebugId, propertyName, value.toString(), isLiteralValue, source, line); quint32 queryId = m_engineClient->setBindingForObject(
objectDebugId, propertyName, value.toString(), isLiteralValue,
source, line);
if (!result) if (!queryId)
log(LogSend, QString("failed!")); log(LogSend, QString("failed!"));
return result; return queryId;
} }
bool ClientProxy::setMethodBodyForObject(int objectDebugId, const QString &methodName, const QString &methodBody) quint32 ClientProxy::setMethodBodyForObject(int objectDebugId,
const QString &methodName,
const QString &methodBody)
{ {
if (objectDebugId == -1) if (objectDebugId == -1)
return false; return false;
@@ -306,17 +327,20 @@ bool ClientProxy::setMethodBodyForObject(int objectDebugId, const QString &metho
if (!isConnected()) if (!isConnected())
return false; return false;
log(LogSend, QString("SET_METHOD_BODY %1 %2 %3").arg(QString::number(objectDebugId), methodName, methodBody)); log(LogSend, QString("SET_METHOD_BODY %1 %2 %3").arg(
QString::number(objectDebugId), methodName, methodBody));
bool result = m_engineClient->setMethodBody(objectDebugId, methodName, methodBody); quint32 queryId = m_engineClient->setMethodBody(
objectDebugId, methodName, methodBody);
if (!result) if (!queryId)
log(LogSend, QString("failed!")); log(LogSend, QString("failed!"));
return result; return queryId;
} }
bool ClientProxy::resetBindingForObject(int objectDebugId, const QString& propertyName) quint32 ClientProxy::resetBindingForObject(int objectDebugId,
const QString& propertyName)
{ {
if (objectDebugId == -1) if (objectDebugId == -1)
return false; return false;
@@ -324,17 +348,20 @@ bool ClientProxy::resetBindingForObject(int objectDebugId, const QString& proper
if (!isConnected()) if (!isConnected())
return false; return false;
log(LogSend, QString("RESET_BINDING %1 %2").arg(QString::number(objectDebugId), propertyName)); log(LogSend, QString("RESET_BINDING %1 %2").arg(
QString::number(objectDebugId), propertyName));
bool result = m_engineClient->resetBindingForObject(objectDebugId, propertyName); quint32 queryId = m_engineClient->resetBindingForObject(
objectDebugId, propertyName);
if (!result) if (!queryId)
log(LogSend, QString("failed!")); log(LogSend, QString("failed!"));
return result; return queryId;
} }
QDeclarativeDebugExpressionQuery *ClientProxy::queryExpressionResult(int objectDebugId, const QString &expr) quint32 ClientProxy::queryExpressionResult(int objectDebugId,
const QString &expr)
{ {
if (objectDebugId == -1) if (objectDebugId == -1)
return 0; return 0;
@@ -346,13 +373,13 @@ QDeclarativeDebugExpressionQuery *ClientProxy::queryExpressionResult(int objectD
if (m_adapter) if (m_adapter)
block = m_adapter.data()->disableJsDebugging(true); block = m_adapter.data()->disableJsDebugging(true);
log(LogSend, QString("EVAL_EXPRESSION %1 %2").arg(QString::number(objectDebugId), expr)); log(LogSend, QString("EVAL_EXPRESSION %1 %2").arg(
QDeclarativeDebugExpressionQuery *query QString::number(objectDebugId), expr));
= m_engineClient->queryExpressionResult(objectDebugId, expr, m_engineClient); quint32 queryId = m_engineClient->queryExpressionResult(objectDebugId, expr);
if (m_adapter) if (m_adapter)
m_adapter.data()->disableJsDebugging(block); m_adapter.data()->disableJsDebugging(block);
return query; return queryId;
} }
void ClientProxy::clearComponentCache() void ClientProxy::clearComponentCache()
@@ -370,32 +397,28 @@ bool ClientProxy::addObjectWatch(int objectDebugId)
return false; return false;
// already set // already set
if (m_objectWatches.keys().contains(objectDebugId)) if (m_objectWatches.contains(objectDebugId))
return true; return true;
QDeclarativeDebugObjectReference ref = objectReferenceForId(objectDebugId); QmlDebugObjectReference ref = objectReferenceForId(objectDebugId);
if (ref.debugId() != objectDebugId) if (ref.debugId() != objectDebugId)
return false; return false;
// is flooding the debugging output log! // is flooding the debugging output log!
// log(LogSend, QString("WATCH_PROPERTY %1").arg(objectDebugId)); // log(LogSend, QString("WATCH_PROPERTY %1").arg(objectDebugId));
QDeclarativeDebugWatch *watch = m_engineClient->addWatch(ref, m_engineClient); if (m_engineClient->addWatch(ref))
m_objectWatches.insert(objectDebugId, watch); m_objectWatches.append(objectDebugId);
connect(watch,SIGNAL(valueChanged(QByteArray,QVariant)),this,SLOT(objectWatchTriggered(QByteArray,QVariant)));
return false; return false;
} }
void ClientProxy::objectWatchTriggered(const QByteArray &propertyName, const QVariant &propertyValue) void ClientProxy::objectWatchTriggered(int objectDebugId,
const QByteArray &propertyName,
const QVariant &propertyValue)
{ {
// is flooding the debugging output log! if (m_objectWatches.contains(objectDebugId))
// log(LogReceive, QString("UPDATE_WATCH %1 %2").arg(QString::fromAscii(propertyName), propertyValue.toString())); emit propertyChanged(objectDebugId, propertyName, propertyValue);
QDeclarativeDebugWatch *watch = dynamic_cast<QDeclarativeDebugWatch *>(QObject::sender());
if (watch)
emit propertyChanged(watch->objectDebugId(),propertyName, propertyValue);
} }
bool ClientProxy::removeObjectWatch(int objectDebugId) bool ClientProxy::removeObjectWatch(int objectDebugId)
@@ -403,29 +426,19 @@ bool ClientProxy::removeObjectWatch(int objectDebugId)
if (objectDebugId == -1) if (objectDebugId == -1)
return false; return false;
if (!m_objectWatches.keys().contains(objectDebugId)) if (!m_objectWatches.contains(objectDebugId))
return false; return false;
if (!isConnected()) if (!isConnected())
return false; return false;
QDeclarativeDebugWatch *watch = m_objectWatches.value(objectDebugId); m_objectWatches.removeOne(objectDebugId);
disconnect(watch,SIGNAL(valueChanged(QByteArray,QVariant)), this, SLOT(objectWatchTriggered(QByteArray,QVariant)));
// is flooding the debugging output log!
// log(LogSend, QString("NO_WATCH %1").arg(QString::number(objectDebugId)));
m_engineClient->removeWatch(watch);
delete watch;
m_objectWatches.remove(objectDebugId);
return true; return true;
} }
void ClientProxy::removeAllObjectWatches() void ClientProxy::removeAllObjectWatches()
{ {
foreach (int watchedObject, m_objectWatches.keys()) foreach (int watchedObject, m_objectWatches)
removeObjectWatch(watchedObject); removeObjectWatch(watchedObject);
} }
@@ -437,87 +450,75 @@ void ClientProxy::queryEngineContext(int id)
if (!isConnected()) if (!isConnected())
return; return;
if (m_contextQuery) { if (m_contextQueryId)
delete m_contextQuery; m_contextQueryId = 0;
m_contextQuery = 0;
}
log(LogSend, QString("LIST_OBJECTS %1").arg(QString::number(id))); log(LogSend, QString("LIST_OBJECTS %1").arg(QString::number(id)));
m_contextQuery = m_engineClient->queryRootContexts(QDeclarativeDebugEngineReference(id), m_contextQueryId = m_engineClient->queryRootContexts(QmlDebugEngineReference(id));
m_engineClient);
if (!m_contextQuery->isWaiting())
contextChanged();
else
connect(m_contextQuery, SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)),
this, SLOT(contextChanged()));
} }
void ClientProxy::contextChanged() void ClientProxy::contextChanged(const QVariant &value)
{ {
log(LogReceive, QString("LIST_OBJECTS_R")); log(LogReceive, QString("LIST_OBJECTS_R"));
if (m_contextQuery) { if (m_contextQueryId) {
m_rootObjects.clear(); m_rootObjects.clear();
QDeclarativeDebugContextReference rootContext = m_contextQuery->rootContext(); QmlDebugContextReference rootContext =
delete m_contextQuery; qvariant_cast<QmlDebugContextReference>(value);
m_contextQuery = 0; m_contextQueryId = 0;
qDeleteAll(m_objectTreeQuery); m_objectTreeQueryIds.clear();
m_objectTreeQuery.clear();
m_requestObjectsTimer.stop(); m_requestObjectsTimer.stop();
fetchContextObjectRecursive(rootContext); fetchContextObjectRecursive(rootContext);
} }
} }
void ClientProxy::fetchContextObjectRecursive(const QDeclarativeDebugContextReference& context) void ClientProxy::fetchContextObjectRecursive(
const QmlDebugContextReference& context)
{ {
if (!isConnected()) if (!isConnected())
return; return;
foreach (const QDeclarativeDebugObjectReference & obj, context.objects()) { foreach (const QmlDebugObjectReference & obj, context.objects()) {
log(LogSend, QString("FETCH_OBJECT %1").arg(obj.idString())); log(LogSend, QString("FETCH_OBJECT %1").arg(obj.idString()));
QDeclarativeDebugObjectQuery* query quint32 queryId = m_engineClient->queryObjectRecursive(obj);
= m_engineClient->queryObjectRecursive(obj, m_engineClient); if (queryId)
if (!query->isWaiting()) { m_objectTreeQueryIds << queryId;
query->deleteLater(); //ignore errors;
} else {
m_objectTreeQuery << query;
connect(query,
SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)),
SLOT(objectTreeFetched(QmlJsDebugClient::QDeclarativeDebugQuery::State)));
}
} }
foreach (const QDeclarativeDebugContextReference& child, context.contexts()) { foreach (const QmlDebugContextReference& child, context.contexts()) {
fetchContextObjectRecursive(child); fetchContextObjectRecursive(child);
} }
} }
void ClientProxy::onResult(quint32 queryId, const QVariant &value)
void ClientProxy::objectTreeFetched(QmlJsDebugClient::QDeclarativeDebugQuery::State state)
{ {
QDeclarativeDebugObjectQuery *query = qobject_cast<QDeclarativeDebugObjectQuery *>(sender()); if (m_objectTreeQueryIds.contains(queryId))
if (!query || state == QDeclarativeDebugQuery::Error) { objectTreeFetched(queryId, value);
delete query; else if (queryId == m_engineQueryId)
return; updateEngineList(value);
} else if (queryId == m_contextQueryId)
contextChanged(value);
else
emit result(queryId, value);
}
log(LogReceive, QString("FETCH_OBJECT_R %1").arg(query->object().idString())); void ClientProxy::objectTreeFetched(quint32 queryId, const QVariant &result)
{
QmlDebugObjectReference obj = qvariant_cast<QmlDebugObjectReference>(result);
m_rootObjects.append(query->object()); log(LogReceive, QString("FETCH_OBJECT_R %1").arg(obj.idString()));
int removed = m_objectTreeQuery.removeAll(query); m_rootObjects.append(obj);
Q_ASSERT(removed == 1);
Q_UNUSED(removed);
delete query;
if (m_objectTreeQuery.isEmpty()) { m_objectTreeQueryIds.removeOne(queryId);
if (m_objectTreeQueryIds.isEmpty()) {
int old_count = m_debugIdHash.count(); int old_count = m_debugIdHash.count();
m_debugIdHash.clear(); m_debugIdHash.clear();
m_debugIdHash.reserve(old_count + 1); m_debugIdHash.reserve(old_count + 1);
foreach (const QDeclarativeDebugObjectReference &it, m_rootObjects) foreach (const QmlDebugObjectReference &it, m_rootObjects)
buildDebugIdHashRecursive(it); buildDebugIdHashRecursive(it);
emit objectTreeUpdated(); emit objectTreeUpdated();
@@ -530,14 +531,15 @@ void ClientProxy::objectTreeFetched(QmlJsDebugClient::QDeclarativeDebugQuery::St
} }
} }
void ClientProxy::buildDebugIdHashRecursive(const QDeclarativeDebugObjectReference& ref) void ClientProxy::buildDebugIdHashRecursive(const QmlDebugObjectReference& ref)
{ {
QUrl fileUrl = ref.source().url(); QUrl fileUrl = ref.source().url();
int lineNum = ref.source().lineNumber(); int lineNum = ref.source().lineNumber();
int colNum = ref.source().columnNumber(); int colNum = ref.source().columnNumber();
int rev = 0; int rev = 0;
// handle the case where the url contains the revision number encoded. (for object created by the debugger) // handle the case where the url contains the revision number encoded.
//(for object created by the debugger)
static QRegExp rx("(.*)_(\\d+):(\\d+)$"); static QRegExp rx("(.*)_(\\d+):(\\d+)$");
if (rx.exactMatch(fileUrl.path())) { if (rx.exactMatch(fileUrl.path())) {
fileUrl.setPath(rx.cap(1)); fileUrl.setPath(rx.cap(1));
@@ -548,9 +550,10 @@ void ClientProxy::buildDebugIdHashRecursive(const QDeclarativeDebugObjectReferen
const QString filePath = InspectorUi::instance()->findFileInProject(fileUrl); const QString filePath = InspectorUi::instance()->findFileInProject(fileUrl);
// append the debug ids in the hash // append the debug ids in the hash
m_debugIdHash[qMakePair<QString, int>(filePath, rev)][qMakePair<int, int>(lineNum, colNum)].append(ref.debugId()); m_debugIdHash[qMakePair<QString, int>(filePath, rev)][qMakePair<int, int>(
lineNum, colNum)].append(ref.debugId());
foreach (const QDeclarativeDebugObjectReference &it, ref.children()) foreach (const QmlDebugObjectReference &it, ref.children())
buildDebugIdHashRecursive(it); buildDebugIdHashRecursive(it);
} }
@@ -609,10 +612,12 @@ void ClientProxy::showAppOnTop(bool showOnTop)
} }
void ClientProxy::createQmlObject(const QString &qmlText, int parentDebugId, void ClientProxy::createQmlObject(const QString &qmlText, int parentDebugId,
const QStringList &imports, const QString &filename, int order) const QStringList &imports,
const QString &filename, int order)
{ {
if (isConnected()) if (isConnected())
m_inspectorClient->createQmlObject(qmlText, parentDebugId, imports, filename, order); m_inspectorClient->createQmlObject(qmlText, parentDebugId, imports,
filename, order);
} }
void ClientProxy::destroyQmlObject(int debugId) void ClientProxy::destroyQmlObject(int debugId)
@@ -629,8 +634,10 @@ void ClientProxy::reparentQmlObject(int debugId, int newParent)
void ClientProxy::updateConnected() void ClientProxy::updateConnected()
{ {
bool isConnected = m_inspectorClient && m_inspectorClient->status() == QDeclarativeDebugClient::Enabled bool isConnected = m_inspectorClient &&
&& m_engineClient && m_engineClient->status() == QDeclarativeDebugClient::Enabled; m_inspectorClient->status() == QDeclarativeDebugClient::Enabled &&
m_engineClient &&
m_engineClient->status() == QDeclarativeDebugClient::Enabled;
if (isConnected != m_isConnected) { if (isConnected != m_isConnected) {
m_isConnected = isConnected; m_isConnected = isConnected;
@@ -645,11 +652,6 @@ void ClientProxy::updateConnected()
void ClientProxy::reloadEngines() void ClientProxy::reloadEngines()
{ {
if (m_engineQuery) {
emit connectionStatusMessage("[Inspector] Waiting for response to previous engine query");
return;
}
if (!isConnected()) if (!isConnected())
return; return;
@@ -657,28 +659,20 @@ void ClientProxy::reloadEngines()
log(LogSend, QString("LIST_ENGINES")); log(LogSend, QString("LIST_ENGINES"));
m_engineQuery = m_engineClient->queryAvailableEngines(m_engineClient); m_engineQueryId = m_engineClient->queryAvailableEngines();
if (!m_engineQuery->isWaiting()) {
updateEngineList();
} else {
connect(m_engineQuery, SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)),
this, SLOT(updateEngineList()));
}
} }
QList<QDeclarativeDebugEngineReference> ClientProxy::engines() const QList<QmlDebugEngineReference> ClientProxy::engines() const
{ {
return m_engines; return m_engines;
} }
void ClientProxy::updateEngineList() void ClientProxy::updateEngineList(const QVariant &value)
{ {
log(LogReceive, QString("LIST_ENGINES_R")); log(LogReceive, QString("LIST_ENGINES_R"));
m_engines = m_engineQuery->engines(); m_engines = qvariant_cast<QmlDebugEngineReferenceList>(value);
delete m_engineQuery; m_engineQueryId = 0;
m_engineQuery = 0;
emit enginesChanged(); emit enginesChanged();
} }

View File

@@ -60,16 +60,16 @@ public:
explicit ClientProxy(Debugger::QmlAdapter *adapter, QObject *parent = 0); explicit ClientProxy(Debugger::QmlAdapter *adapter, QObject *parent = 0);
~ClientProxy(); ~ClientProxy();
bool setBindingForObject(int objectDebugId, quint32 setBindingForObject(int objectDebugId,
const QString &propertyName, const QString &propertyName,
const QVariant &value, const QVariant &value,
bool isLiteralValue, bool isLiteralValue,
QString source, QString source,
int line); int line);
bool setMethodBodyForObject(int objectDebugId, const QString &methodName, const QString &methodBody); quint32 setMethodBodyForObject(int objectDebugId, const QString &methodName, const QString &methodBody);
bool resetBindingForObject(int objectDebugId, const QString &propertyName); quint32 resetBindingForObject(int objectDebugId, const QString &propertyName);
QDeclarativeDebugExpressionQuery *queryExpressionResult(int objectDebugId, const QString &expr); quint32 queryExpressionResult(int objectDebugId, const QString &expr);
void clearComponentCache(); void clearComponentCache();
bool addObjectWatch(int objectDebugId); bool addObjectWatch(int objectDebugId);
@@ -77,19 +77,19 @@ public:
void removeAllObjectWatches(); void removeAllObjectWatches();
// returns the object references // returns the object references
QList<QDeclarativeDebugObjectReference> objectReferences() const; QList<QmlDebugObjectReference> objectReferences() const;
QDeclarativeDebugObjectReference objectReferenceForId(int debugId) const; QmlDebugObjectReference objectReferenceForId(int debugId) const;
QDeclarativeDebugObjectReference objectReferenceForId(const QString &objectId) const; QmlDebugObjectReference objectReferenceForId(const QString &objectId) const;
QDeclarativeDebugObjectReference objectReferenceForLocation(const int line, const int column) const; QmlDebugObjectReference objectReferenceForLocation(const int line, const int column) const;
QList<QDeclarativeDebugObjectReference> rootObjectReference() const; QList<QmlDebugObjectReference> rootObjectReference() const;
DebugIdHash debugIdHash() const { return m_debugIdHash; } DebugIdHash debugIdHash() const { return m_debugIdHash; }
bool isConnected() const; bool isConnected() const;
void setSelectedItemsByDebugId(const QList<int> &debugIds); void setSelectedItemsByDebugId(const QList<int> &debugIds);
void setSelectedItemsByObjectId(const QList<QDeclarativeDebugObjectReference> &objectRefs); void setSelectedItemsByObjectId(const QList<QmlDebugObjectReference> &objectRefs);
QList<QDeclarativeDebugEngineReference> engines() const; QList<QmlDebugEngineReference> engines() const;
Debugger::QmlAdapter *qmlAdapter() const; Debugger::QmlAdapter *qmlAdapter() const;
@@ -100,7 +100,7 @@ signals:
void aboutToReloadEngines(); void aboutToReloadEngines();
void enginesChanged(); void enginesChanged();
void selectedItemsChanged(const QList<QDeclarativeDebugObjectReference> &selectedItems); void selectedItemsChanged(const QList<QmlDebugObjectReference> &selectedItems);
void connected(); void connected();
void disconnected(); void disconnected();
@@ -117,6 +117,8 @@ signals:
void selectedColorChanged(const QColor &color); void selectedColorChanged(const QColor &color);
void propertyChanged(int debugId, const QByteArray &propertyName, const QVariant &propertyValue); void propertyChanged(int debugId, const QByteArray &propertyName, const QVariant &propertyValue);
void result(quint32 queryId, const QVariant &result);
public slots: public slots:
void refreshObjectTree(); void refreshObjectTree();
void queryEngineContext(int id); void queryEngineContext(int id);
@@ -140,21 +142,21 @@ private slots:
void clientStatusChanged(QDeclarativeDebugClient::Status status); void clientStatusChanged(QDeclarativeDebugClient::Status status);
void engineClientStatusChanged(QDeclarativeDebugClient::Status status); void engineClientStatusChanged(QDeclarativeDebugClient::Status status);
void contextChanged();
void onCurrentObjectsChanged(const QList<int> &debugIds, bool requestIfNeeded = true); void onCurrentObjectsChanged(const QList<int> &debugIds, bool requestIfNeeded = true);
void updateEngineList(); void fetchContextObjectRecursive(const QmlDebugContextReference &context);
void objectTreeFetched(QmlJsDebugClient::QDeclarativeDebugQuery::State state = QmlJsDebugClient::QDeclarativeDebugQuery::Completed);
void fetchContextObjectRecursive(const QmlJsDebugClient::QDeclarativeDebugContextReference& context);
void newObjects(); void newObjects();
void objectWatchTriggered(const QByteArray &propertyName, const QVariant &propertyValue); void objectWatchTriggered(int debugId, const QByteArray &propertyName, const QVariant &propertyValue);
void onResult(quint32 queryId, const QVariant &result);
private: private:
void contextChanged(const QVariant &value);
void updateEngineList(const QVariant &value);
void objectTreeFetched(quint32 queryId, const QVariant &result);
void updateConnected(); void updateConnected();
void reloadEngines(); void reloadEngines();
QList<QDeclarativeDebugObjectReference> objectReferences(const QDeclarativeDebugObjectReference &objectRef) const; QList<QmlDebugObjectReference> objectReferences(const QmlDebugObjectReference &objectRef) const;
QDeclarativeDebugObjectReference objectReferenceForId(int debugId, const QDeclarativeDebugObjectReference &ref) const; QmlDebugObjectReference objectReferenceForId(int debugId, const QmlDebugObjectReference &ref) const;
enum LogDirection { enum LogDirection {
LogSend, LogSend,
@@ -164,22 +166,22 @@ private:
private: private:
void buildDebugIdHashRecursive(const QDeclarativeDebugObjectReference &ref); void buildDebugIdHashRecursive(const QmlDebugObjectReference &ref);
QWeakPointer<Debugger::QmlAdapter> m_adapter; QWeakPointer<Debugger::QmlAdapter> m_adapter;
QmlEngineDebugClient *m_engineClient; QmlEngineDebugClient *m_engineClient;
QmlJSInspectorClient *m_inspectorClient; QmlJSInspectorClient *m_inspectorClient;
QDeclarativeDebugEnginesQuery *m_engineQuery; quint32 m_engineQueryId;
QDeclarativeDebugRootContextQuery *m_contextQuery; quint32 m_contextQueryId;
QList<QDeclarativeDebugObjectQuery *> m_objectTreeQuery; QList<quint32> m_objectTreeQueryIds;
QList<QDeclarativeDebugObjectReference> m_rootObjects; QList<QmlDebugObjectReference> m_rootObjects;
QList<QDeclarativeDebugEngineReference> m_engines; QmlDebugEngineReferenceList m_engines;
QTimer m_requestObjectsTimer; QTimer m_requestObjectsTimer;
DebugIdHash m_debugIdHash; DebugIdHash m_debugIdHash;
QHash<int, QDeclarativeDebugWatch *> m_objectWatches; QList<int> m_objectWatches;
bool m_isConnected; bool m_isConnected;
}; };

View File

@@ -224,7 +224,7 @@ void InspectorUi::showDebuggerTooltip(const QPoint &mousePos, TextEditor::ITextE
if (!qmlNode) if (!qmlNode)
return; return;
QDeclarativeDebugObjectReference ref; QmlDebugObjectReference ref;
if (QmlJS::AST::Node *node if (QmlJS::AST::Node *node
= qmlEditor->semanticInfo().declaringMemberNoProperties(cursorPos)) { = qmlEditor->semanticInfo().declaringMemberNoProperties(cursorPos)) {
if (QmlJS::AST::UiObjectMember *objMember = node->uiObjectMemberCast()) { if (QmlJS::AST::UiObjectMember *objMember = node->uiObjectMemberCast()) {
@@ -249,7 +249,7 @@ void InspectorUi::showDebuggerTooltip(const QPoint &mousePos, TextEditor::ITextE
if ((qmlNode->kind == QmlJS::AST::Node::Kind_IdentifierExpression) && if ((qmlNode->kind == QmlJS::AST::Node::Kind_IdentifierExpression) &&
(m_clientProxy->objectReferenceForId(refToLook).debugId() == -1)) { (m_clientProxy->objectReferenceForId(refToLook).debugId() == -1)) {
query = doubleQuote + QString("local: ") + refToLook + doubleQuote; query = doubleQuote + QString("local: ") + refToLook + doubleQuote;
foreach (const QDeclarativeDebugPropertyReference &property, ref.properties()) { foreach (const QmlDebugPropertyReference &property, ref.properties()) {
if (property.name() == wordAtCursor if (property.name() == wordAtCursor
&& !property.valueTypeName().isEmpty()) { && !property.valueTypeName().isEmpty()) {
query = doubleQuote + property.name() + QLatin1Char(':') query = doubleQuote + property.name() + QLatin1Char(':')
@@ -263,7 +263,7 @@ void InspectorUi::showDebuggerTooltip(const QPoint &mousePos, TextEditor::ITextE
+ QLatin1Char('+') + refToLook; + QLatin1Char('+') + refToLook;
} else { } else {
// show properties // show properties
foreach (const QDeclarativeDebugPropertyReference &property, ref.properties()) { foreach (const QmlDebugPropertyReference &property, ref.properties()) {
if (property.name() == wordAtCursor && !property.valueTypeName().isEmpty()) { if (property.name() == wordAtCursor && !property.valueTypeName().isEmpty()) {
query = doubleQuote + property.name() + QLatin1Char(':') query = doubleQuote + property.name() + QLatin1Char(':')
+ doubleQuote + QLatin1Char('+') + property.name(); + doubleQuote + QLatin1Char('+') + property.name();
@@ -275,25 +275,19 @@ void InspectorUi::showDebuggerTooltip(const QPoint &mousePos, TextEditor::ITextE
if (!query.isEmpty()) { if (!query.isEmpty()) {
m_debugQuery = m_clientProxy->queryExpressionResult(ref.debugId(), query); m_debugQuery = m_clientProxy->queryExpressionResult(ref.debugId(), query);
connect(m_debugQuery, SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)),
this, SLOT(debugQueryUpdated(QmlJsDebugClient::QDeclarativeDebugQuery::State)));
} }
} }
} }
void InspectorUi::debugQueryUpdated(QmlJsDebugClient::QDeclarativeDebugQuery::State newState) void InspectorUi::onResult(quint32 queryId, const QVariant &result)
{ {
if (newState != QDeclarativeDebugExpressionQuery::Completed) if (m_debugQuery != queryId)
return;
if (!m_debugQuery)
return; return;
QString text = m_debugQuery->result().toString(); m_debugQuery = 0;
QString text = result.toString();
if (!text.isEmpty()) if (!text.isEmpty())
QToolTip::showText(QCursor::pos(), text); QToolTip::showText(QCursor::pos(), text);
disconnect(m_debugQuery, SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)),
this, SLOT(debugQueryUpdated(QmlJsDebugClient::QDeclarativeDebugQuery::State)));
} }
bool InspectorUi::isConnected() const bool InspectorUi::isConnected() const
@@ -303,7 +297,13 @@ bool InspectorUi::isConnected() const
void InspectorUi::connected(ClientProxy *clientProxy) void InspectorUi::connected(ClientProxy *clientProxy)
{ {
if (m_clientProxy)
disconnect(m_clientProxy, SIGNAL(result(quint32,QVariant)),
this, SLOT(onResult(quint32,QVariant)));
m_clientProxy = clientProxy; m_clientProxy = clientProxy;
if (m_clientProxy)
connect(m_clientProxy, SIGNAL(result(quint32,QVariant)),
SLOT(onResult(quint32,QVariant)));
QmlJS::Snapshot snapshot = modelManager()->snapshot(); QmlJS::Snapshot snapshot = modelManager()->snapshot();
for (QHash<QString, QmlJSLiveTextPreview *>::const_iterator it = m_textPreviews.constBegin(); for (QHash<QString, QmlJSLiveTextPreview *>::const_iterator it = m_textPreviews.constBegin();
@@ -365,19 +365,19 @@ void InspectorUi::objectTreeReady()
void InspectorUi::updateEngineList() void InspectorUi::updateEngineList()
{ {
QList<QDeclarativeDebugEngineReference> engines = m_clientProxy->engines(); QList<QmlDebugEngineReference> engines = m_clientProxy->engines();
//#warning update the QML engines combo //#warning update the QML engines combo
if (engines.isEmpty()) if (engines.isEmpty())
qWarning("qmldebugger: no engines found!"); qWarning("qmldebugger: no engines found!");
else { else {
const QDeclarativeDebugEngineReference engine = engines.first(); const QmlDebugEngineReference engine = engines.first();
m_clientProxy->queryEngineContext(engine.debugId()); m_clientProxy->queryEngineContext(engine.debugId());
} }
} }
void InspectorUi::changeSelectedItems(const QList<QDeclarativeDebugObjectReference> &objects) void InspectorUi::changeSelectedItems(const QList<QmlDebugObjectReference> &objects)
{ {
if (m_selectionCallbackExpected) { if (m_selectionCallbackExpected) {
m_selectionCallbackExpected = false; m_selectionCallbackExpected = false;
@@ -386,9 +386,9 @@ void InspectorUi::changeSelectedItems(const QList<QDeclarativeDebugObjectReferen
m_cursorPositionChangedExternally = true; m_cursorPositionChangedExternally = true;
// QmlJSLiveTextPreview doesn't provide valid references, only correct debugIds. We need to remap them // QmlJSLiveTextPreview doesn't provide valid references, only correct debugIds. We need to remap them
QList <QDeclarativeDebugObjectReference> realList; QList <QmlDebugObjectReference> realList;
foreach (const QDeclarativeDebugObjectReference &obj, objects) { foreach (const QmlDebugObjectReference &obj, objects) {
QDeclarativeDebugObjectReference clientRef = m_clientProxy->objectReferenceForId(obj.debugId()); QmlDebugObjectReference clientRef = m_clientProxy->objectReferenceForId(obj.debugId());
realList << clientRef; realList << clientRef;
} }
@@ -476,8 +476,8 @@ QmlJSLiveTextPreview *InspectorUi::createPreviewForEditor(Core::IEditor *newEdit
} else { } else {
preview = new QmlJSLiveTextPreview(doc, initdoc, m_clientProxy, this); preview = new QmlJSLiveTextPreview(doc, initdoc, m_clientProxy, this);
connect(preview, connect(preview,
SIGNAL(selectedItemsChanged(QList<QDeclarativeDebugObjectReference>)), SIGNAL(selectedItemsChanged(QList<QmlDebugObjectReference>)),
SLOT(changeSelectedItems(QList<QDeclarativeDebugObjectReference>))); SLOT(changeSelectedItems(QList<QmlDebugObjectReference>)));
connect(preview, SIGNAL(reloadQmlViewerRequested()), connect(preview, SIGNAL(reloadQmlViewerRequested()),
m_clientProxy, SLOT(reloadQmlViewer())); m_clientProxy, SLOT(reloadQmlViewer()));
connect(preview, SIGNAL(disableLivePreviewRequested()), SLOT(disableLivePreview())); connect(preview, SIGNAL(disableLivePreviewRequested()), SLOT(disableLivePreview()));
@@ -503,36 +503,36 @@ void InspectorUi::reloadQmlViewer()
m_clientProxy->reloadQmlViewer(); m_clientProxy->reloadQmlViewer();
} }
inline QDeclarativeDebugObjectReference findParentRecursive( int goalDebugId, inline QmlDebugObjectReference findParentRecursive( int goalDebugId,
const QList< QDeclarativeDebugObjectReference > &objectsToSearch) const QList<QmlDebugObjectReference > &objectsToSearch)
{ {
if (goalDebugId == -1) if (goalDebugId == -1)
return QDeclarativeDebugObjectReference(); return QmlDebugObjectReference();
foreach (const QDeclarativeDebugObjectReference &possibleParent, objectsToSearch) { foreach (const QmlDebugObjectReference &possibleParent, objectsToSearch) {
// Am I a root object? No parent // Am I a root object? No parent
if ( possibleParent.debugId() == goalDebugId ) if ( possibleParent.debugId() == goalDebugId )
return QDeclarativeDebugObjectReference(); return QmlDebugObjectReference();
// Is the goal one of my children? // Is the goal one of my children?
foreach (const QDeclarativeDebugObjectReference &child, possibleParent.children()) foreach (const QmlDebugObjectReference &child, possibleParent.children())
if ( child.debugId() == goalDebugId ) if ( child.debugId() == goalDebugId )
return possibleParent; return possibleParent;
// no luck? pass this on // no luck? pass this on
QDeclarativeDebugObjectReference candidate = findParentRecursive(goalDebugId, possibleParent.children()); QmlDebugObjectReference candidate = findParentRecursive(goalDebugId, possibleParent.children());
if (candidate.debugId() != -1) if (candidate.debugId() != -1)
return candidate; return candidate;
} }
return QDeclarativeDebugObjectReference(); return QmlDebugObjectReference();
} }
inline QString displayName(const QDeclarativeDebugObjectReference &obj) inline QString displayName(const QmlDebugObjectReference &obj)
{ {
// special! state names // special! state names
if (obj.className() == "State") { if (obj.className() == "State") {
foreach (const QDeclarativeDebugPropertyReference &prop, obj.properties()) { foreach (const QmlDebugPropertyReference &prop, obj.properties()) {
if (prop.name() == "name") if (prop.name() == "name")
return prop.value().toString(); return prop.value().toString();
} }
@@ -551,16 +551,16 @@ inline QString displayName(const QDeclarativeDebugObjectReference &obj)
return QString("<%1>").arg(objTypeName); return QString("<%1>").arg(objTypeName);
} }
void InspectorUi::selectItems(const QList<QDeclarativeDebugObjectReference> &objectReferences) void InspectorUi::selectItems(const QList<QmlDebugObjectReference> &objectReferences)
{ {
foreach (const QDeclarativeDebugObjectReference &objref, objectReferences) { foreach (const QmlDebugObjectReference &objref, objectReferences) {
int debugId = objref.debugId(); int debugId = objref.debugId();
if (debugId != -1) { if (debugId != -1) {
// select only the first valid element of the list // select only the first valid element of the list
m_clientProxy->removeAllObjectWatches(); m_clientProxy->removeAllObjectWatches();
m_clientProxy->addObjectWatch(debugId); m_clientProxy->addObjectWatch(debugId);
QList <QDeclarativeDebugObjectReference> selectionList; QList <QmlDebugObjectReference> selectionList;
selectionList << objref; selectionList << objref;
m_propertyInspector->setCurrentObjects(selectionList); m_propertyInspector->setCurrentObjects(selectionList);
populateCrumblePath(objref); populateCrumblePath(objref);
@@ -574,21 +574,21 @@ void InspectorUi::selectItems(const QList<QDeclarativeDebugObjectReference> &obj
} }
} }
bool InspectorUi::isRoot(const QDeclarativeDebugObjectReference &obj) const bool InspectorUi::isRoot(const QmlDebugObjectReference &obj) const
{ {
foreach (const QDeclarativeDebugObjectReference &rootObj, m_clientProxy->rootObjectReference()) foreach (const QmlDebugObjectReference &rootObj, m_clientProxy->rootObjectReference())
if (obj.debugId() == rootObj.debugId()) if (obj.debugId() == rootObj.debugId())
return true; return true;
return false; return false;
} }
void InspectorUi::populateCrumblePath(const QDeclarativeDebugObjectReference &objRef) void InspectorUi::populateCrumblePath(const QmlDebugObjectReference &objRef)
{ {
QStringList crumbleStrings; QStringList crumbleStrings;
QList <int> crumbleData; QList <int> crumbleData;
// first find path by climbing the hierarchy // first find path by climbing the hierarchy
QDeclarativeDebugObjectReference ref = objRef; QmlDebugObjectReference ref = objRef;
crumbleData << objRef.debugId(); crumbleData << objRef.debugId();
crumbleStrings << displayName(objRef); crumbleStrings << displayName(objRef);
@@ -603,7 +603,7 @@ void InspectorUi::populateCrumblePath(const QDeclarativeDebugObjectReference &ob
crumbleData.clear(); crumbleData.clear();
// now append the children // now append the children
foreach (const QDeclarativeDebugObjectReference &child, objRef.children()) { foreach (const QmlDebugObjectReference &child, objRef.children()) {
crumbleData.push_back(child.debugId()); crumbleData.push_back(child.debugId());
crumbleStrings.push_back( displayName(child) ); crumbleStrings.push_back( displayName(child) );
} }
@@ -613,10 +613,10 @@ void InspectorUi::populateCrumblePath(const QDeclarativeDebugObjectReference &ob
void InspectorUi::selectItems(const QList<int> &objectIds) void InspectorUi::selectItems(const QList<int> &objectIds)
{ {
QList<QDeclarativeDebugObjectReference> objectReferences; QList<QmlDebugObjectReference> objectReferences;
foreach (int objectId, objectIds) foreach (int objectId, objectIds)
{ {
QDeclarativeDebugObjectReference ref = m_clientProxy->objectReferenceForId(objectId); QmlDebugObjectReference ref = m_clientProxy->objectReferenceForId(objectId);
if (ref.debugId() == objectId) if (ref.debugId() == objectId)
objectReferences.append(ref); objectReferences.append(ref);
} }
@@ -646,7 +646,7 @@ void InspectorUi::disable()
m_filterExp->setEnabled(false); m_filterExp->setEnabled(false);
} }
QDeclarativeDebugObjectReference InspectorUi::objectReferenceForLocation(const QString &fileName, int cursorPosition) const QmlDebugObjectReference InspectorUi::objectReferenceForLocation(const QString &fileName, int cursorPosition) const
{ {
Core::EditorManager *editorManager = Core::EditorManager::instance(); Core::EditorManager *editorManager = Core::EditorManager::instance();
Core::IEditor *editor = editorManager->openEditor(fileName); Core::IEditor *editor = editorManager->openEditor(fileName);
@@ -667,17 +667,17 @@ QDeclarativeDebugObjectReference InspectorUi::objectReferenceForLocation(const Q
} }
} }
} }
return QDeclarativeDebugObjectReference(); return QmlDebugObjectReference();
} }
void InspectorUi::gotoObjectReferenceDefinition(const QDeclarativeDebugObjectReference &obj) void InspectorUi::gotoObjectReferenceDefinition(const QmlDebugObjectReference &obj)
{ {
if (m_cursorPositionChangedExternally) { if (m_cursorPositionChangedExternally) {
m_cursorPositionChangedExternally = false; m_cursorPositionChangedExternally = false;
return; return;
} }
QDeclarativeDebugFileReference source = obj.source(); QmlDebugFileReference source = obj.source();
const QString fileName = m_projectFinder.findFile(source.url()); const QString fileName = m_projectFinder.findFile(source.url());
@@ -690,7 +690,7 @@ void InspectorUi::gotoObjectReferenceDefinition(const QDeclarativeDebugObjectRef
m_selectionCallbackExpected = true; m_selectionCallbackExpected = true;
if (textEditor) { if (textEditor) {
QDeclarativeDebugObjectReference ref = objectReferenceForLocation(fileName); QmlDebugObjectReference ref = objectReferenceForLocation(fileName);
if (ref.debugId() != obj.debugId()) { if (ref.debugId() != obj.debugId()) {
m_selectionCallbackExpected = true; m_selectionCallbackExpected = true;
editorManager->addCurrentPositionToNavigationHistory(); editorManager->addCurrentPositionToNavigationHistory();
@@ -843,8 +843,8 @@ void InspectorUi::connectSignals()
connect(m_clientProxy, SIGNAL(propertyChanged(int,QByteArray,QVariant)), connect(m_clientProxy, SIGNAL(propertyChanged(int,QByteArray,QVariant)),
m_propertyInspector, SLOT(propertyValueChanged(int,QByteArray,QVariant))); m_propertyInspector, SLOT(propertyValueChanged(int,QByteArray,QVariant)));
connect(m_clientProxy, SIGNAL(selectedItemsChanged(QList<QDeclarativeDebugObjectReference>)), connect(m_clientProxy, SIGNAL(selectedItemsChanged(QList<QmlDebugObjectReference>)),
this, SLOT(selectItems(QList<QDeclarativeDebugObjectReference>))); this, SLOT(selectItems(QList<QmlDebugObjectReference>)));
connect(m_clientProxy, SIGNAL(enginesChanged()), connect(m_clientProxy, SIGNAL(enginesChanged()),
this, SLOT(updateEngineList())); this, SLOT(updateEngineList()));
connect(m_clientProxy, SIGNAL(serverReloaded()), connect(m_clientProxy, SIGNAL(serverReloaded()),

View File

@@ -112,14 +112,15 @@ public slots:
void reloadQmlViewer(); void reloadQmlViewer();
void serverReloaded(); void serverReloaded();
void setApplyChangesToQmlInspector(bool applyChanges); void setApplyChangesToQmlInspector(bool applyChanges);
void onResult(quint32 queryId, const QVariant &result);
private slots: private slots:
void enable(); void enable();
void disable(); void disable();
void gotoObjectReferenceDefinition(const QDeclarativeDebugObjectReference &obj); void gotoObjectReferenceDefinition(const QmlDebugObjectReference &obj);
void selectItems(const QList<QDeclarativeDebugObjectReference> &objectReferences); void selectItems(const QList<QmlDebugObjectReference> &objectReferences);
void selectItems(const QList<int> &objectIds); void selectItems(const QList<int> &objectIds);
void changeSelectedItems(const QList<QDeclarativeDebugObjectReference> &objects); void changeSelectedItems(const QList<QmlDebugObjectReference> &objects);
void changePropertyValue(int debugId,const QString &propertyName, const QString &valueExpression); void changePropertyValue(int debugId,const QString &propertyName, const QString &valueExpression);
void objectTreeReady(); void objectTreeReady();
@@ -133,7 +134,6 @@ private slots:
void updatePendingPreviewDocuments(QmlJS::Document::Ptr doc); void updatePendingPreviewDocuments(QmlJS::Document::Ptr doc);
void showDebuggerTooltip(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos); void showDebuggerTooltip(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos);
void debugQueryUpdated(QmlJsDebugClient::QDeclarativeDebugQuery::State);
private: private:
bool addQuotesForData(const QVariant &value) const; bool addQuotesForData(const QVariant &value) const;
@@ -143,9 +143,9 @@ private:
void applyChangesToQmlInspectorHelper(bool applyChanges); void applyChangesToQmlInspectorHelper(bool applyChanges);
void setupDockWidgets(); void setupDockWidgets();
QString filenameForShadowBuildFile(const QString &filename) const; QString filenameForShadowBuildFile(const QString &filename) const;
void populateCrumblePath(const QDeclarativeDebugObjectReference &objRef); void populateCrumblePath(const QmlDebugObjectReference &objRef);
bool isRoot(const QDeclarativeDebugObjectReference &obj) const; bool isRoot(const QmlDebugObjectReference &obj) const;
QDeclarativeDebugObjectReference objectReferenceForLocation(const QString &fileName, int cursorPosition=-1) const; QmlDebugObjectReference objectReferenceForLocation(const QString &fileName, int cursorPosition=-1) const;
void connectSignals(); void connectSignals();
void disconnectSignals(); void disconnectSignals();
@@ -160,7 +160,7 @@ private:
InspectorSettings *m_settings; InspectorSettings *m_settings;
ClientProxy *m_clientProxy; ClientProxy *m_clientProxy;
QObject *m_qmlEngine; QObject *m_qmlEngine;
QDeclarativeDebugExpressionQuery *m_debugQuery; quint32 m_debugQuery;
// Qml/JS integration // Qml/JS integration
QHash<QString, QmlJSLiveTextPreview *> m_textPreviews; QHash<QString, QmlJSLiveTextPreview *> m_textPreviews;

View File

@@ -182,15 +182,15 @@ void QmlJSInspectorClient::setCurrentObjects(const QList<int> &debugIds)
sendMessage(message); sendMessage(message);
} }
void recurseObjectIdList(const QDeclarativeDebugObjectReference &ref, QList<int> &debugIds, QList<QString> &objectIds) void recurseObjectIdList(const QmlDebugObjectReference &ref, QList<int> &debugIds, QList<QString> &objectIds)
{ {
debugIds << ref.debugId(); debugIds << ref.debugId();
objectIds << ref.idString(); objectIds << ref.idString();
foreach (const QDeclarativeDebugObjectReference &child, ref.children()) foreach (const QmlDebugObjectReference &child, ref.children())
recurseObjectIdList(child, debugIds, objectIds); recurseObjectIdList(child, debugIds, objectIds);
} }
void QmlJSInspectorClient::setObjectIdList(const QList<QDeclarativeDebugObjectReference> &objectRoots) void QmlJSInspectorClient::setObjectIdList(const QList<QmlDebugObjectReference> &objectRoots)
{ {
QByteArray message; QByteArray message;
QDataStream ds(&message, QIODevice::WriteOnly); QDataStream ds(&message, QIODevice::WriteOnly);
@@ -198,7 +198,7 @@ void QmlJSInspectorClient::setObjectIdList(const QList<QDeclarativeDebugObjectRe
QList<int> debugIds; QList<int> debugIds;
QList<QString> objectIds; QList<QString> objectIds;
foreach (const QDeclarativeDebugObjectReference &ref, objectRoots) foreach (const QmlDebugObjectReference &ref, objectRoots)
recurseObjectIdList(ref, debugIds, objectIds); recurseObjectIdList(ref, debugIds, objectIds);
InspectorProtocol::Message cmd = InspectorProtocol::ObjectIdList; InspectorProtocol::Message cmd = InspectorProtocol::ObjectIdList;

View File

@@ -68,7 +68,7 @@ public:
QList<int> currentObjects() const; QList<int> currentObjects() const;
// ### Qt 4.8: remove if we can have access to qdeclarativecontextdata or id's // ### Qt 4.8: remove if we can have access to qdeclarativecontextdata or id's
void setObjectIdList(const QList<QDeclarativeDebugObjectReference> &objectRoots); void setObjectIdList(const QList<QmlDebugObjectReference> &objectRoots);
void clearComponentCache(); void clearComponentCache();

View File

@@ -220,7 +220,7 @@ void QmlJSLiveTextPreview::changeSelectedElements(QList<int> offsets, const QStr
if (m_editors.isEmpty() || !m_previousDoc || !m_clientProxy) if (m_editors.isEmpty() || !m_previousDoc || !m_clientProxy)
return; return;
QDeclarativeDebugObjectReference objectRefUnderCursor; QmlDebugObjectReference objectRefUnderCursor;
objectRefUnderCursor = m_clientProxy.data()->objectReferenceForId(wordAtCursor); objectRefUnderCursor = m_clientProxy.data()->objectReferenceForId(wordAtCursor);
QList<int> selectedReferences; QList<int> selectedReferences;
@@ -252,20 +252,20 @@ void QmlJSLiveTextPreview::changeSelectedElements(QList<int> offsets, const QStr
} }
if (!selectedReferences.isEmpty()) { if (!selectedReferences.isEmpty()) {
QList<QDeclarativeDebugObjectReference> refs; QList<QmlDebugObjectReference> refs;
foreach(int i, selectedReferences) foreach(int i, selectedReferences)
refs << QDeclarativeDebugObjectReference(i); refs << QmlDebugObjectReference(i);
emit selectedItemsChanged(refs); emit selectedItemsChanged(refs);
} }
} }
static QList<int> findRootObjectRecursive(const QDeclarativeDebugObjectReference &object, const Document::Ptr &doc) static QList<int> findRootObjectRecursive(const QmlDebugObjectReference &object, const Document::Ptr &doc)
{ {
QList<int> result; QList<int> result;
if (object.className() == doc->componentName()) if (object.className() == doc->componentName())
result += object.debugId(); result += object.debugId();
foreach (const QDeclarativeDebugObjectReference &it, object.children()) { foreach (const QmlDebugObjectReference &it, object.children()) {
result += findRootObjectRecursive(it, doc); result += findRootObjectRecursive(it, doc);
} }
return result; return result;
@@ -305,7 +305,7 @@ void QmlJSLiveTextPreview::updateDebugIds()
if(doc->qmlProgram()->members && doc->qmlProgram()->members->member) { if(doc->qmlProgram()->members && doc->qmlProgram()->members->member) {
UiObjectMember* root = doc->qmlProgram()->members->member; UiObjectMember* root = doc->qmlProgram()->members->member;
QList<int> r; QList<int> r;
foreach(const QDeclarativeDebugObjectReference& it, clientProxy->rootObjectReference()) foreach (const QmlDebugObjectReference& it, clientProxy->rootObjectReference())
r += findRootObjectRecursive(it, doc); r += findRootObjectRecursive(it, doc);
if (!r.isEmpty()) if (!r.isEmpty())
m_debugIds[root] += r; m_debugIds[root] += r;
@@ -464,7 +464,10 @@ protected:
if (isLiteral) if (isLiteral)
expr = castToLiteral(scriptCode, scriptBinding); expr = castToLiteral(scriptCode, scriptBinding);
appliedChangesToViewer = true; appliedChangesToViewer = true;
m_clientProxy->setBindingForObject(debugId, propertyName, expr, isLiteral, document()->fileName(), scriptBinding->firstSourceLocation().startLine); m_clientProxy->setBindingForObject(
debugId, propertyName, expr,
isLiteral, document()->fileName(),
scriptBinding->firstSourceLocation().startLine);
} }
virtual void resetBindingForObject(int debugId, const QString &propertyName) virtual void resetBindingForObject(int debugId, const QString &propertyName)

View File

@@ -72,8 +72,8 @@ public:
void associateEditor(Core::IEditor *editor); void associateEditor(Core::IEditor *editor);
void unassociateEditor(Core::IEditor *editor); void unassociateEditor(Core::IEditor *editor);
void setActiveObject(const QDeclarativeDebugObjectReference &object); void setActiveObject(const QmlDebugObjectReference &object);
void mapObjectToQml(const QDeclarativeDebugObjectReference &object); void mapObjectToQml(const QmlDebugObjectReference &object);
void resetInitialDoc(const QmlJS::Document::Ptr &doc); void resetInitialDoc(const QmlJS::Document::Ptr &doc);
void setClientProxy(ClientProxy *clientProxy); void setClientProxy(ClientProxy *clientProxy);
@@ -85,7 +85,7 @@ public:
}; };
signals: signals:
void selectedItemsChanged(const QList<QDeclarativeDebugObjectReference> &objects); void selectedItemsChanged(const QList<QmlDebugObjectReference> &objects);
void reloadQmlViewerRequested(); void reloadQmlViewerRequested();
void disableLivePreviewRequested(); void disableLivePreviewRequested();

View File

@@ -295,14 +295,14 @@ void QmlJSPropertyInspector::clear()
m_currentObjects.clear(); m_currentObjects.clear();
} }
void QmlJSPropertyInspector::setCurrentObjects(const QList<QDeclarativeDebugObjectReference> &objectList) void QmlJSPropertyInspector::setCurrentObjects(const QList<QmlDebugObjectReference> &objectList)
{ {
if (objectList.isEmpty()) if (objectList.isEmpty())
return; return;
clear(); clear();
foreach (const QDeclarativeDebugObjectReference &obj, objectList) { foreach (const QmlDebugObjectReference &obj, objectList) {
m_currentObjects << obj.debugId(); m_currentObjects << obj.debugId();
buildPropertyTree(obj); buildPropertyTree(obj);
} }
@@ -350,7 +350,7 @@ void QmlJSPropertyInspector::propertyValueEdited(const int objectId,const QStrin
emit changePropertyValue(objectId, propertyName, propertyValue); emit changePropertyValue(objectId, propertyName, propertyValue);
} }
void QmlJSPropertyInspector::buildPropertyTree(const QDeclarativeDebugObjectReference &obj) void QmlJSPropertyInspector::buildPropertyTree(const QmlDebugObjectReference &obj)
{ {
// Strip off the misleading metadata // Strip off the misleading metadata
QString objTypeName = obj.className(); QString objTypeName = obj.className();
@@ -375,7 +375,7 @@ void QmlJSPropertyInspector::buildPropertyTree(const QDeclarativeDebugObjectRefe
false); false);
} }
foreach (const QDeclarativeDebugPropertyReference &prop, obj.properties()) { foreach (const QmlDebugPropertyReference &prop, obj.properties()) {
QString propertyName = prop.name(); QString propertyName = prop.name();
QString propertyValue = prop.value().toString(); QString propertyValue = prop.value().toString();

View File

@@ -129,7 +129,7 @@ signals:
void customContextMenuRequested(const QPoint &pos); void customContextMenuRequested(const QPoint &pos);
public slots: public slots:
void setCurrentObjects(const QList<QDeclarativeDebugObjectReference> &); void setCurrentObjects(const QList<QmlDebugObjectReference> &);
void propertyValueEdited(const int objectId,const QString &propertyName, const QString &propertyValue); void propertyValueEdited(const int objectId,const QString &propertyName, const QString &propertyValue);
void propertyValueChanged(int debugId, const QByteArray &propertyName, const QVariant &propertyValue); void propertyValueChanged(int debugId, const QByteArray &propertyName, const QVariant &propertyValue);
void filterBy(const QString &expression); void filterBy(const QString &expression);
@@ -139,7 +139,7 @@ public slots:
private: private:
friend class PropertyEditDelegate; friend class PropertyEditDelegate;
void buildPropertyTree(const QDeclarativeDebugObjectReference &); void buildPropertyTree(const QmlDebugObjectReference &);
void addRow(const QString &name, const QString &value, const QString &type, void addRow(const QString &name, const QString &value, const QString &type,
const int debugId = -1, bool editable = true); const int debugId = -1, bool editable = true);
void setColorIcon(int row); void setColorIcon(int row);