diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-11-22 12:53:33 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-12-04 15:19:09 +0100 |
commit | 84d950bc32aa63ffa727dd8aa6bf8a65d6154e1f (patch) | |
tree | 00035aba604c6da66a8fcd91290911a50ca643e8 /tests/auto | |
parent | f187c3e5c3261d4040e4c742e32d31025409063b (diff) |
QML: Let IDs in outer context override bound components' properties
This is necessary to make the usage of such IDs actually safe. If we let
local properties override outer IDs, then adding local properties in
later versions invalidates the ID lookups.
[ChangeLog][QtQml][Important Behavior Changes] In QML documents with
bound components, IDs defined in outer contexts override properties
defined in inner contexts now. This is how qmlcachegen has always
interpreted bound components when generating C++ code, and it is
required to make access to outer IDs actually safe. The interpreter and
JIT have previously preferred inner properties over outer IDs.
Pick-to: 6.6 6.5
Fixes: QTBUG-119162
Change-Id: Ic5d3cc3342b4518d3fde1b800efe1b95d8e8b210
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'tests/auto')
4 files changed, 33 insertions, 1 deletions
diff --git a/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt b/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt index f8b2dd8dba..3ae107628c 100644 --- a/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt +++ b/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt @@ -211,6 +211,7 @@ set(qml_files registerPropagation.qml registerelimination.qml revisions.qml + scopeIdLookup.qml scopeVsObject.qml script.js script.mjs diff --git a/tests/auto/qml/qmlcppcodegen/data/scopeIdLookup.qml b/tests/auto/qml/qmlcppcodegen/data/scopeIdLookup.qml new file mode 100644 index 0000000000..e23f180598 --- /dev/null +++ b/tests/auto/qml/qmlcppcodegen/data/scopeIdLookup.qml @@ -0,0 +1,20 @@ +pragma ComponentBehavior: Bound + +import QtQml + +QtObject { + id: root + + property QtObject b: QtObject { + id: bar + objectName: "outer" + } + + property Instantiator i: Instantiator { + model: 1 + delegate: QtObject { + property QtObject bar: QtObject { objectName: "inner" } + Component.onCompleted: root.objectName = bar.objectName + } + } +} diff --git a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp index b341e1bb80..51f797b05b 100644 --- a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp +++ b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp @@ -181,6 +181,7 @@ private slots: void registerElimination(); void registerPropagation(); void revisions(); + void scopeIdLookup(); void scopeObjectDestruction(); void scopeVsObject(); void sequenceToIterable(); @@ -3746,6 +3747,16 @@ void tst_QmlCppCodegen::revisions() QCOMPARE(o->property("gotten").toInt(), 5); } +void tst_QmlCppCodegen::scopeIdLookup() +{ + QQmlEngine engine; + QQmlComponent component(&engine, QUrl(u"qrc:/qt/qml/TestTypes/scopeIdLookup.qml"_s)); + QVERIFY2(!component.isError(), component.errorString().toUtf8()); + QScopedPointer<QObject> object(component.create()); + QVERIFY(!object.isNull()); + QCOMPARE(object->property("objectName").toString(), u"outer"_s); +} + void tst_QmlCppCodegen::scopeObjectDestruction() { QQmlEngine engine; diff --git a/tests/auto/quickcontrols/controls/data/tst_stackview.qml b/tests/auto/quickcontrols/controls/data/tst_stackview.qml index 7dbe361cfc..098ee5903b 100644 --- a/tests/auto/quickcontrols/controls/data/tst_stackview.qml +++ b/tests/auto/quickcontrols/controls/data/tst_stackview.qml @@ -1801,7 +1801,7 @@ TestCase { StackView { id: stackView anchors.fill: parent - initialItem: cppComponent + initialItem: stackView.cppComponent property Component cppComponent: ComponentCreator.createComponent("import QtQuick; Rectangle { color: \"navajowhite\" }") } |