From e8c9ae337dcdc9ee623e52261a8109c4d8b37e50 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 8 Oct 2025 12:51:11 +0200 Subject: [PATCH] Tooling: Also clear singletons when resetting preview If we don't drop the singletons, any changes to them won't be picked up. Fixes: QTBUG-140914 Change-Id: I66e240574f8ca3a44a1f39177fc7fe4de8f9b468 Reviewed-by: Sami Shalayel (cherry picked from commit 65dd594833c4f53a75dbefc018a0bdb8f52794e2) Reviewed-by: Qt Cherry-pick Bot --- .../qmldbg_preview/qqmlpreviewhandler.cpp | 1 + .../qml/debugger/qqmlpreview/data/M/S.qml | 6 +++++ .../qml/debugger/qqmlpreview/data/M/qmldir | 2 ++ .../qqmlpreview/data/singletonUser.qml | 7 ++++++ .../debugger/qqmlpreview/tst_qqmlpreview.cpp | 25 +++++++++++++++++++ 5 files changed, 41 insertions(+) create mode 100644 tests/auto/qml/debugger/qqmlpreview/data/M/S.qml create mode 100644 tests/auto/qml/debugger/qqmlpreview/data/M/qmldir create mode 100644 tests/auto/qml/debugger/qqmlpreview/data/singletonUser.qml diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.cpp b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.cpp index 7d7fa0dec0..93d74ea88c 100644 --- a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.cpp +++ b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewhandler.cpp @@ -119,6 +119,7 @@ void QQmlPreviewHandler::loadUrl(const QUrl &url) m_lastPosition.loadWindowPositionSettings(url); QQmlEngine *engine = m_engines.front(); + engine->clearSingletons(); engine->clearComponentCache(); m_component.reset(new QQmlComponent(engine, url, this)); diff --git a/tests/auto/qml/debugger/qqmlpreview/data/M/S.qml b/tests/auto/qml/debugger/qqmlpreview/data/M/S.qml new file mode 100644 index 0000000000..095986f565 --- /dev/null +++ b/tests/auto/qml/debugger/qqmlpreview/data/M/S.qml @@ -0,0 +1,6 @@ +pragma Singleton +import QtQml + +QtObject { + property int col: 0 +} diff --git a/tests/auto/qml/debugger/qqmlpreview/data/M/qmldir b/tests/auto/qml/debugger/qqmlpreview/data/M/qmldir new file mode 100644 index 0000000000..621664fb8d --- /dev/null +++ b/tests/auto/qml/debugger/qqmlpreview/data/M/qmldir @@ -0,0 +1,2 @@ +module M +singleton S 1.0 S.qml diff --git a/tests/auto/qml/debugger/qqmlpreview/data/singletonUser.qml b/tests/auto/qml/debugger/qqmlpreview/data/singletonUser.qml new file mode 100644 index 0000000000..b04299473b --- /dev/null +++ b/tests/auto/qml/debugger/qqmlpreview/data/singletonUser.qml @@ -0,0 +1,7 @@ +import QtQuick +import M + +Window { + objectName: S.col + Component.onCompleted: console.log("col", objectName) +} diff --git a/tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp b/tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp index fb47d69d20..201d57663a 100644 --- a/tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp +++ b/tests/auto/qml/debugger/qqmlpreview/tst_qqmlpreview.cpp @@ -54,6 +54,7 @@ private slots: void unhandledFiles(); void updateFile(); void qqcStyleSelection(); + void singleton(); }; tst_QQmlPreview::tst_QQmlPreview() @@ -443,6 +444,30 @@ void tst_QQmlPreview::qqcStyleSelection() QVERIFY(m_serviceErrors.isEmpty()); } +void tst_QQmlPreview::singleton() +{ + const QString file("singletonUser.qml"); + QCOMPARE(startQmlProcess(file, {"QML_IMPORT_PATH=" + dataDirectory()}), ConnectSuccess); + QVERIFY(m_client); + QTRY_COMPARE(m_client->state(), QQmlDebugClient::Enabled); + m_client->triggerLoad(testFileUrl(file)); + QTRY_VERIFY(m_files.contains(testFile(file))); + verifyProcessOutputContains("col 0"); + + QFile input(testFile("M/S.qml")); + QVERIFY(input.open(QIODevice::ReadOnly)); + QByteArray contents = input.readAll(); + contents.replace("0", "5"); + + serveFile(testFile("M/S.qml"), contents); + m_client->triggerLoad(testFileUrl(file)); + verifyProcessOutputContains("col 5"); + + m_process->stop(); + QTRY_COMPARE(m_client->state(), QQmlDebugClient::NotConnected); + QVERIFY(m_serviceErrors.isEmpty()); +} + QTEST_MAIN(tst_QQmlPreview) #include "tst_qqmlpreview.moc"