diff --git a/src/plugins/debugger/qml/qmldebuggerclient.h b/src/plugins/debugger/qml/qmldebuggerclient.h index a1ceeafac52..984869cf098 100644 --- a/src/plugins/debugger/qml/qmldebuggerclient.h +++ b/src/plugins/debugger/qml/qmldebuggerclient.h @@ -62,9 +62,10 @@ public: virtual void activateFrame(int index) = 0; - virtual void insertBreakpoints(BreakHandler *handler, BreakpointModelId *id) = 0; - virtual void removeBreakpoints(BreakpointModelId *id) = 0; - virtual void setBreakpoints() = 0; + virtual void insertBreakpoint(BreakpointModelId id, BreakHandler *handler) = 0; + virtual void removeBreakpoint(BreakpointModelId id, BreakHandler *handler) = 0; + virtual void changeBreakpoint(BreakpointModelId id, BreakHandler *handler) = 0; + virtual void updateBreakpoints() = 0; virtual void assignValueInDebugger(const QByteArray expr, const quint64 &id, const QString &property, const QString value) = 0; @@ -75,7 +76,6 @@ public: virtual void synchronizeWatchers(const QStringList &watchers) = 0; virtual void expandObject(const QByteArray &iname, quint64 objectId) = 0; - virtual void sendPing() = 0; virtual void setEngine(QmlEngine *engine) = 0; diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 06a880e3655..06f4d53d1c4 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -491,8 +491,73 @@ void QmlEngine::selectThread(int index) Q_UNUSED(index) } +void QmlEngine::insertBreakpoint(BreakpointModelId id) +{ + BreakHandler *handler = breakHandler(); + BreakpointState state = handler->state(id); + QTC_ASSERT(state == BreakpointInsertRequested, qDebug() << id << this << state); + handler->notifyBreakpointInsertProceeding(id); + + if (d->m_adapter.activeDebuggerClient()) { + d->m_adapter.activeDebuggerClient()->insertBreakpoint(id,handler); + } else { + foreach (QmlDebuggerClient *client, d->m_adapter.debuggerClients()) { + client->insertBreakpoint(id,handler); + } + } + + if (handler->state(id) == BreakpointInsertProceeding) { + handler->notifyBreakpointInsertOk(id); + } +} + +void QmlEngine::removeBreakpoint(BreakpointModelId id) +{ + BreakHandler *handler = breakHandler(); + BreakpointState state = handler->state(id); + QTC_ASSERT(state == BreakpointRemoveRequested, qDebug() << id << this << state); + handler->notifyBreakpointRemoveProceeding(id); + + if (d->m_adapter.activeDebuggerClient()) { + d->m_adapter.activeDebuggerClient()->removeBreakpoint(id,handler); + } else { + foreach (QmlDebuggerClient *client, d->m_adapter.debuggerClients()) { + client->removeBreakpoint(id,handler); + } + } + + if (handler->state(id) == BreakpointRemoveProceeding) { + handler->notifyBreakpointRemoveOk(id); + } +} + +void QmlEngine::changeBreakpoint(BreakpointModelId id) +{ + BreakHandler *handler = breakHandler(); + BreakpointState state = handler->state(id); + QTC_ASSERT(state == BreakpointChangeRequested, qDebug() << id << this << state); + handler->notifyBreakpointChangeProceeding(id); + + if (d->m_adapter.activeDebuggerClient()) { + d->m_adapter.activeDebuggerClient()->changeBreakpoint(id,handler); + } else { + foreach (QmlDebuggerClient *client, d->m_adapter.debuggerClients()) { + client->changeBreakpoint(id,handler); + } + } + + if (handler->state(id) == BreakpointChangeProceeding) { + handler->notifyBreakpointChangeOk(id); + } +} + void QmlEngine::attemptBreakpointSynchronization() { + if (!stateAcceptsBreakpointChanges()) { + showMessage(_("BREAKPOINT SYNCHRONIZATION NOT POSSIBLE IN CURRENT STATE")); + return; + } + BreakHandler *handler = breakHandler(); foreach (BreakpointModelId id, handler->unclaimedBreakpointIds()) { @@ -501,45 +566,39 @@ void QmlEngine::attemptBreakpointSynchronization() handler->setEngine(id, this); } - QStringList breakPointsStr; foreach (BreakpointModelId id, handler->engineBreakpointIds(this)) { - if (handler->state(id) == BreakpointRemoveRequested) { - handler->notifyBreakpointRemoveProceeding(id); - if (d->m_adapter.activeDebuggerClient()) - d->m_adapter.activeDebuggerClient()->removeBreakpoints(&id); - else { - foreach (QmlDebuggerClient *client, d->m_adapter.debuggerClients()) { - client->removeBreakpoints(&id); - } - } - handler->notifyBreakpointRemoveOk(id); - } else { - if (handler->state(id) == BreakpointInsertRequested) { - handler->notifyBreakpointInsertProceeding(id); - } - if (d->m_adapter.activeDebuggerClient()) - d->m_adapter.activeDebuggerClient()->insertBreakpoints(handler,&id); - else { - foreach (QmlDebuggerClient *client, d->m_adapter.debuggerClients()) { - client->insertBreakpoints(handler,&id); - } - } - if (handler->state(id) == BreakpointInsertProceeding) { - handler->notifyBreakpointInsertOk(id); - } - breakPointsStr << QString("('%1' '%2' %3)").arg(QString(handler->functionName(id).toUtf8()), - QString(QUrl::fromLocalFile(handler->fileName(id)).toString().toUtf8()), QString::number(handler->lineNumber(id))); + switch (handler->state(id)) { + case BreakpointNew: + // Should not happen once claimed. + QTC_CHECK(false); + continue; + case BreakpointInsertRequested: + insertBreakpoint(id); + continue; + case BreakpointChangeRequested: + changeBreakpoint(id); + continue; + case BreakpointRemoveRequested: + removeBreakpoint(id); + continue; + case BreakpointChangeProceeding: + case BreakpointInsertProceeding: + case BreakpointRemoveProceeding: + case BreakpointInserted: + case BreakpointDead: + continue; } + QTC_ASSERT(false, qDebug() << "UNKNOWN STATE" << id << state()); } - logMessage(LogSend, QString("%1 [%2]").arg(QString("BREAKPOINTS"), breakPointsStr.join(", "))); + DebuggerEngine::attemptBreakpointSynchronization(); if (d->m_adapter.activeDebuggerClient()) { - d->m_adapter.activeDebuggerClient()->setBreakpoints(); - } - else { - foreach (QmlDebuggerClient *client, d->m_adapter.debuggerClients()) - client->setBreakpoints(); + d->m_adapter.activeDebuggerClient()->updateBreakpoints(); + } else { + foreach (QmlDebuggerClient *client, d->m_adapter.debuggerClients()) { + client->updateBreakpoints(); + } } } @@ -631,8 +690,7 @@ void QmlEngine::synchronizeWatchers() QString("WATCH_EXPRESSIONS"), watchedExpressions.join(", "))); if (d->m_adapter.activeDebuggerClient()) { d->m_adapter.activeDebuggerClient()->synchronizeWatchers(watchedExpressions); - } - else { + } else { foreach (QmlDebuggerClient *client, d->m_adapter.debuggerClients()) client->synchronizeWatchers(watchedExpressions); } diff --git a/src/plugins/debugger/qml/qmlengine.h b/src/plugins/debugger/qml/qmlengine.h index ae96ad1d261..25b9996b45d 100644 --- a/src/plugins/debugger/qml/qmlengine.h +++ b/src/plugins/debugger/qml/qmlengine.h @@ -107,6 +107,9 @@ private: void selectThread(int index); void attemptBreakpointSynchronization(); + void insertBreakpoint(BreakpointModelId id); + void removeBreakpoint(BreakpointModelId id); + void changeBreakpoint(BreakpointModelId id); bool acceptsBreakpoint(BreakpointModelId id) const; void assignValueInDebugger(const WatchData *data, diff --git a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp index b31840cc1a2..0e1d9a41234 100644 --- a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp +++ b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp @@ -197,33 +197,32 @@ void QmlV8DebuggerClient::activateFrame(int index) setLocals(index); } -void QmlV8DebuggerClient::insertBreakpoints(BreakHandler *handler, BreakpointModelId *id) +void QmlV8DebuggerClient::insertBreakpoint(BreakpointModelId id, BreakHandler *handler) { QByteArray request; JsonInputStream(request) << '{' << INITIALPARAMS ; JsonInputStream(request) << ',' << "command" << ':' << "setbreakpoint"; JsonInputStream(request) << ',' << "arguments" << ':' << '{'; - if (handler->breakpointData(*id).type == BreakpointByFileAndLine) { + if (handler->breakpointData(id).type == BreakpointByFileAndLine) { JsonInputStream(request) << "type" << ':' << "script"; - JsonInputStream(request) << ',' << "target" << ':' << QFileInfo(handler->fileName(*id)).fileName().toUtf8(); - JsonInputStream(request) << ',' << "line" << ':' << handler->lineNumber(*id) - 1; - } else if (handler->breakpointData(*id).type == BreakpointByFunction) { + JsonInputStream(request) << ',' << "target" << ':' << QFileInfo(handler->fileName(id)).fileName().toUtf8(); + JsonInputStream(request) << ',' << "line" << ':' << handler->lineNumber(id) - 1; + } else if (handler->breakpointData(id).type == BreakpointByFunction) { JsonInputStream(request) << "type" << ':' << "function"; - JsonInputStream(request) << ',' << "target" << ':' << handler->functionName(*id).toUtf8(); + JsonInputStream(request) << ',' << "target" << ':' << handler->functionName(id).toUtf8(); } JsonInputStream(request) << '}'; JsonInputStream(request) << '}'; - d->breakpointsSync.insert(d->sequence,*id); + d->breakpointsSync.insert(d->sequence,id); sendMessage(packMessage(request)); - } -void QmlV8DebuggerClient::removeBreakpoints(BreakpointModelId *id) +void QmlV8DebuggerClient::removeBreakpoint(BreakpointModelId id, BreakHandler * /*handler*/) { - QList breakpoints = d->breakpoints.values(*id); - d->breakpoints.remove(*id); + QList breakpoints = d->breakpoints.values(id); + d->breakpoints.remove(id); foreach (int bp, breakpoints) { QByteArray request; @@ -241,7 +240,11 @@ void QmlV8DebuggerClient::removeBreakpoints(BreakpointModelId *id) } } -void QmlV8DebuggerClient::setBreakpoints() +void QmlV8DebuggerClient::changeBreakpoint(BreakpointModelId /*id*/, BreakHandler * /*handler*/) +{ +} + +void QmlV8DebuggerClient::updateBreakpoints() { } @@ -318,17 +321,6 @@ void QmlV8DebuggerClient::expandObject(const QByteArray &iname, quint64 objectId } -void QmlV8DebuggerClient::sendPing() -{ - QByteArray request; - - JsonInputStream(request) << '{' << INITIALPARAMS ; - JsonInputStream(request) << ',' << "command" << ':' << "ping" << '}'; - - d->ping = d->sequence; - sendMessage(packMessage(request)); -} - void QmlV8DebuggerClient::backtrace() { QByteArray request; @@ -362,9 +354,7 @@ void QmlV8DebuggerClient::messageReceived(const QByteArray &data) } QString debugCommand(value.findChild("command").toVariant().toString()); - if (debugCommand == "pong") { - //DO NOTHING - } else if (debugCommand == "backtrace") { + if (debugCommand == "backtrace") { setStackFrames(response); } else if (debugCommand == "lookup") { diff --git a/src/plugins/debugger/qml/qmlv8debuggerclient.h b/src/plugins/debugger/qml/qmlv8debuggerclient.h index 870f07b78d9..f446bb65b0b 100644 --- a/src/plugins/debugger/qml/qmlv8debuggerclient.h +++ b/src/plugins/debugger/qml/qmlv8debuggerclient.h @@ -62,9 +62,10 @@ public: void activateFrame(int index); - void insertBreakpoints(BreakHandler *handler, BreakpointModelId *id); - void removeBreakpoints(BreakpointModelId *id); - void setBreakpoints(); + void insertBreakpoint(BreakpointModelId id, BreakHandler *handler); + void removeBreakpoint(BreakpointModelId id, BreakHandler *handler); + void changeBreakpoint(BreakpointModelId id, BreakHandler *handler); + void updateBreakpoints(); void assignValueInDebugger(const QByteArray expr, const quint64 &id, const QString &property, const QString value); @@ -75,7 +76,6 @@ public: void synchronizeWatchers(const QStringList &watchers); void expandObject(const QByteArray &iname, quint64 objectId); - void sendPing(); void setEngine(QmlEngine *engine); diff --git a/src/plugins/debugger/qml/qscriptdebuggerclient.cpp b/src/plugins/debugger/qml/qscriptdebuggerclient.cpp index 1318c81e106..bbeed2c99c6 100644 --- a/src/plugins/debugger/qml/qscriptdebuggerclient.cpp +++ b/src/plugins/debugger/qml/qscriptdebuggerclient.cpp @@ -202,21 +202,29 @@ void QScriptDebuggerClient::activateFrame(int index) sendMessage(reply); } -void QScriptDebuggerClient::insertBreakpoints(BreakHandler *handler, BreakpointModelId *id) +void QScriptDebuggerClient::insertBreakpoint(BreakpointModelId id, BreakHandler *handler) { JSAgentBreakpointData bp; - bp.fileUrl = QUrl::fromLocalFile(handler->fileName(*id)).toString().toUtf8(); - bp.lineNumber = handler->lineNumber(*id); - bp.functionName = handler->functionName(*id).toUtf8(); + bp.fileUrl = QUrl::fromLocalFile(handler->fileName(id)).toString().toUtf8(); + bp.lineNumber = handler->lineNumber(id); + bp.functionName = handler->functionName(id).toUtf8(); d->breakpoints.insert(bp); } -void QScriptDebuggerClient::removeBreakpoints(BreakpointModelId * /*id*/) +void QScriptDebuggerClient::removeBreakpoint(BreakpointModelId id, BreakHandler *handler) { - + JSAgentBreakpointData bp; + bp.fileUrl = QUrl::fromLocalFile(handler->fileName(id)).toString().toUtf8(); + bp.lineNumber = handler->lineNumber(id); + bp.functionName = handler->functionName(id).toUtf8(); + d->breakpoints.remove(bp); } -void QScriptDebuggerClient::setBreakpoints() +void QScriptDebuggerClient::changeBreakpoint(BreakpointModelId /*id*/, BreakHandler * /*handler*/) +{ +} + +void QScriptDebuggerClient::updateBreakpoints() { QByteArray reply; QDataStream rs(&reply, QIODevice::WriteOnly); @@ -224,8 +232,6 @@ void QScriptDebuggerClient::setBreakpoints() rs << cmd << d->breakpoints; sendMessage(reply); - - d->breakpoints.clear(); } void QScriptDebuggerClient::assignValueInDebugger(const QByteArray expr, const quint64 &id, diff --git a/src/plugins/debugger/qml/qscriptdebuggerclient.h b/src/plugins/debugger/qml/qscriptdebuggerclient.h index d8b69353503..9cc5c40cef1 100644 --- a/src/plugins/debugger/qml/qscriptdebuggerclient.h +++ b/src/plugins/debugger/qml/qscriptdebuggerclient.h @@ -61,9 +61,10 @@ public: void activateFrame(int index); - void insertBreakpoints(BreakHandler *handler, BreakpointModelId *id); - void removeBreakpoints(BreakpointModelId *id); - void setBreakpoints(); + void insertBreakpoint(BreakpointModelId id, BreakHandler *handler); + void removeBreakpoint(BreakpointModelId id, BreakHandler *handler); + void changeBreakpoint(BreakpointModelId id, BreakHandler *handler); + void updateBreakpoints(); void assignValueInDebugger(const QByteArray expr, const quint64 &id, const QString &property, const QString value); @@ -74,7 +75,6 @@ public: void synchronizeWatchers(const QStringList &watchers); void expandObject(const QByteArray &iname, quint64 objectId); - void sendPing(); void setEngine(QmlEngine *engine); @@ -84,6 +84,9 @@ signals: protected: void messageReceived(const QByteArray &data); +private: + void sendPing(); + private: QScriptDebuggerClientPrivate *d; friend class QScriptDebuggerClientPrivate;