7#include <private/qqmldebugstatesdelegate_p.h>
8#include <private/qqmlboundsignal_p.h>
10#include <private/qqmlmetatype_p.h>
12#include <private/qqmlproperty_p.h>
13#include <private/qqmlbinding_p.h>
14#include <private/qqmlcontext_p.h>
15#include <private/qqmlvaluetype_p.h>
16#include <private/qqmlvmemetaobject_p.h>
17#include <private/qqmlexpression_p.h>
18#include <private/qqmlsignalnames_p.h>
20#include <QtCore/qdebug.h>
21#include <QtCore/qmetaobject.h>
22#include <QtCore/qfileinfo.h>
23#include <QtCore/qjsonvalue.h>
24#include <QtCore/qjsonobject.h>
25#include <QtCore/qjsonarray.h>
26#include <QtCore/qjsondocument.h>
28#include <private/qmetaobject_p.h>
29#include <private/qqmldebugconnector_p.h>
30#include <private/qversionedpacket_p.h>
62 const int valType =
static_cast<int>(
value.userType());
74 this, &QQmlEngineDebugServiceImpl::propertyChanged);
83 delete m_statesDelegate;
109 ds <<
data.valueTypeName <<
data.binding <<
data.hasNotifySignal;
118 >>
data.binding >>
data.hasNotifySignal;
139QQmlEngineDebugServiceImpl::propertyData(
QObject *
obj,
int propIdx)
154 rv.value = valueContents(prop.
read(
obj));
162 }
else if (rv.value.isValid()) {
173 if (
value.userType() == qMetaTypeId<QJSValue>())
176 const int metaTypeId = metaType.
id();
181 if (
value.userType() == QMetaType::QVariantList) {
191 if (
value.userType() == QMetaType::QVariantMap) {
195 contents.insert(
i.key(), valueContents(
i.value()));
199 switch (metaTypeId) {
200 case QMetaType::QRect:
201 case QMetaType::QRectF:
202 case QMetaType::QPoint:
203 case QMetaType::QPointF:
204 case QMetaType::QSize:
205 case QMetaType::QSizeF:
206 case QMetaType::QFont:
209 case QMetaType::QJsonValue:
210 return value.toJsonValue().toVariant();
211 case QMetaType::QJsonObject:
212 return value.toJsonObject().toVariantMap();
213 case QMetaType::QJsonArray:
214 return value.toJsonArray().toVariantList();
215 case QMetaType::QJsonDocument:
216 return value.toJsonDocument().toVariant();
221 int toStringIndex =
mo->indexOfMethod(
"toString()");
222 if (toStringIndex != -1) {
249 QObject *
object,
bool recur,
bool dumpProperties)
255 int childrenCount = children.
size();
256 for (
int ii = 0; ii < children.
size(); ++ii) {
257 if (qobject_cast<QQmlContext*>(children[ii]))
261 message << childrenCount << recur;
263 QList<QQmlObjectProperty> fakeProperties;
265 for (
int ii = 0; ii < children.
size(); ++ii) {
267 if (qobject_cast<QQmlContext*>(
child))
275 if (!dumpProperties) {
280 QList<int> propertyIndexes;
281 for (
int ii = 0; ii <
object->metaObject()->propertyCount(); ++ii) {
282 if (
object->metaObject()->property(ii).isScriptable())
283 propertyIndexes << ii;
287 if (ddata && ddata->signalHandlers) {
290 while (signalHandler) {
306 fakeProperties << prop;
308 signalHandler = nextSignal(signalHandler);
312 message << int(propertyIndexes.size() + fakeProperties.size());
314 for (
int ii = 0; ii < propertyIndexes.size(); ++ii)
315 message << propertyData(
object, propertyIndexes.at(ii));
317 for (
int ii = 0; ii < fakeProperties.size(); ++ii)
321void QQmlEngineDebugServiceImpl::prepareDeferredObjects(
QObject *
obj)
326 for (
int ii = 0; ii < children.
size(); ++ii) {
328 prepareDeferredObjects(
child);
333void QQmlEngineDebugServiceImpl::storeObjectIds(
QObject *co)
337 for (
int ii = 0; ii < children.
size(); ++ii)
338 storeObjectIds(children.
at(ii));
343 const QList<QPointer<QObject> > &instances)
359 QQmlRefPointer<QQmlContextData>
child =
p->childContexts();
367 child =
p->childContexts();
369 buildObjectList(
message,
child->asQQmlContext(), instances);
374 for (
int ii = 0; ii < instances.size(); ++ii) {
376 if (
data->context ==
p.data())
381 for (
int ii = 0; ii < instances.size(); ++ii) {
383 if (
data->context ==
p.data())
384 message << objectData(instances.at(ii));
388void QQmlEngineDebugServiceImpl::buildStatesList(
bool cleanList,
389 const QList<QPointer<QObject> > &instances)
392 delegate->buildStatesList(cleanList, instances);
396QQmlEngineDebugServiceImpl::objectData(
QObject *
object)
400 if (ddata && ddata->outerContext) {
401 rv.
url = ddata->outerContext->
url();
402 rv.lineNumber = ddata->lineNumber;
403 rv.columnNumber = ddata->columnNumber;
406 rv.columnNumber = -1;
413 rv.objectName =
object->objectName();
429QList<QObject*> QQmlEngineDebugServiceImpl::objectForLocationInfo(
const QString &filename,
430 int lineNumber,
int columnNumber)
432 QList<QObject *> objects;
433 const QHash<int, QObject *> &
hash = objectsForIds();
436 if (ddata && ddata->outerContext && ddata->outerContext->isValid()) {
438 ddata->lineNumber == lineNumber &&
439 ddata->columnNumber >= columnNumber) {
440 objects <<
i.value();
457 if (
type ==
"LIST_ENGINES") {
461 for (
int ii = 0; ii < m_engines.
size(); ++ii) {
467 rs << engineName << engineId;
470 }
else if (
type ==
"LIST_OBJECTS") {
482 ctxtPriv->cleanInstances();
483 const QList<QPointer<QObject>> instances = ctxtPriv->instances();
484 buildObjectList(rs, rootContext, instances);
485 buildStatesList(
true, instances);
488 }
else if (
type ==
"FETCH_OBJECT") {
491 bool dumpProperties =
true;
493 ds >> objectId >> recurse >> dumpProperties;
501 prepareDeferredObjects(
object);
502 buildObjectDump(rs,
object, recurse, dumpProperties);
505 }
else if (
type ==
"FETCH_OBJECTS_FOR_LOCATION") {
510 bool dumpProperties =
true;
512 ds >>
file >> lineNumber >> columnNumber >> recurse >> dumpProperties;
514 const QList<QObject*> objects = objectForLocationInfo(
file, lineNumber, columnNumber);
517 << int(objects.size());
519 for (
QObject *
object : objects) {
521 prepareDeferredObjects(
object);
522 buildObjectDump(rs,
object, recurse, dumpProperties);
525 }
else if (
type ==
"WATCH_OBJECT") {
533 }
else if (
type ==
"WATCH_PROPERTY") {
542 }
else if (
type ==
"WATCH_EXPR_OBJECT") {
546 ds >> debugId >> expr;
551 }
else if (
type ==
"NO_WATCH") {
556 }
else if (
type ==
"EVAL_EXPRESSION") {
560 ds >> objectId >> expr;
576 bool undefined =
false;
588 }
else if (
type ==
"SET_BINDING") {
595 ds >> objectId >> propertyName >> expr >> isLiteralValue >>
597 bool ok = setBinding(objectId, propertyName, expr, isLiteralValue,
602 }
else if (
type ==
"RESET_BINDING") {
605 ds >> objectId >> propertyName;
606 bool ok = resetBinding(objectId, propertyName);
610 }
else if (
type ==
"SET_METHOD_BODY") {
615 bool ok = setMethodBody(objectId,
methodName, methodBody);
620 emit messageToClient(
name(), rs.data());
623bool QQmlEngineDebugServiceImpl::setBinding(
int objectId,
639 bool inBaseState =
true;
646 if (isLiteralValue) {
647 property.write(expression);
660 qWarning() <<
"QQmlEngineDebugService::setBinding: unable to set property" << propertyName <<
"on object" <<
object;
667 ok = delegate->setBindingForInvalidProperty(
object, propertyName, expression, isLiteralValue);
669 qWarning() <<
"QQmlEngineDebugService::setBinding: unable to set property" << propertyName <<
"on object" <<
object;
675bool QQmlEngineDebugServiceImpl::resetBinding(
int objectId,
const QString &propertyName)
682 const int idx = parentPropertyRef.indexOf(
QLatin1Char(
'.'));
684 parentPropertyRef = parentPropertyRef.left(idx);
686 const QByteArray parentProperty = parentPropertyRef.toLatin1();
687 if (
object->property(parentProperty).isValid()) {
699 if (objType.isValid()) {
700 if (
QObject *emptyObject = objType.create()) {
701 if (emptyObject->property(parentProperty).isValid()) {
704 setBinding(objectId, propertyName, defaultValue,
true);
721 delegate->resetBindingForInvalidProperty(
object, propertyName);
731bool QQmlEngineDebugServiceImpl::setMethodBody(
int objectId,
const QString &
method,
const QString &body)
749 for (
int ii = 0; ii < paramNames.size(); ++ii) {
765 scope, vmeMetaObject->vmeMethod(prop->
coreIndex()));
766 if (oldMethod && oldMethod->d()->function)
767 lineNumber = oldMethod->d()->function->compiledFunction->location.line();
770 vmeMetaObject->setVmeMethod(prop->
coreIndex(),
v);
774void QQmlEngineDebugServiceImpl::propertyChanged(
779 emit messageToClient(
name(), rs.data());
813 rs <<
QByteArray(
"OBJECT_CREATED") <<
qint32(-1) << engineId << objectId << parentId;
814 emit messageToClient(
name(), rs.data());
819#include "moc_qqmlenginedebugservice.cpp"
qint64 writeData(const char *data, qint64 len) final
Writes up to maxSize bytes from data to the device.
qint64 readData(char *data, qint64 maxlen) final
Reads up to maxSize bytes from the device into data, and returns the number of bytes read or -1 if an...
\inmodule QtCore\reentrant
\inmodule QtCore \reentrant
virtual bool open(QIODeviceBase::OpenMode mode)
Opens the device and sets its OpenMode to mode.
The QJSEngine class provides an environment for evaluating JavaScript code.
QV4::ExecutionEngine * handle() const
The QJSValue class acts as a container for Qt/JavaScript data types.
qsizetype size() const noexcept
QList< T > toList() const noexcept
const_reference at(qsizetype i) const noexcept
qsizetype removeAll(const AT &t)
void append(parameter_type t)
const_iterator cend() const
const_iterator cbegin() const
QString objectName
the name of this object
void setTarget(const QQmlProperty &)
virtual QString expression() const
void update(QQmlPropertyData::WriteFlags flags=QQmlPropertyData::DontRemoveBinding)
static QQmlBinding * create(const QQmlPropertyData *, const QQmlScriptString &, QObject *, QQmlContext *)
QString expression() const
QQmlBoundSignalExpression * expression() const
Returns the signal expression.
static QQmlRefPointer< QQmlContextData > get(QQmlContext *context)
static QQmlContextPrivate * get(QQmlContext *context)
The QQmlContext class defines a context within a QML engine.
bool isValid() const
Returns whether the context is valid.
QObject * contextObject() const
Return the context object, or \nullptr if there is no context object.
static QQmlData * get(QObjectPrivate *priv, bool create)
static int idForObject(QObject *)
Returns a unique id for object.
static QObject * objectForId(int id)
void objectCreated(QJSEngine *, QObject *) override
void engineAboutToBeAdded(QJSEngine *) override
void messageReceived(const QByteArray &) override
QQmlEngineDebugServiceImpl(QObject *=nullptr)
void scheduleMessage(const QByteArray &)
~QQmlEngineDebugServiceImpl()
void engineAboutToBeRemoved(QJSEngine *) override
QQmlDebugStatesDelegate * statesDelegate()
The QQmlEngine class provides an environment for instantiating QML components.
The QQmlExpression class evaluates JavaScript in a QML context.
QObject * scopeObject() const
static QV4::ReturnedValue evalFunction(const QQmlRefPointer< QQmlContextData > &ctxt, QObject *scope, const QString &code, const QString &filename, quint16 line)
const QQmlPropertyData * property(const K &key, QObject *object, const QQmlRefPointer< QQmlContextData > &context) const
bool isVMEFunction() const
static void takeSignalExpression(const QQmlProperty &that, QQmlBoundSignalExpression *)
Set the signal expression associated with this signal property to expr.
static void setBinding(QQmlAbstractBinding *binding, BindingFlags flags=None, QQmlPropertyData::WriteFlags writeFlags=QQmlPropertyData::DontRemoveBinding)
static void removeBinding(const QQmlProperty &that)
static void setSignalExpression(const QQmlProperty &that, QQmlBoundSignalExpression *)
Set the signal expression associated with this signal property to expr.
static QQmlPropertyPrivate * get(const QQmlProperty &p)
static QMetaMethod findSignalByName(const QMetaObject *mo, const QByteArray &)
Return the signal corresponding to name.
static QQmlAbstractBinding * binding(QObject *, QQmlPropertyIndex index)
The QQmlProperty class abstracts accessing properties on objects created from QML.
QVariant read() const
Returns the property value.
static QString signalNameToHandlerName(QAnyStringView signal)
static std::optional< QString > handlerNameToSignalName(QStringView handler)
bool addWatch(int id, quint32 objectId)
void propertyChanged(int id, int objectId, const QMetaProperty &property, const QVariant &value)
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString & append(QChar c)
QString url(FormattingOptions options=FormattingOptions(PrettyDecoded)) const
Returns a string representation of the URL.
bool isValid() const
Returns true if the storage type of this variant is not QMetaType::UnknownType; otherwise returns fal...
QString toString() const
Returns the variant as a QString if the variant has a userType() including, but not limited to:
QHash< int, QWidget * > hash
[35multi]
QMap< QString, QString > map
[6]
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char * method
static QString methodName(const QDBusIntrospection::Method &method)
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_RETURN_ARG(Type, data)
GLsizei const GLfloat * v
[13]
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint GLsizei const GLchar * message
GLenum GLenum GLsizei void GLsizei void * column
void qmlExecuteDeferred(QObject *object)
QQmlEngine * qmlEngine(const QObject *obj)
QQmlContext * qmlContext(const QObject *obj)
static bool isSaveable(const QVariant &value)
static bool hasValidSignal(QObject *object, const QString &propertyName)
QDataStream & operator>>(QDataStream &ds, QQmlEngineDebugServiceImpl::QQmlObjectData &data)
QDataStream & operator<<(QDataStream &ds, const QQmlEngineDebugServiceImpl::QQmlObjectData &data)
int objectForId(const ObjectContainer *objectContainer, const CompiledObject &component, int id)
QLatin1StringView QLatin1String
#define QStringLiteral(str)
static QVariant toVariant(const QV4::Value &value, QMetaType typeHint, JSToQVariantConversionBehavior conversionBehavior, V4ObjectSet *visitedObjects)
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection)
\inmodule QtCore \reentrant
bool contains(const AT &t) const noexcept