diff options
Diffstat (limited to 'src/plugins/qmljsinspector/qmljsclientproxy.cpp')
-rw-r--r-- | src/plugins/qmljsinspector/qmljsclientproxy.cpp | 430 |
1 files changed, 234 insertions, 196 deletions
diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp index 418de0119f..5c8b3104a4 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp +++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp @@ -53,13 +53,10 @@ ClientProxy::ClientProxy(Debugger::QmlAdapter *adapter, QObject *parent) , m_adapter(adapter) , m_engineClient(0) , m_inspectorClient(0) - , m_engineQuery(0) - , m_contextQuery(0) + , m_engineQueryId(0) + , m_contextQueryId(0) , m_isConnected(false) { - m_requestObjectsTimer.setSingleShot(true); - m_requestObjectsTimer.setInterval(3000); - connect(&m_requestObjectsTimer, SIGNAL(timeout()), this, SLOT(refreshObjectTree())); connectToServer(); } @@ -71,22 +68,29 @@ ClientProxy::~ClientProxy() void ClientProxy::connectToServer() { - m_engineClient = new QDeclarativeEngineDebug(m_adapter.data()->connection(), this); + QmlEngineDebugClient *client1 = new QDeclarativeEngineClient( + m_adapter.data()->connection()); + QmlEngineDebugClient *client2 = new QmlDebuggerClient( + m_adapter.data()->connection()); - connect(m_engineClient, SIGNAL(newObjects()), this, SLOT(newObjects())); - connect(m_engineClient, SIGNAL(statusChanged(QDeclarativeDebugClient::Status)), - this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status))); - connect(m_engineClient, SIGNAL(statusChanged(QDeclarativeDebugClient::Status)), - this, SLOT(engineClientStatusChanged(QDeclarativeDebugClient::Status))); + connect(client1, SIGNAL(newStatus(QDeclarativeDebugClient::Status)), + SLOT(clientStatusChanged(QDeclarativeDebugClient::Status))); + connect(client1, SIGNAL(newStatus(QDeclarativeDebugClient::Status)), + SLOT(engineClientStatusChanged(QDeclarativeDebugClient::Status))); + + connect(client2, SIGNAL(newStatus(QDeclarativeDebugClient::Status)), + SLOT(clientStatusChanged(QDeclarativeDebugClient::Status))); + connect(client2, SIGNAL(newStatus(QDeclarativeDebugClient::Status)), + SLOT(engineClientStatusChanged(QDeclarativeDebugClient::Status))); - m_inspectorClient = new QmlJSInspectorClient(m_adapter.data()->connection(), this); + 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(connectedStatusChanged(QDeclarativeDebugClient::Status)), + this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status))); connect(m_inspectorClient, SIGNAL(currentObjectsChanged(QList<int>)), SLOT(onCurrentObjectsChanged(QList<int>))); - connect(m_inspectorClient, SIGNAL(colorPickerActivated()), - SIGNAL(colorPickerActivated())); connect(m_inspectorClient, SIGNAL(zoomToolActivated()), SIGNAL(zoomToolActivated())); connect(m_inspectorClient, SIGNAL(selectToolActivated()), @@ -103,8 +107,6 @@ void ClientProxy::connectToServer() SIGNAL(showAppOnTopChanged(bool))); connect(m_inspectorClient, SIGNAL(reloaded()), this, SIGNAL(serverReloaded())); - connect(m_inspectorClient, SIGNAL(selectedColorChanged(QColor)), - SIGNAL(selectedColorChanged(QColor))); connect(m_inspectorClient, SIGNAL(logActivity(QString,QString)), m_adapter.data(), SLOT(logServiceActivity(QString,QString))); @@ -127,42 +129,65 @@ void ClientProxy::clientStatusChanged(QDeclarativeDebugClient::Status status) void ClientProxy::engineClientStatusChanged(QDeclarativeDebugClient::Status status) { if (status == QDeclarativeDebugClient::Enabled) { - m_adapter.data()->setEngineDebugClient(qobject_cast<QDeclarativeEngineDebug *>(sender())); + m_engineClient = qobject_cast<QmlEngineDebugClient *>(sender()); + connect(m_engineClient, SIGNAL(newObjects()), this, SLOT(newObjects())); + connect(m_engineClient, SIGNAL(result(quint32,QVariant,QByteArray)), + SLOT(onResult(quint32,QVariant,QByteArray))); + connect(m_engineClient, SIGNAL(valueChanged(int,QByteArray,QVariant)), + SLOT(objectWatchTriggered(int,QByteArray,QVariant))); + m_adapter.data()->setEngineDebugClient(m_engineClient); + updateConnected(); } } void ClientProxy::refreshObjectTree() { - if (!m_contextQuery) { - m_requestObjectsTimer.stop(); - qDeleteAll(m_objectTreeQuery); - m_objectTreeQuery.clear(); + if (!m_contextQueryId) { + m_objectTreeQueryIds.clear(); 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; + m_fetchCurrentObjects.clear(); + m_fetchCurrentObjectsQueryIds.clear(); foreach (int debugId, debugIds) { - QDeclarativeDebugObjectReference ref = objectReferenceForId(debugId); - if (ref.debugId() != -1) { + QmlDebugObjectReference ref = objectReferenceForId(debugId); + if (ref.debugId() != -1 && !ref.needsMoreData()) { selectedItems << ref; } else if (requestIfNeeded) { - // ### FIXME right now, there's no way in the protocol to - // a) get some item and know its parent (although that's possible - // by adding it to a separate plugin) - // b) add children to part of an existing tree. - // So the only choice that remains is to update the complete - // tree when we have an unknown debug id. - // break; + m_fetchCurrentObjectsQueryIds << fetchContextObject( + QmlDebugObjectReference(debugId)); + } } emit selectedItemsChanged(selectedItems); } +void ClientProxy::onCurrentObjectsFetched(quint32 queryId, const QVariant &result) +{ + m_fetchCurrentObjectsQueryIds.removeOne(queryId); + QmlDebugObjectReference obj = qvariant_cast<QmlDebugObjectReference>(result); + m_fetchCurrentObjects.push_front(obj); + + //If this is not a root object, check if we have the parent + QmlDebugObjectReference parent = objectReferenceForId(obj.parentId()); + if (obj.parentId() != -1 && (parent.debugId() == -1 || parent.needsMoreData())) { + m_fetchCurrentObjectsQueryIds << fetchContextObject( + QmlDebugObjectReference(obj.parentId())); + return; + } + + foreach (const QmlDebugObjectReference &o, m_fetchCurrentObjects) + addObjectToTree(o); + emit selectedItemsChanged(QList<QmlDebugObjectReference>() << + m_fetchCurrentObjects.last()); +} + void ClientProxy::setSelectedItemsByDebugId(const QList<int> &debugIds) { if (!isConnected()) @@ -171,12 +196,13 @@ void ClientProxy::setSelectedItemsByDebugId(const QList<int> &debugIds) m_inspectorClient->setCurrentObjects(debugIds); } -void ClientProxy::setSelectedItemsByObjectId(const QList<QDeclarativeDebugObjectReference> &objectRefs) +void ClientProxy::setSelectedItemsByObjectId( + const QList<QmlDebugObjectReference> &objectRefs) { if (isConnected()) { QList<int> debugIds; - foreach (const QDeclarativeDebugObjectReference &ref, objectRefs) { + foreach (const QmlDebugObjectReference &ref, objectRefs) { debugIds << ref.debugId(); } @@ -184,14 +210,26 @@ void ClientProxy::setSelectedItemsByObjectId(const QList<QDeclarativeDebugObject } } -QDeclarativeDebugObjectReference ClientProxy::objectReferenceForId(int debugId) const +void ClientProxy::addObjectToTree(const QmlDebugObjectReference &obj) +{ + int count = m_rootObjects.count(); + for (int i = 0; i < count; i++) { + if (m_rootObjects[i].insertObjectInTree(obj)) { + buildDebugIdHashRecursive(obj); + emit objectTreeUpdated(); + break; + } + } +} + +QmlDebugObjectReference ClientProxy::objectReferenceForId(int debugId) const { - foreach (const QDeclarativeDebugObjectReference& it, m_rootObjects) { - QDeclarativeDebugObjectReference result = objectReferenceForId(debugId, it); + foreach (const QmlDebugObjectReference& it, m_rootObjects) { + QmlDebugObjectReference result = objectReferenceForId(debugId, it); if (result.debugId() == debugId) return result; } - return QDeclarativeDebugObjectReference(); + return QmlDebugObjectReference(); } void ClientProxy::log(LogDirection direction, const QString &message) @@ -208,71 +246,76 @@ void ClientProxy::log(LogDirection direction, const QString &message) m_adapter.data()->logServiceActivity("QDeclarativeDebug", msg); } -QList<QDeclarativeDebugObjectReference> QmlJSInspector::Internal::ClientProxy::rootObjectReference() const +QList<QmlDebugObjectReference> +QmlJSInspector::Internal::ClientProxy::rootObjectReference() const { return m_rootObjects; } -QDeclarativeDebugObjectReference ClientProxy::objectReferenceForId(int debugId, - const QDeclarativeDebugObjectReference &objectRef) const +QmlDebugObjectReference +ClientProxy::objectReferenceForId(int debugId, + const QmlDebugObjectReference &objectRef) const { if (objectRef.debugId() == debugId) return objectRef; - foreach (const QDeclarativeDebugObjectReference &child, objectRef.children()) { - QDeclarativeDebugObjectReference result = objectReferenceForId(debugId, child); + foreach (const QmlDebugObjectReference &child, objectRef.children()) { + QmlDebugObjectReference result = objectReferenceForId(debugId, child); if (result.debugId() == debugId) 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()) { - const QList<QDeclarativeDebugObjectReference> refs = objectReferences(); - foreach (const QDeclarativeDebugObjectReference &ref, refs) { + const QList<QmlDebugObjectReference> refs = objectReferences(); + foreach (const QmlDebugObjectReference &ref, refs) { if (ref.idString() == objectId) 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(); - foreach (const QDeclarativeDebugObjectReference &ref, refs) { + const QList<QmlDebugObjectReference> refs = objectReferences(); + foreach (const QmlDebugObjectReference &ref, refs) { if (ref.source().lineNumber() == line && ref.source().columnNumber() == column) return ref; } - return QDeclarativeDebugObjectReference(); + return QmlDebugObjectReference(); } -QList<QDeclarativeDebugObjectReference> ClientProxy::objectReferences() const +QList<QmlDebugObjectReference> ClientProxy::objectReferences() const { - QList<QDeclarativeDebugObjectReference> result; - foreach (const QDeclarativeDebugObjectReference &it, m_rootObjects) { + QList<QmlDebugObjectReference> result; + foreach (const QmlDebugObjectReference &it, m_rootObjects) { result.append(objectReferences(it)); } 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); - foreach (const QDeclarativeDebugObjectReference &child, objectRef.children()) { + foreach (const QmlDebugObjectReference &child, objectRef.children()) { result.append(objectReferences(child)); } return result; } -bool ClientProxy::setBindingForObject(int objectDebugId, +quint32 ClientProxy::setBindingForObject(int objectDebugId, const QString &propertyName, const QVariant &value, bool isLiteralValue, @@ -288,17 +331,23 @@ bool ClientProxy::setBindingForObject(int objectDebugId, if (!isConnected()) 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!")); - 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) return false; @@ -306,17 +355,20 @@ bool ClientProxy::setMethodBodyForObject(int objectDebugId, const QString &metho if (!isConnected()) 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!")); - return result; + return queryId; } -bool ClientProxy::resetBindingForObject(int objectDebugId, const QString& propertyName) +quint32 ClientProxy::resetBindingForObject(int objectDebugId, + const QString& propertyName) { if (objectDebugId == -1) return false; @@ -324,17 +376,20 @@ bool ClientProxy::resetBindingForObject(int objectDebugId, const QString& proper if (!isConnected()) 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!")); - return result; + return queryId; } -QDeclarativeDebugExpressionQuery *ClientProxy::queryExpressionResult(int objectDebugId, const QString &expr) +quint32 ClientProxy::queryExpressionResult(int objectDebugId, + const QString &expr) { if (objectDebugId == -1) return 0; @@ -346,13 +401,13 @@ QDeclarativeDebugExpressionQuery *ClientProxy::queryExpressionResult(int objectD if (m_adapter) block = m_adapter.data()->disableJsDebugging(true); - log(LogSend, QString("EVAL_EXPRESSION %1 %2").arg(QString::number(objectDebugId), expr)); - QDeclarativeDebugExpressionQuery *query - = m_engineClient->queryExpressionResult(objectDebugId, expr, m_engineClient); + log(LogSend, QString("EVAL_EXPRESSION %1 %2").arg( + QString::number(objectDebugId), expr)); + quint32 queryId = m_engineClient->queryExpressionResult(objectDebugId, expr); if (m_adapter) m_adapter.data()->disableJsDebugging(block); - return query; + return queryId; } void ClientProxy::clearComponentCache() @@ -370,32 +425,34 @@ bool ClientProxy::addObjectWatch(int objectDebugId) return false; // already set - if (m_objectWatches.keys().contains(objectDebugId)) + if (m_objectWatches.contains(objectDebugId)) return true; - QDeclarativeDebugObjectReference ref = objectReferenceForId(objectDebugId); + QmlDebugObjectReference ref = objectReferenceForId(objectDebugId); if (ref.debugId() != objectDebugId) return false; // is flooding the debugging output log! // log(LogSend, QString("WATCH_PROPERTY %1").arg(objectDebugId)); - QDeclarativeDebugWatch *watch = m_engineClient->addWatch(ref, m_engineClient); - m_objectWatches.insert(objectDebugId, watch); - - connect(watch,SIGNAL(valueChanged(QByteArray,QVariant)),this,SLOT(objectWatchTriggered(QByteArray,QVariant))); + if (m_engineClient->addWatch(ref)) + m_objectWatches.append(objectDebugId); return false; } -void ClientProxy::objectWatchTriggered(const QByteArray &propertyName, const QVariant &propertyValue) +bool ClientProxy::isObjectBeingWatched(int objectDebugId) { - // is flooding the debugging output log! - // log(LogReceive, QString("UPDATE_WATCH %1 %2").arg(QString::fromAscii(propertyName), propertyValue.toString())); + return m_objectWatches.contains(objectDebugId); +} - QDeclarativeDebugWatch *watch = dynamic_cast<QDeclarativeDebugWatch *>(QObject::sender()); - if (watch) - emit propertyChanged(watch->objectDebugId(),propertyName, propertyValue); + +void ClientProxy::objectWatchTriggered(int objectDebugId, + const QByteArray &propertyName, + const QVariant &propertyValue) +{ + if (m_objectWatches.contains(objectDebugId)) + emit propertyChanged(objectDebugId, propertyName, propertyValue); } bool ClientProxy::removeObjectWatch(int objectDebugId) @@ -403,29 +460,19 @@ bool ClientProxy::removeObjectWatch(int objectDebugId) if (objectDebugId == -1) return false; - if (!m_objectWatches.keys().contains(objectDebugId)) + if (!m_objectWatches.contains(objectDebugId)) return false; if (!isConnected()) return false; - QDeclarativeDebugWatch *watch = m_objectWatches.value(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); - - + m_objectWatches.removeOne(objectDebugId); return true; } void ClientProxy::removeAllObjectWatches() { - foreach (int watchedObject, m_objectWatches.keys()) + foreach (int watchedObject, m_objectWatches) removeObjectWatch(watchedObject); } @@ -437,87 +484,94 @@ void ClientProxy::queryEngineContext(int id) if (!isConnected()) return; - if (m_contextQuery) { - delete m_contextQuery; - m_contextQuery = 0; - } + if (m_contextQueryId) + m_contextQueryId = 0; log(LogSend, QString("LIST_OBJECTS %1").arg(QString::number(id))); - m_contextQuery = m_engineClient->queryRootContexts(QDeclarativeDebugEngineReference(id), - m_engineClient); - if (!m_contextQuery->isWaiting()) - contextChanged(); - else - connect(m_contextQuery, SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)), - this, SLOT(contextChanged())); + m_contextQueryId = m_engineClient->queryRootContexts(QmlDebugEngineReference(id)); } -void ClientProxy::contextChanged() +void ClientProxy::contextChanged(const QVariant &value) { - log(LogReceive, QString("LIST_OBJECTS_R")); - if (m_contextQuery) { - m_rootObjects.clear(); - QDeclarativeDebugContextReference rootContext = m_contextQuery->rootContext(); - delete m_contextQuery; - m_contextQuery = 0; - qDeleteAll(m_objectTreeQuery); - m_objectTreeQuery.clear(); - m_requestObjectsTimer.stop(); - - fetchContextObjectRecursive(rootContext); + if (m_contextQueryId) { + m_contextQueryId = 0; + emit rootContext(value); } } -void ClientProxy::fetchContextObjectRecursive(const QDeclarativeDebugContextReference& context) +quint32 ClientProxy::fetchContextObject(const QmlDebugObjectReference& obj) { - if (!isConnected()) - return; - - foreach (const QDeclarativeDebugObjectReference & obj, context.objects()) { + log(LogSend, QString("FETCH_OBJECT %1").arg(obj.idString())); - log(LogSend, QString("FETCH_OBJECT %1").arg(obj.idString())); + return m_engineClient->queryObject(obj); +} - QDeclarativeDebugObjectQuery* query - = m_engineClient->queryObjectRecursive(obj, m_engineClient); - if (!query->isWaiting()) { - query->deleteLater(); //ignore errors; - } else { - m_objectTreeQuery << query; - connect(query, - SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)), - SLOT(objectTreeFetched(QmlJsDebugClient::QDeclarativeDebugQuery::State))); - } +void ClientProxy::fetchContextObjectRecursive( + const QmlDebugContextReference& context, bool clear) +{ + if (!isConnected()) + return; + if (clear) { + m_rootObjects.clear(); + m_objectTreeQueryIds.clear(); + } + foreach (const QmlDebugObjectReference & obj, context.objects()) { + quint32 queryId = fetchContextObject(obj); + if (queryId) + m_objectTreeQueryIds << queryId; } - foreach (const QDeclarativeDebugContextReference& child, context.contexts()) { - fetchContextObjectRecursive(child); + foreach (const QmlDebugContextReference& child, context.contexts()) { + fetchContextObjectRecursive(child, false); } } - -void ClientProxy::objectTreeFetched(QmlJsDebugClient::QDeclarativeDebugQuery::State state) +void ClientProxy::insertObjectInTreeIfNeeded(const QmlDebugObjectReference &object) { - QDeclarativeDebugObjectQuery *query = qobject_cast<QDeclarativeDebugObjectQuery *>(sender()); - if (!query || state == QDeclarativeDebugQuery::Error) { - delete query; + if (!m_rootObjects.contains(object)) return; + int count = m_rootObjects.count(); + for (int i = 0; i < count; i++) { + if (m_rootObjects[i].parentId() < 0 && m_rootObjects[i].insertObjectInTree(object)) { + m_rootObjects.removeOne(object); + break; + } } +} - log(LogReceive, QString("FETCH_OBJECT_R %1").arg(query->object().idString())); +void ClientProxy::onResult(quint32 queryId, const QVariant &value, const QByteArray &type) +{ + if (type == "FETCH_OBJECT_R") { + log(LogReceive, QString("FETCH_OBJECT_R %1").arg( + qvariant_cast<QmlDebugObjectReference>(value).idString())); + } else { + log(LogReceive, QLatin1String(type)); + } - m_rootObjects.append(query->object()); + if (m_objectTreeQueryIds.contains(queryId)) + objectTreeFetched(queryId, value); + else if (queryId == m_engineQueryId) + updateEngineList(value); + else if (queryId == m_contextQueryId) + contextChanged(value); + else if (m_fetchCurrentObjectsQueryIds.contains(queryId)) + onCurrentObjectsFetched(queryId, value); + else + emit result(queryId, value); +} - int removed = m_objectTreeQuery.removeAll(query); - Q_ASSERT(removed == 1); - Q_UNUSED(removed); - delete query; +void ClientProxy::objectTreeFetched(quint32 queryId, const QVariant &result) +{ + QmlDebugObjectReference obj = qvariant_cast<QmlDebugObjectReference>(result); + m_rootObjects.append(obj); - if (m_objectTreeQuery.isEmpty()) { + m_objectTreeQueryIds.removeOne(queryId); + if (m_objectTreeQueryIds.isEmpty()) { int old_count = m_debugIdHash.count(); m_debugIdHash.clear(); m_debugIdHash.reserve(old_count + 1); - foreach (const QDeclarativeDebugObjectReference &it, m_rootObjects) + foreach (const QmlDebugObjectReference &it, m_rootObjects) buildDebugIdHashRecursive(it); emit objectTreeUpdated(); @@ -530,14 +584,15 @@ void ClientProxy::objectTreeFetched(QmlJsDebugClient::QDeclarativeDebugQuery::St } } -void ClientProxy::buildDebugIdHashRecursive(const QDeclarativeDebugObjectReference& ref) +void ClientProxy::buildDebugIdHashRecursive(const QmlDebugObjectReference& ref) { QUrl fileUrl = ref.source().url(); int lineNum = ref.source().lineNumber(); int colNum = ref.source().columnNumber(); 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+)$"); if (rx.exactMatch(fileUrl.path())) { fileUrl.setPath(rx.cap(1)); @@ -548,9 +603,10 @@ void ClientProxy::buildDebugIdHashRecursive(const QDeclarativeDebugObjectReferen const QString filePath = InspectorUi::instance()->findFileInProject(fileUrl); // 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); } @@ -579,12 +635,6 @@ void ClientProxy::setAnimationPaused(bool paused) m_inspectorClient->setAnimationPaused(paused); } -void ClientProxy::changeToColorPickerTool() -{ - if (isConnected()) - m_inspectorClient->changeToColorPickerTool(); -} - void ClientProxy::changeToZoomTool() { if (isConnected()) @@ -609,10 +659,12 @@ void ClientProxy::showAppOnTop(bool showOnTop) } 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()) - m_inspectorClient->createQmlObject(qmlText, parentDebugId, imports, filename, order); + m_inspectorClient->createQmlObject(qmlText, parentDebugId, imports, + filename, order); } void ClientProxy::destroyQmlObject(int debugId) @@ -629,8 +681,10 @@ void ClientProxy::reparentQmlObject(int debugId, int newParent) void ClientProxy::updateConnected() { - bool isConnected = m_inspectorClient && m_inspectorClient->status() == QDeclarativeDebugClient::Enabled - && m_engineClient && m_engineClient->status() == QDeclarativeDebugClient::Enabled; + bool isConnected = m_inspectorClient && + m_inspectorClient->status() == QDeclarativeDebugClient::Enabled && + m_engineClient && + m_engineClient->status() == QDeclarativeDebugClient::Enabled; if (isConnected != m_isConnected) { m_isConnected = isConnected; @@ -645,11 +699,6 @@ void ClientProxy::updateConnected() void ClientProxy::reloadEngines() { - if (m_engineQuery) { - emit connectionStatusMessage("[Inspector] Waiting for response to previous engine query"); - return; - } - if (!isConnected()) return; @@ -657,28 +706,18 @@ void ClientProxy::reloadEngines() log(LogSend, QString("LIST_ENGINES")); - m_engineQuery = m_engineClient->queryAvailableEngines(m_engineClient); - if (!m_engineQuery->isWaiting()) { - updateEngineList(); - } else { - connect(m_engineQuery, SIGNAL(stateChanged(QmlJsDebugClient::QDeclarativeDebugQuery::State)), - this, SLOT(updateEngineList())); - } + m_engineQueryId = m_engineClient->queryAvailableEngines(); } -QList<QDeclarativeDebugEngineReference> ClientProxy::engines() const +QList<QmlDebugEngineReference> ClientProxy::engines() const { return m_engines; } -void ClientProxy::updateEngineList() +void ClientProxy::updateEngineList(const QVariant &value) { - log(LogReceive, QString("LIST_ENGINES_R")); - - m_engines = m_engineQuery->engines(); - delete m_engineQuery; - m_engineQuery = 0; - + m_engines = qvariant_cast<QmlDebugEngineReferenceList>(value); + m_engineQueryId = 0; emit enginesChanged(); } @@ -695,6 +734,5 @@ bool ClientProxy::isConnected() const void ClientProxy::newObjects() { log(LogReceive, QString("OBJECT_CREATED")); - if (!m_requestObjectsTimer.isActive()) - m_requestObjectsTimer.start(); + refreshObjectTree(); } |