diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2022-11-18 18:14:19 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-11-23 08:17:47 +0000 |
commit | f284ba291766ae3aa6d52dc7402c74b6a1674ab4 (patch) | |
tree | 7ebfc0bd77b17dc6709c1a753ad98ff3adacec82 | |
parent | 5065c6de5af7687b6f825f83f37ecc9dffcf87cc (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>
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()); |