9#include <private/qpacket_p.h>
11#include <QJsonDocument>
20const char *
SEQ =
"seq";
39const char *
IDS =
"ids";
74const char *
OUT =
"out";
80const char *
ALL =
"all";
86 jsonVal.insert(QLatin1String(SEQ), d->seq++);
87 jsonVal.insert(QLatin1String(TYPE), QLatin1String(REQUEST));
92 QObject::connect(
this, &QQmlDebugClient::stateChanged,
93 this, [
this](State state) { d_func()->onStateChanged(state); });
104 d->sendMessage(CONNECT);
110 d->sendMessage(INTERRUPT);
125 if (action != Continue) {
129 args.insert(QLatin1String(
STEPACTION), QLatin1String(
IN));
140 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
143 d->sendMessage(V8REQUEST, jsonVal);
163 args.insert(QLatin1String(
FRAME), frame);
166 args.insert(QLatin1String(
CONTEXT), context);
168 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
170 d->sendMessage(V8REQUEST, jsonVal);
183 jsonVal.insert(QLatin1String(
COMMAND),(QLatin1String(
LOOKUP)));
188 for (
int handle : handles)
189 array.append(handle);
191 args.insert(QLatin1String(
HANDLES), array);
196 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
198 d->sendMessage(V8REQUEST, jsonVal);
217 args.insert(QLatin1String(
FROMFRAME), fromFrame);
220 args.insert(QLatin1String(
TOFRAME), toFrame);
223 args.insert(QLatin1String(
BOTTOM), bottom);
225 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
226 d->sendMessage(V8REQUEST, jsonVal);
238 jsonVal.insert(QLatin1String(
COMMAND), QLatin1String(
FRAME));
242 args.insert(QLatin1String(
NUMBER), number);
243 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
246 d->sendMessage(V8REQUEST, jsonVal);
259 jsonVal.insert(QLatin1String(
COMMAND), QLatin1String(
SCOPE));
263 args.insert(QLatin1String(
NUMBER), number);
265 if (frameNumber != -1)
266 args.insert(QLatin1String(
FRAMENUMBER), frameNumber);
268 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
271 d->sendMessage(V8REQUEST, jsonVal);
295 args.insert(QLatin1String(
TYPES), types);
302 args.insert(QLatin1String(
IDS), array);
308 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
309 d->sendMessage(V8REQUEST, jsonVal);
313 const QString &condition,
int ignoreCount)
334 args.insert(QLatin1String(
TARGET), target);
337 args.insert(QLatin1String(
LINE), line);
340 args.insert(QLatin1String(
COLUMN), column);
342 args.insert(QLatin1String(
ENABLED), enabled);
344 if (!condition.isEmpty())
345 args.insert(QLatin1String(
CONDITION), condition);
347 if (ignoreCount != -1)
348 args.insert(QLatin1String(
IGNORECOUNT), ignoreCount);
350 jsonVal.insert(QLatin1String(
ARGUMENTS),args);
351 d->sendMessage(V8REQUEST, jsonVal);
366 args.insert(QLatin1String(
BREAKPOINT), breakpoint);
367 jsonVal.insert(QLatin1String(
ARGUMENTS),args);
369 d->sendMessage(V8REQUEST, jsonVal);
385 args.insert(QLatin1String(
BREAKPOINT), breakpoint);
386 args.insert(QLatin1String(
ENABLED), enabled);
388 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
389 d->sendMessage(V8REQUEST, jsonVal);
407 args.insert(QLatin1String(
TYPE), QLatin1String(
ALL));
409 args.insert(QLatin1String(
TYPE), QLatin1String(
UNCAUGHT));
412 args.insert(QLatin1String(
ENABLED), enabled);
414 jsonVal.insert(QLatin1String(
ARGUMENTS), args);
415 d->sendMessage(V8REQUEST, jsonVal);
426 d->sendMessage(V8REQUEST, jsonVal);
431 Q_D(
const QV4DebugClient);
432 const QJsonObject value = QJsonDocument::fromJson(d->response).object();
434 value.value(QLatin1String(
COMMAND)).toString(),
435 value.value(QLatin1String(
"body"))
447 d->sendMessage(DISCONNECT, jsonVal);
452 if (state == QQmlDebugClient::Enabled)
459 QPacket ds(
connection()->currentDataStreamVersion(), data);
463 if (command ==
"V8DEBUG") {
465 ds >> type >> d->response;
474 const QJsonObject value = QJsonDocument::fromJson(d->response).object();
475 QString type = value.value(QLatin1String(
TYPE)).toString();
477 if (type == QLatin1String(
"response")) {
479 if (!value.value(QLatin1String(
"success")).toBool()) {
481 qDebug() <<
"Received success == false response from application:"
482 << value.value(QLatin1String(
"message")).toString();
486 QString debugCommand(value.value(QLatin1String(
COMMAND)).toString());
487 if (debugCommand == QLatin1String(
BACKTRACE) ||
488 debugCommand == QLatin1String(
LOOKUP) ||
490 debugCommand == QLatin1String(
EVALUATE) ||
491 debugCommand == QLatin1String(
VERSION) ||
496 debugCommand == QLatin1String(
FRAME) ||
497 debugCommand == QLatin1String(
SCOPE) ||
498 debugCommand == QLatin1String(
SCOPES) ||
499 debugCommand == QLatin1String(
SCRIPTS) ||
500 debugCommand == QLatin1String(
SOURCE) ||
507 }
else if (type == QLatin1String(
EVENT)) {
508 QString event(value.value(QLatin1String(
EVENT)).toString());
510 if (event == QLatin1String(
"break") || event == QLatin1String(
"exception"))
520 const QByteArray msg = packMessage(command, args);
521 if (q->state() == QQmlDebugClient::Enabled) {
524 sendBuffer.append(msg);
530 for (
const QByteArray &msg : std::as_const(sendBuffer))
537 QPacket rs(connection->currentDataStreamVersion());
538 QByteArray cmd =
"V8DEBUG";
539 rs << cmd << type << QJsonDocument(object).toJson(QJsonDocument::Compact);
545#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