diff options
author | Andrei Golubev <andrei.golubev@qt.io> | 2021-01-15 16:46:59 +0100 |
---|---|---|
committer | Andrei Golubev <andrei.golubev@qt.io> | 2021-01-21 08:38:50 +0100 |
commit | 90be89d771425044a84e9e79e4e668e065acc825 (patch) | |
tree | 0c8d90aed1efb03391b062fcffd16a33dc8f6c64 /tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp | |
parent | 3c6b913123856c3ef198e51b99bed5841bd81aaf (diff) |
Use new QObjectPrivate connection mechanism in dynamic connections
Old API assumes sender == receiver, which results in wrong handling of
connections when receiver is deleted: connection is not removed or
notified elsehow as it's not really tied to a valid receiver
Task-number: QTBUG-86368
Pick-to: 5.15 6.0
Change-Id: I0f3115f1b0f26cf353752ba2b8fd88e0f3bdd388
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp')
-rw-r--r-- | tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp index 13b6ad7700..02d044aa63 100644 --- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp +++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp @@ -3500,6 +3500,46 @@ void tst_qqmlecmascript::scriptConnect() delete object; } + + { + QQmlComponent component(&engine, testFileUrl("scriptConnect.dynamic.1.qml")); + + QObject *object = component.create(); + QVERIFY(object != nullptr); + + QCOMPARE(object->property("test").toInt(), 0); + + QMetaObject::invokeMethod(object, "outer"); + QCOMPARE(object->property("test").toInt(), 1); + + // process the dynamic object deletion queried with deleteLater() + QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); + QCoreApplication::processEvents(); + + // after deletion, further invocations do not update the property + QMetaObject::invokeMethod(object, "outer"); + QCOMPARE(object->property("test").toInt(), 1); + + delete object; + } + + { + QQmlComponent component(&engine, testFileUrl("scriptConnect.dynamic.2.qml")); + + QObject *object = component.create(); + QVERIFY(object != nullptr); + + QCOMPARE(object->property("test").toInt(), 0); + QMetaObject::invokeMethod(object, "outer"); + QCOMPARE(object->property("test").toInt(), 1); + + // no need to manually process events here, as we disconnect explicitly + + QMetaObject::invokeMethod(object, "outer"); + QCOMPARE(object->property("test").toInt(), 1); + + delete object; + } } void tst_qqmlecmascript::scriptDisconnect() |