From: Albert Astals Cid Date: Tue, 30 Apr 2013 19:22:36 +0000 (-0700) Subject: Protect against null item at QQuickItemView::destroyingItem X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=fdee5c35288673002a24f4cf03fa8076d021be38;p=konrad%2Fqtdeclarative.git Protect against null item at QQuickItemView::destroyingItem Change-Id: I92317d8f5a6d6f60160139f7486ffa8ec5985656 Reviewed-by: Alan Alpert --- diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index d774091..a6dabee 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -2259,8 +2259,10 @@ void QQuickItemView::destroyingItem(QObject *object) { Q_D(QQuickItemView); QQuickItem* item = qmlobject_cast(object); - item->setParentItem(0); - d->unrequestedItems.remove(item); + if (item) { + item->setParentItem(0); + d->unrequestedItems.remove(item); + } } bool QQuickItemViewPrivate::releaseItem(FxViewItem *item) diff --git a/tests/auto/qmltest/listview/data/asynclistviewloader.qml b/tests/auto/qmltest/listview/data/asynclistviewloader.qml new file mode 100644 index 0000000..f7a55ff --- /dev/null +++ b/tests/auto/qmltest/listview/data/asynclistviewloader.qml @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +ListView { + id: root + width: 360 + height: 360 + cacheBuffer: 100000 + model: ListModel { + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + ListElement { component: "asyncloadercurrentindex.qml" } + } + + interactive: false + orientation: ListView.Horizontal + + currentIndex: 0 + + delegate: Loader { + width: root.width + height: root.height + + source: component + asynchronous: true + } +} diff --git a/tests/auto/qmltest/listview/tst_listview.qml b/tests/auto/qmltest/listview/tst_listview.qml index 78e2e6d..7230638 100644 --- a/tests/auto/qmltest/listview/tst_listview.qml +++ b/tests/auto/qmltest/listview/tst_listview.qml @@ -84,6 +84,23 @@ Item { } } + ListView { + id: asyncListViewLoaderView + width: 360 + height: 360 + model: asyncListViewLoaderModel + + currentIndex: 0 + + delegate: Loader { + width: asyncListViewLoaderView.width + height: asyncListViewLoaderView.height + + source: component + asynchronous: true + } + } + ListModel { id: emptymodel } ListModel { id: manyitems } ListModel { id: firstmodel; ListElement { name: "FirstModelElement0" } } @@ -98,10 +115,18 @@ Item { ListElement { component: "data/asyncloadercurrentindex.qml" } ListElement { component: "data/asyncloadercurrentindex.qml" } } - + ListModel { + id: asyncListViewLoaderModel + ListElement { component: "data/asynclistviewloader.qml" } + ListElement { component: "data/asynclistviewloader.qml" } + ListElement { component: "data/asynclistviewloader.qml" } + ListElement { component: "data/asynclistviewloader.qml" } + ListElement { component: "data/asynclistviewloader.qml" } + } TestCase { name: "ListView" + when: windowShown function test_empty() { compare(emptylist.count, 0) @@ -211,5 +236,16 @@ Item { } wait(1000) } + + function test_asyncListViewLoader() { + for (var i = 0; i < 50; i++) { + wait(10); + asyncListViewLoaderView.currentIndex = 0; + asyncListViewLoaderView.currentIndex = 1; + asyncListViewLoaderView.currentIndex = 2; + asyncListViewLoaderView.currentIndex = 3; + asyncListViewLoaderView.currentIndex = 4; + } + } } }