aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2022-11-18 18:14:19 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-11-23 08:17:47 +0000
commitf284ba291766ae3aa6d52dc7402c74b6a1674ab4 (patch)
tree7ebfc0bd77b17dc6709c1a753ad98ff3adacec82
parent5065c6de5af7687b6f825f83f37ecc9dffcf87cc (diff)
Don't crash on QQmlGadgetPtrWrapper instances in debug service
They have the confusing property of being a QObject but having a QMetaObject that says it's a Q_GADGET. Fixes: QTBUG-108646 Change-Id: I6df34c2004918cd89691f4b5eb4b6267dabcd7ff Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> (cherry picked from commit deda185ba95ffb99b1500364e2eba774e9dbc1e6) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp8
-rw-r--r--tests/auto/qml/debugger/qqmlenginedebugservice/data/fetchValueType.qml9
-rw-r--r--tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp22
3 files changed, 37 insertions, 2 deletions
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp
index 1fcc1e7772..578b07cb22 100644
--- a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp
+++ b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp
@@ -147,7 +147,8 @@ QQmlEngineDebugServiceImpl::propertyData(QObject *obj, int propIdx)
{
QQmlObjectProperty rv;
- QMetaProperty prop = obj->metaObject()->property(propIdx);
+ const QMetaObject *metaObject = obj->metaObject();
+ QMetaProperty prop = metaObject->property(propIdx);
rv.type = QQmlObjectProperty::Unknown;
rv.valueTypeName = QString::fromUtf8(prop.typeName());
@@ -158,7 +159,10 @@ QQmlEngineDebugServiceImpl::propertyData(QObject *obj, int propIdx)
if (binding)
rv.binding = binding->expression();
- rv.value = valueContents(prop.read(obj));
+ if (metaObject->metaType().flags().testFlag(QMetaType::IsGadget))
+ rv.value = valueContents(static_cast<QQmlGadgetPtrWrapper *>(obj)->readOnGadget(prop));
+ else
+ rv.value = valueContents(prop.read(obj));
if (prop.metaType().flags().testFlag(QMetaType::PointerToQObject)) {
rv.type = QQmlObjectProperty::Object;
diff --git a/tests/auto/qml/debugger/qqmlenginedebugservice/data/fetchValueType.qml b/tests/auto/qml/debugger/qqmlenginedebugservice/data/fetchValueType.qml
new file mode 100644
index 0000000000..ea0c3ff8c0
--- /dev/null
+++ b/tests/auto/qml/debugger/qqmlenginedebugservice/data/fetchValueType.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+import QtQuick
+import QtQuick.Controls
+
+Item {
+ Button {}
+}
diff --git a/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp b/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp
index ffde808bb4..467ebda91b 100644
--- a/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp
+++ b/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp
@@ -21,6 +21,7 @@
#include <QtQml/qqmlexpression.h>
#include <QtQml/qqmlproperty.h>
#include <QtQml/qqmlincubator.h>
+#include <QtQml/qqmlapplicationengine.h>
#include <QtQuick/qquickitem.h>
#include <QtNetwork/qhostaddress.h>
@@ -161,6 +162,7 @@ private slots:
void asynchronousCreate();
void invalidContexts();
void createObjectOnDestruction();
+ void fetchValueType();
};
QQmlEngineDebugObjectReference tst_QQmlEngineDebugService::findRootObject(
@@ -1358,6 +1360,26 @@ void tst_QQmlEngineDebugService::createObjectOnDestruction()
QCOMPARE(spy.size(), 2);
}
+void tst_QQmlEngineDebugService::fetchValueType()
+{
+ QQmlApplicationEngine engine;
+ engine.load(testFileUrl("fetchValueType.qml"));
+
+
+ bool success = false;
+ m_dbg->queryAvailableEngines(&success);
+ QVERIFY(success);
+ QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result())));
+ QVERIFY(m_dbg->engines().size() > 1);
+
+ QQmlEngineDebugObjectReference object;
+ object.debugId = QQmlDebugService::idForObject(&engine);
+ m_dbg->queryObjectRecursive(object, &success);
+ QVERIFY(success);
+ QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result())));
+
+}
+
void tst_QQmlEngineDebugService::debuggerCrashOnAttach() {
QQmlEngineDebugObjectReference obj = findRootObject(6);
QVERIFY(!obj.className.isEmpty());