From 850476b75d0857f2f64fa6eb82d39c22322368a7 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Fri, 25 Nov 2011 16:09:38 +1000 Subject: Fix crash calling VisualDataGroup.setGroups during initialization. A VisualDataModel's meta type is constructed in componentComplete(), avoid accessing it before then. Change-Id: Ic9fdfa3c458d5da3014289b777f74df87aa97103 Reviewed-by: Martin Jones --- src/declarative/items/qquickvisualdatamodel.cpp | 3 +- .../tst_qquickvisualdatamodel.cpp | 46 +++++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/declarative/items/qquickvisualdatamodel.cpp b/src/declarative/items/qquickvisualdatamodel.cpp index 7d0abfcfe0..ce8548456e 100644 --- a/src/declarative/items/qquickvisualdatamodel.cpp +++ b/src/declarative/items/qquickvisualdatamodel.cpp @@ -2116,7 +2116,7 @@ void QQuickVisualDataGroup::remove(QDeclarativeV8Function *args) bool QQuickVisualDataGroupPrivate::parseGroupArgs( QDeclarativeV8Function *args, int *index, int *count, int *groups) const { - if (!model) + if (!model || !QQuickVisualDataModelPrivate::get(model)->m_cacheMetaType) return false; if (args->Length() < 2) @@ -2300,6 +2300,7 @@ void QQuickVisualDataGroup::move(QDeclarativeV8Function *args) model->itemsMoved(removes, inserts); model->emitChanges(); } + } /*! diff --git a/tests/auto/declarative/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp b/tests/auto/declarative/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp index 44759d4fec..e382a015dd 100644 --- a/tests/auto/declarative/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp +++ b/tests/auto/declarative/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp @@ -146,6 +146,7 @@ private slots: void onChanged_data(); void onChanged(); void create(); + void incompleteModel(); private: template void groups_verify( @@ -563,7 +564,7 @@ void tst_qquickvisualdatamodel::modelProperties() QUrl source(QUrl::fromLocalFile(TESTDATA("modelproperties2.qml"))); - //3 items, 3 warnings each + //3 items, 3 i each QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":13: ReferenceError: Can't find variable: modelData"); QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":13: ReferenceError: Can't find variable: modelData"); QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":13: ReferenceError: Can't find variable: modelData"); @@ -1789,6 +1790,49 @@ void tst_qquickvisualdatamodel::create() QCOMPARE(evaluate(delegate, "destroyed"), false); } + +void tst_qquickvisualdatamodel::incompleteModel() +{ + // VisualDataModel is first populated in componentComplete. Verify various functions are + // harmlessly ignored until then. + + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 2.0\n VisualDataModel {}", QUrl::fromLocalFile(TESTDATA(""))); + + QScopedPointer object(component.beginCreate(engine.rootContext())); + + QQuickVisualDataModel *model = qobject_cast(object.data()); + QVERIFY(model); + + QSignalSpy itemsSpy(model->items(), SIGNAL(countChanged())); + QSignalSpy persistedItemsSpy(model->items(), SIGNAL(countChanged())); + + evaluate(model, "items.removeGroups(0, items.count, \"items\")"); + QCOMPARE(itemsSpy.count(), 0); + QCOMPARE(persistedItemsSpy.count(), 0); + + evaluate(model, "items.setGroups(0, items.count, \"persistedItems\")"); + QCOMPARE(itemsSpy.count(), 0); + QCOMPARE(persistedItemsSpy.count(), 0); + + evaluate(model, "items.addGroups(0, items.count, \"persistedItems\")"); + QCOMPARE(itemsSpy.count(), 0); + QCOMPARE(persistedItemsSpy.count(), 0); + + evaluate(model, "items.remove(0, items.count)"); + QCOMPARE(itemsSpy.count(), 0); + QCOMPARE(persistedItemsSpy.count(), 0); + + evaluate(model, "items.insert([ \"color\": \"blue\" ])"); + QCOMPARE(itemsSpy.count(), 0); + QCOMPARE(persistedItemsSpy.count(), 0); + + QTest::ignoreMessage(QtWarningMsg, ": QML VisualDataGroup: get: index out of range"); + QVERIFY(evaluate(model, "items.get(0) === undefined")); + + component.completeCreate(); +} + template T *tst_qquickvisualdatamodel::findItem(QQuickItem *parent, const QString &objectName, int index) { -- cgit v1.2.3