From ae8fb3800ac880bfa9805f9163709d96b66b7788 Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Thu, 14 Jan 2021 11:42:20 +0100 Subject: QQmlComponent: Avoid crash when setting initial properties in JS module In a JS module, we lack a qml context. Thus, we have to check whether qmlContext is null. In that case we use the engine's scriptContext('s ExecutionContext) instead. Fixes: QTBUG-90245 Change-Id: I337e9c7cade472f52fc81c93d1152ff59f8018a5 Reviewed-by: Ulf Hermann (cherry picked from commit e68b498424f63c1cb6151e4fc6bbc50bac584909) --- tests/auto/qml/qqmlcomponent/data/jsmodule/Dynamic.qml | 5 +++++ tests/auto/qml/qqmlcomponent/data/jsmodule/module.mjs | 6 ++++++ tests/auto/qml/qqmlcomponent/data/jsmodule/test.qml | 10 ++++++++++ tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp | 10 ++++++++++ 4 files changed, 31 insertions(+) create mode 100644 tests/auto/qml/qqmlcomponent/data/jsmodule/Dynamic.qml create mode 100644 tests/auto/qml/qqmlcomponent/data/jsmodule/module.mjs create mode 100644 tests/auto/qml/qqmlcomponent/data/jsmodule/test.qml (limited to 'tests') diff --git a/tests/auto/qml/qqmlcomponent/data/jsmodule/Dynamic.qml b/tests/auto/qml/qqmlcomponent/data/jsmodule/Dynamic.qml new file mode 100644 index 0000000000..0d894eb3fe --- /dev/null +++ b/tests/auto/qml/qqmlcomponent/data/jsmodule/Dynamic.qml @@ -0,0 +1,5 @@ +import QtQml + +QtObject { + property int value +} diff --git a/tests/auto/qml/qqmlcomponent/data/jsmodule/module.mjs b/tests/auto/qml/qqmlcomponent/data/jsmodule/module.mjs new file mode 100644 index 0000000000..3dd3507d45 --- /dev/null +++ b/tests/auto/qml/qqmlcomponent/data/jsmodule/module.mjs @@ -0,0 +1,6 @@ +export function withProp(root) { + const component = Qt.createComponent("data/jsmodule/Dynamic.qml"); + const el = component.createObject(root, { value: 42 }); + return el.value; +} + diff --git a/tests/auto/qml/qqmlcomponent/data/jsmodule/test.qml b/tests/auto/qml/qqmlcomponent/data/jsmodule/test.qml new file mode 100644 index 0000000000..123c857180 --- /dev/null +++ b/tests/auto/qml/qqmlcomponent/data/jsmodule/test.qml @@ -0,0 +1,10 @@ +import "./module.mjs" as MJ +import QtQml 2.15 + +QtObject { + id: root + property bool ok: false + Component.onCompleted: { + root.ok = MJ.withProp(root) == 42 + } +} diff --git a/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp b/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp index 36c13bb705..c4a1a6aea4 100644 --- a/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp +++ b/tests/auto/qml/qqmlcomponent/tst_qqmlcomponent.cpp @@ -125,6 +125,7 @@ private slots: void testRequiredProperties(); void testRequiredPropertiesFromQml(); void testSetInitialProperties(); + void createInsideJSModule(); private: QQmlEngine engine; @@ -832,6 +833,15 @@ void tst_qqmlcomponent::testSetInitialProperties() } } +void tst_qqmlcomponent::createInsideJSModule() +{ + QQmlEngine engine; + QQmlComponent component(&engine, testFileUrl("jsmodule/test.qml")); + QScopedPointer root(component.create()); + QVERIFY2(root, qPrintable(component.errorString())); + QVERIFY(root->property("ok").toBool()); +} + QTEST_MAIN(tst_qqmlcomponent) #include "tst_qqmlcomponent.moc" -- cgit v1.2.3