diff options
author | Colin Ogilvie <colin.ogilvie@kdab.com> | 2017-06-02 11:35:07 +0100 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2018-07-05 19:59:37 +0000 |
commit | d6a5e14cdd3f233f5df4419c51b1c273b6ea9fe3 (patch) | |
tree | 7d043e117139178735a06dfaceee047cd5c91578 /tests | |
parent | df8d59e4b4a486c189263d008d69e4f6c2467d12 (diff) |
Don't leak components in QQuickLoader
Only create source component in loadFromSource if it does not already exist.
Previously toggling the active status when loading from source would create
a new source component every time active became true.
[ChangeLog][QtQuick][Loader] Don't leak components when changing source url.
Change-Id: I1e4cfd5613e3851fcb4f3f55e78981f7c070cc77
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/quick/qquickloader/tst_qquickloader.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/auto/quick/qquickloader/tst_qquickloader.cpp b/tests/auto/quick/qquickloader/tst_qquickloader.cpp index 7a176661e8..5c3729a8cd 100644 --- a/tests/auto/quick/qquickloader/tst_qquickloader.cpp +++ b/tests/auto/quick/qquickloader/tst_qquickloader.cpp @@ -126,6 +126,8 @@ private slots: void parentErrors(); void rootContext(); + void sourceURLKeepComponent(); + }; Q_DECLARE_METATYPE(QList<QQmlError>) @@ -1388,6 +1390,57 @@ void tst_QQuickLoader::rootContext() QCOMPARE(objectInRootContext.didIt, 2); } +void tst_QQuickLoader::sourceURLKeepComponent() +{ + QQmlEngine engine; + QQmlComponent component(&engine); + component.setData(QByteArray( + "import QtQuick 2.0\n" + " Loader { id: loader\n }"), + dataDirectoryUrl()); + + QScopedPointer<QQuickLoader> loader(qobject_cast<QQuickLoader*>(component.create())); + loader->setSource(testFileUrl("/Rect120x60.qml")); + + QVERIFY(loader); + QVERIFY(loader->item()); + QVERIFY(loader->sourceComponent()); + QCOMPARE(loader->progress(), 1.0); + + const QPointer<QQmlComponent> sourceComponent = loader->sourceComponent(); + + //Ensure toggling active status does not recreate component + loader->setActive(false); + QVERIFY(!loader->item()); + QVERIFY(loader->sourceComponent()); + QCOMPARE(sourceComponent.data(), loader->sourceComponent()); + + loader->setActive(true); + QVERIFY(loader->item()); + QVERIFY(loader->sourceComponent()); + QCOMPARE(sourceComponent.data(), loader->sourceComponent()); + + loader->setActive(false); + QVERIFY(!loader->item()); + QVERIFY(loader->sourceComponent()); + QCOMPARE(sourceComponent.data(), loader->sourceComponent()); + + //Ensure changing source url causes component to be recreated when inactive + loader->setSource(testFileUrl("/BlueRect.qml")); + + loader->setActive(true); + QVERIFY(loader->item()); + QVERIFY(loader->sourceComponent()); + + const QPointer<QQmlComponent> newSourceComponent = loader->sourceComponent(); + QVERIFY(sourceComponent.data() != newSourceComponent.data()); + + //Ensure changing source url causes component to be recreated when active + loader->setSource(testFileUrl("/Rect120x60.qml")); + QVERIFY(loader->sourceComponent() != newSourceComponent.data()); + +} + QTEST_MAIN(tst_QQuickLoader) #include "tst_qquickloader.moc" |