From 5366f0a999e720b043cd060376b29ea25dc43621 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Mon, 6 Jun 2022 14:22:49 +0800 Subject: tst_qquicklistview: fix some TypeErrors and ReferenceErrors - Ensure that context properties outlive the view. - Ensure that delegates don't unconditionally reference properties of the parent (which may be null). - Add missing TestObject and test model. Task-number: QTBUG-98718 Change-Id: Icaf3c6824674819c88fc7be51932e6d7e5fb205a Reviewed-by: Richard Moe Gustavsen (cherry picked from commit e58626a02b7431b06333429aae80c6d23f904ddc) Reviewed-by: Qt Cherry-pick Bot --- .../auto/quick/qquicklistview/data/headerCrash.qml | 2 +- .../data/outsideViewportChangeNotAffectingView.qml | 2 +- .../quick/qquicklistview/tst_qquicklistview.cpp | 86 +++++++++++++++------- 3 files changed, 60 insertions(+), 30 deletions(-) diff --git a/tests/auto/quick/qquicklistview/data/headerCrash.qml b/tests/auto/quick/qquicklistview/data/headerCrash.qml index 124fa894f2..972ecb2906 100644 --- a/tests/auto/quick/qquicklistview/data/headerCrash.qml +++ b/tests/auto/quick/qquicklistview/data/headerCrash.qml @@ -12,7 +12,7 @@ ListView { } delegate: Rectangle { - width: parent.width; height: 20 + width: myList.width; height: 20 color: index % 2 ? "green" : "red" } diff --git a/tests/auto/quick/qquicklistview/data/outsideViewportChangeNotAffectingView.qml b/tests/auto/quick/qquicklistview/data/outsideViewportChangeNotAffectingView.qml index e0acaf49e4..ef959b10b4 100644 --- a/tests/auto/quick/qquicklistview/data/outsideViewportChangeNotAffectingView.qml +++ b/tests/auto/quick/qquicklistview/data/outsideViewportChangeNotAffectingView.qml @@ -72,7 +72,7 @@ Item { ListElement { size: 300; } } delegate: Rectangle { - width: parent.width + width: list.width color: index % 2 == 0 ? "red" : "blue" height: size Text { anchors.centerIn: parent; text: index } diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index 54e8ea6b6b..486196989f 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -436,6 +436,9 @@ void tst_QQuickListView::cleanupTestCase() template void tst_QQuickListView::items(const QUrl &source) { + // Make sure we outlive the view, or the context property will become null. + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); T model; @@ -446,7 +449,6 @@ void tst_QQuickListView::items(const QUrl &source) QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(source); @@ -517,6 +519,8 @@ void tst_QQuickListView::items(const QUrl &source) template void tst_QQuickListView::changed(const QUrl &source) { + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); T model; @@ -527,7 +531,6 @@ void tst_QQuickListView::changed(const QUrl &source) QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(source); @@ -555,6 +558,8 @@ void tst_QQuickListView::changed(const QUrl &source) template void tst_QQuickListView::inserted(const QUrl &source) { + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); window->show(); QVERIFY(QTest::qWaitForWindowExposed(window.data())); @@ -567,7 +572,6 @@ void tst_QQuickListView::inserted(const QUrl &source) QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(source); @@ -659,11 +663,12 @@ void tst_QQuickListView::inserted_more(QQuickItemView::VerticalLayoutDirection v for (int i = 0; i < 30; i++) model.addItem("Item" + QString::number(i), ""); + QScopedPointer testObject(new TestObject); + QQuickView *window = getView(); QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("listviewtest.qml")); @@ -960,6 +965,8 @@ void tst_QQuickListView::insertBeforeVisible_data() template void tst_QQuickListView::removed(const QUrl &source, bool /* animated */) { + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); T model; @@ -969,7 +976,6 @@ void tst_QQuickListView::removed(const QUrl &source, bool /* animated */) QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(source); @@ -1323,6 +1329,8 @@ void tst_QQuickListView::removed_more_data() template void tst_QQuickListView::clear(const QUrl &source, QQuickItemView::VerticalLayoutDirection verticalLayoutDirection) { + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); T model; @@ -1332,7 +1340,6 @@ void tst_QQuickListView::clear(const QUrl &source, QQuickItemView::VerticalLayou QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(source); @@ -1855,6 +1862,8 @@ void tst_QQuickListView::multipleChanges_data() void tst_QQuickListView::swapWithFirstItem() { + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); QaimModel model; @@ -1864,7 +1873,6 @@ void tst_QQuickListView::swapWithFirstItem() QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("listviewtest.qml")); @@ -1883,6 +1891,8 @@ void tst_QQuickListView::swapWithFirstItem() void tst_QQuickListView::checkCountForMultiColumnModels() { + QScopedPointer testObject(new TestObject); + // Check that a list view will only load items for the first // column, even if the model reports that it got several columns. // We test this since QQmlDelegateModel has been changed to @@ -1900,7 +1910,6 @@ void tst_QQuickListView::checkCountForMultiColumnModels() QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("listviewtest.qml")); @@ -2037,6 +2046,8 @@ void tst_QQuickListView::enforceRange_withoutHighlight() void tst_QQuickListView::spacing() { + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); QaimModel model; @@ -2046,7 +2057,6 @@ void tst_QQuickListView::spacing() QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("listviewtest.qml")); @@ -2967,8 +2977,8 @@ void tst_QQuickListView::keyNavigation() for (int i = 0; i < 30; i++) model.addItem("Item" + QString::number(i), ""); - QQuickView *window = getView(); QScopedPointer testObject(new TestObject); + QQuickView *window = getView(); window->rootContext()->setContextProperty("testModel", &model); window->rootContext()->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("listviewtest.qml")); @@ -3172,6 +3182,8 @@ void tst_QQuickListView::itemListFlicker() void tst_QQuickListView::cacheBuffer() { + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); QaimModel model; @@ -3181,7 +3193,6 @@ void tst_QQuickListView::cacheBuffer() QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("listviewtest.qml")); @@ -3274,6 +3285,8 @@ void tst_QQuickListView::cacheBuffer() void tst_QQuickListView::positionViewAtBeginningEnd() { + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); QaimModel model; @@ -3283,7 +3296,6 @@ void tst_QQuickListView::positionViewAtBeginningEnd() QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->show(); window->setSource(testFileUrl("listviewtest.qml")); @@ -3332,6 +3344,8 @@ void tst_QQuickListView::positionViewAtIndex() QFETCH(QQuickListView::PositionMode, mode); QFETCH(qreal, contentY); + QScopedPointer testObject(new TestObject); + QQuickView *window = getView(); QaimModel model; @@ -3341,7 +3355,6 @@ void tst_QQuickListView::positionViewAtIndex() QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->show(); window->setSource(testFileUrl("listviewtest.qml")); @@ -3681,6 +3694,8 @@ void tst_QQuickListView::manualHighlight() void tst_QQuickListView::QTBUG_11105() { + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); QaimModel model; for (int i = 0; i < 30; i++) @@ -3689,7 +3704,6 @@ void tst_QQuickListView::QTBUG_11105() QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("listviewtest.qml")); @@ -4351,6 +4365,8 @@ void tst_QQuickListView::resetModel_headerFooter() void tst_QQuickListView::resizeView() { + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); QaimModel model; for (int i = 0; i < 40; i++) @@ -4359,7 +4375,6 @@ void tst_QQuickListView::resizeView() QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("listviewtest.qml")); @@ -4460,6 +4475,8 @@ void tst_QQuickListView::resizeViewAndRepaint() void tst_QQuickListView::sizeLessThan1() { + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); QaimModel model; @@ -4469,7 +4486,6 @@ void tst_QQuickListView::sizeLessThan1() QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("sizelessthan1.qml")); @@ -4590,6 +4606,8 @@ void tst_QQuickListView::resizeFirstDelegate() { // QTBUG-20712: Content Y jumps constantly if first delegate height == 0 // and other delegates have height > 0 + QScopedPointer testObject(new TestObject); + QScopedPointer window(createView()); // bug only occurs when all items in the model are visible @@ -4600,7 +4618,6 @@ void tst_QQuickListView::resizeFirstDelegate() QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("listviewtest.qml")); @@ -4798,6 +4815,8 @@ void tst_QQuickListView::indexAt_itemAt() QFETCH(qreal, y); QFETCH(int, index); + QScopedPointer testObject(new TestObject); + QQuickView *window = getView(); QaimModel model; @@ -4807,7 +4826,6 @@ void tst_QQuickListView::indexAt_itemAt() QQmlContext *ctxt = window->rootContext(); ctxt->setContextProperty("testModel", &model); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("listviewtest.qml")); @@ -6675,8 +6693,8 @@ void tst_QQuickListView::populateTransitions() model.addItem("item" + QString::number(i), ""); } + QScopedPointer testObject(new TestObject()); QQuickView *window = getView(); - QScopedPointer testObject(new TestObject(window->rootContext())); window->rootContext()->setContextProperty("testModel", &model); window->rootContext()->setContextProperty("testObject", testObject.data()); window->rootContext()->setContextProperty("usePopulateTransition", usePopulateTransition); @@ -6799,12 +6817,12 @@ void tst_QQuickListView::populateTransitions_data() void tst_QQuickListView::sizeTransitions() { QFETCH(bool, topToBottom); + QScopedPointer testObject(new TestObject); QQuickView *window = getView(); QQmlContext *ctxt = window->rootContext(); QaimModel model; ctxt->setContextProperty("testModel", &model); ctxt->setContextProperty("topToBottom", topToBottom); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testObject", &model); window->setSource(testFileUrl("sizeTransitions.qml")); window->show(); @@ -6859,9 +6877,9 @@ void tst_QQuickListView::addTransitions() QaimModel model_targetItems_transitionFrom; QaimModel model_displacedItems_transitionVia; + QScopedPointer testObject(new TestObject); QQuickView *window = getView(); QQmlContext *ctxt = window->rootContext(); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testModel", &model); ctxt->setContextProperty("model_targetItems_transitionFrom", &model_targetItems_transitionFrom); ctxt->setContextProperty("model_displacedItems_transitionVia", &model_displacedItems_transitionVia); @@ -7054,9 +7072,9 @@ void tst_QQuickListView::moveTransitions() QaimModel model_targetItems_transitionVia; QaimModel model_displacedItems_transitionVia; + QScopedPointer testObject(new TestObject); QQuickView *window = getView(); QQmlContext *ctxt = window->rootContext(); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testModel", &model); ctxt->setContextProperty("model_targetItems_transitionVia", &model_targetItems_transitionVia); ctxt->setContextProperty("model_displacedItems_transitionVia", &model_displacedItems_transitionVia); @@ -7256,9 +7274,9 @@ void tst_QQuickListView::removeTransitions() QaimModel model_targetItems_transitionTo; QaimModel model_displacedItems_transitionVia; + QScopedPointer testObject(new TestObject); QQuickView *window = getView(); QQmlContext *ctxt = window->rootContext(); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testModel", &model); ctxt->setContextProperty("model_targetItems_transitionTo", &model_targetItems_transitionTo); ctxt->setContextProperty("model_displacedItems_transitionVia", &model_displacedItems_transitionVia); @@ -7454,9 +7472,9 @@ void tst_QQuickListView::displacedTransitions() QPointF moveDisplaced_transitionVia(50, -100); QPointF removeDisplaced_transitionVia(150, 100); + QScopedPointer testObject(new TestObject()); QQuickView *window = getView(); QQmlContext *ctxt = window->rootContext(); - QScopedPointer testObject(new TestObject(window)); ctxt->setContextProperty("testModel", &model); ctxt->setContextProperty("testObject", testObject.data()); ctxt->setContextProperty("model_displaced_transitionVia", &model_displaced_transitionVia); @@ -7680,9 +7698,9 @@ void tst_QQuickListView::multipleTransitions() for (int i = 0; i < initialCount; i++) model.addItem("Original item" + QString::number(i), ""); + QScopedPointer testObject(new TestObject); QQuickView *window = getView(); QQmlContext *ctxt = window->rootContext(); - QScopedPointer testObject(new TestObject); ctxt->setContextProperty("testModel", &model); ctxt->setContextProperty("testObject", testObject.data()); ctxt->setContextProperty("addTargets_transitionFrom", addTargets_transitionFrom); @@ -7847,9 +7865,9 @@ void tst_QQuickListView::multipleDisplaced() for (int i = 0; i < 30; i++) model.addItem("Original item" + QString::number(i), ""); + QScopedPointer testObject(new TestObject()); QQuickView *window = getView(); QQmlContext *ctxt = window->rootContext(); - QScopedPointer testObject(new TestObject(window)); ctxt->setContextProperty("testModel", &model); ctxt->setContextProperty("testObject", testObject.data()); window->setSource(testFileUrl("multipleDisplaced.qml")); @@ -9520,8 +9538,8 @@ void tst_QQuickListView::itemFiltered() QScopedPointer window(createView()); window->engine()->rootContext()->setContextProperty("_model", &proxy2); QQmlComponent component(window->engine()); - component.setData("import QtQuick 2.4; ListView { " - "anchors.fill: parent; model: _model; delegate: Text { width: parent.width;" + component.setData("import QtQuick 2.4; ListView { id: listView; " + "anchors.fill: parent; model: _model; delegate: Text { width: listView.width;" "text: model.display; } }", QUrl()); window->setContent(QUrl(), &component, component.create()); @@ -9804,12 +9822,24 @@ void tst_QQuickListView::delegateWithRequiredProperties() void tst_QQuickListView::reuse_reuseIsOffByDefault() { + QScopedPointer testObject(new TestObject); + // Check that delegate recycling is off by default. The reason is that // ListView needs to be backwards compatible with legacy applications. And // when using delegate recycling, there are certain differences, like that // a delegates Component.onCompleted will just be called the first time the // item is created, and not when it's reused. QScopedPointer window(createView()); + + QaimModel model; + for (int i = 0; i < 40; i++) + model.addItem("Item" + QString::number(i), ""); + + QQmlContext *ctxt = window->rootContext(); + ctxt->setContextProperty("testModel", &model); + + ctxt->setContextProperty("testObject", testObject.data()); + window->setSource(testFileUrl("listviewtest.qml")); window->resize(640, 480); window->show(); -- cgit v1.2.3