8#include <private/qpacket_p.h>
10#include <QJsonDocument>
19const char *
SEQ =
"seq";
38const char *
IDS =
"ids";
73const char *
OUT =
"out";
79const char *
ALL =
"all";
85 jsonVal.insert(QLatin1String(SEQ), d->seq++);
86 jsonVal.insert(QLatin1String(TYPE), QLatin1String(REQUEST));
91 QObject::connect(
this, &QQmlDebugClient::stateChanged,
92 this, [
this](State state) { d_func()->onStateChanged(state); });
103 d->sendMessage(CONNECT);
109 d->sendMessage(INTERRUPT);
124 if (action != Continue) {
128 args.insert(QLatin1String(
STEPACTION), QLatin1String(
IN));
139 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
142 d->sendMessage(V8REQUEST, jsonVal);
162 args.insert(QLatin1String(
FRAME), frame);
165 args.insert(QLatin1String(
CONTEXT), context);
167 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
169 d->sendMessage(V8REQUEST, jsonVal);
182 jsonVal.insert(QLatin1String(
COMMAND),(QLatin1String(
LOOKUP)));
187 for (
int handle : handles)
188 array.append(handle);
190 args.insert(QLatin1String(
HANDLES), array);
195 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
197 d->sendMessage(V8REQUEST, jsonVal);
216 args.insert(QLatin1String(
FROMFRAME), fromFrame);
219 args.insert(QLatin1String(
TOFRAME), toFrame);
222 args.insert(QLatin1String(
BOTTOM), bottom);
224 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
225 d->sendMessage(V8REQUEST, jsonVal);
237 jsonVal.insert(QLatin1String(
COMMAND), QLatin1String(
FRAME));
241 args.insert(QLatin1String(
NUMBER), number);
242 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
245 d->sendMessage(V8REQUEST, jsonVal);
258 jsonVal.insert(QLatin1String(
COMMAND), QLatin1String(
SCOPE));
262 args.insert(QLatin1String(
NUMBER), number);
264 if (frameNumber != -1)
265 args.insert(QLatin1String(
FRAMENUMBER), frameNumber);
267 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
270 d->sendMessage(V8REQUEST, jsonVal);
294 args.insert(QLatin1String(
TYPES), types);
301 args.insert(QLatin1String(
IDS), array);
307 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
308 d->sendMessage(V8REQUEST, jsonVal);
312 const QString &condition,
int ignoreCount)
333 args.insert(QLatin1String(
TARGET), target);
336 args.insert(QLatin1String(
LINE), line);
339 args.insert(QLatin1String(
COLUMN), column);
341 args.insert(QLatin1String(
ENABLED), enabled);
343 if (!condition.isEmpty())
344 args.insert(QLatin1String(
CONDITION), condition);
346 if (ignoreCount != -1)
347 args.insert(QLatin1String(
IGNORECOUNT), ignoreCount);
349 jsonVal.insert(QLatin1String(
ARGUMENTS),args);
350 d->sendMessage(V8REQUEST, jsonVal);
365 args.insert(QLatin1String(
BREAKPOINT), breakpoint);
366 jsonVal.insert(QLatin1String(
ARGUMENTS),args);
368 d->sendMessage(V8REQUEST, jsonVal);
384 args.insert(QLatin1String(
BREAKPOINT), breakpoint);
385 args.insert(QLatin1String(
ENABLED), enabled);
387 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
388 d->sendMessage(V8REQUEST, jsonVal);
406 args.insert(QLatin1String(
TYPE), QLatin1String(
ALL));
408 args.insert(QLatin1String(
TYPE), QLatin1String(
UNCAUGHT));
411 args.insert(QLatin1String(
ENABLED), enabled);
413 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
414 d->sendMessage(V8REQUEST, jsonVal);
425 d->sendMessage(V8REQUEST, jsonVal);
430 Q_D(
const QV4DebugClient);
431 const QJsonObject value = QJsonDocument::fromJson(d->response).object();
433 value.value(QLatin1String(
COMMAND)).toString(),
434 value.value(QLatin1String(
"body"))
446 d->sendMessage(DISCONNECT, jsonVal);
451 if (state == QQmlDebugClient::Enabled)
458 QPacket ds(
connection()->currentDataStreamVersion(), data);
462 if (command ==
"V8DEBUG") {
464 ds >> type >> d->response;
473 const QJsonObject value = QJsonDocument::fromJson(d->response).object();
474 QString type = value.value(QLatin1String(
TYPE)).toString();
476 if (type == QLatin1String(
"response")) {
478 if (!value.value(QLatin1String(
"success")).toBool()) {
480 qDebug() <<
"Received success == false response from application:"
481 << value.value(QLatin1String(
"message")).toString();
485 QString debugCommand(value.value(QLatin1String(
COMMAND)).toString());
486 if (debugCommand == QLatin1String(
BACKTRACE) ||
487 debugCommand == QLatin1String(
LOOKUP) ||
489 debugCommand == QLatin1String(
EVALUATE) ||
490 debugCommand == QLatin1String(
VERSION) ||
495 debugCommand == QLatin1String(
FRAME) ||
496 debugCommand == QLatin1String(
SCOPE) ||
497 debugCommand == QLatin1String(
SCOPES) ||
498 debugCommand == QLatin1String(
SCRIPTS) ||
499 debugCommand == QLatin1String(
SOURCE) ||
506 }
else if (type == QLatin1String(
EVENT)) {
507 QString event(value.value(QLatin1String(
EVENT)).toString());
509 if (event == QLatin1String(
"break") || event == QLatin1String(
"exception"))
519 const QByteArray msg = packMessage(command, args);
520 if (q->state() == QQmlDebugClient::Enabled) {
523 sendBuffer.append(msg);
529 for (
const QByteArray &msg : std::as_const(sendBuffer))
536 QPacket rs(connection->currentDataStreamVersion());
537 QByteArray cmd =
"V8DEBUG";
538 rs << cmd << type << QJsonDocument(object).toJson(QJsonDocument::Compact);
544#include "moc_qv4debugclient_p.cpp"
QQmlDebugConnection * connection() const
void sendMessage(const QByteArray &command, const QJsonObject &args=QJsonObject())
QByteArray packMessage(const QByteArray &type, const QJsonObject &object)
void onStateChanged(QQmlDebugClient::State state)
void scripts(int types=4, const QList< int > &ids=QList< int >(), bool includeSource=false)
void frame(int number=-1)
void changeBreakpoint(int breakpoint, bool enabled)
QV4DebugClient(QQmlDebugConnection *connection)
void messageReceived(const QByteArray &data) override
void evaluate(const QString &expr, int frame=-1, int context=-1)
void setBreakpoint(const QString &target, int line=-1, int column=-1, bool enabled=true, const QString &condition=QString(), int ignoreCount=-1)
void lookup(const QList< int > &handles, bool includeSource=false)
void continueDebugging(StepAction stepAction)
void scope(int number=-1, int frameNumber=-1)
void setExceptionBreak(Exception type, bool enabled=false)
Response response() const
void backtrace(int fromFrame=-1, int toFrame=-1, bool bottom=false)
void clearBreakpoint(int breakpoint)
Combined button and popup list for selecting options.
const char * SETEXCEPTIONBREAK
const char * CLEARBREAKPOINT
const char * SCRIPTREGEXP
QT_BEGIN_NAMESPACE const char * V8REQUEST
const char * GARBAGECOLLECTOR
const char * CONTINEDEBUGGING
const char * CHANGEBREAKPOINT
const char * INCLUDESOURCE
const char * SETBREAKPOINT
const char * DISABLEBREAK