aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-03-25 16:24:03 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-27 20:39:59 +0100
commitcfd5a1fb4ed1c51c3dadab0c63820c625992069d (patch)
treefbd56339d1cb510c5f849e862ad222603ad94eab /tests
parent57f4d8b490b994b124278b2c7c656319dfe0382f (diff)
Fix instantiation of QML list models with custom object properties
When doing something like property Item blah: Item { ... } in a list model, we would erroneously pass "blah" to the custom parser of the list model, which is wrong as the binding to blah is on an existing property (not custom). For regular properties there's a code path in place to avoid passing this to the custom parser, but for sub-object bindings we'd unconditionally register it with the custom parser. This patch corrects that and also adds a unit test to verify that we don't pass any bindings to existing properties to the custom parser. Task-number: QTBUG-37795 Change-Id: I1a3091fb5fad4be08b577cf74a85f24c3ab62ef4 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/qml/qqmllanguage/data/customParserProperties.qml7
-rw-r--r--tests/auto/qml/qqmllanguage/testtypes.cpp16
-rw-r--r--tests/auto/qml/qqmllanguage/testtypes.h27
-rw-r--r--tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp15
4 files changed, 65 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmllanguage/data/customParserProperties.qml b/tests/auto/qml/qqmllanguage/data/customParserProperties.qml
new file mode 100644
index 0000000000..5d72edb8e5
--- /dev/null
+++ b/tests/auto/qml/qqmllanguage/data/customParserProperties.qml
@@ -0,0 +1,7 @@
+import Test 1.0
+import QtQml 2.0
+SimpleObjectWithCustomParser {
+ intProperty: 42
+ property string qmlString: "Hello"
+ property var someObject: QtObject {}
+}
diff --git a/tests/auto/qml/qqmllanguage/testtypes.cpp b/tests/auto/qml/qqmllanguage/testtypes.cpp
index c37845840b..6dd7fca77e 100644
--- a/tests/auto/qml/qqmllanguage/testtypes.cpp
+++ b/tests/auto/qml/qqmllanguage/testtypes.cpp
@@ -92,6 +92,7 @@ void registerTypes()
qmlRegisterType<MyCreateableDerivedClass,1>("Test", 1, 1, "MyCreateableDerivedClass");
qmlRegisterCustomType<CustomBinding>("Test", 1, 0, "CustomBinding", new CustomBindingParser);
+ qmlRegisterCustomType<SimpleObjectWithCustomParser>("Test", 1, 0, "SimpleObjectWithCustomParser", new SimpleObjectCustomParser);
qmlRegisterType<RootObjectInCreationTester>("Test", 1, 0, "RootObjectInCreationTester");
}
@@ -191,3 +192,18 @@ QByteArray EnumSupportingCustomParser::compile(const QV4::CompiledData::QmlUnit
return QByteArray();
}
+
+
+QByteArray SimpleObjectCustomParser::compile(const QV4::CompiledData::QmlUnit *, int, const QList<const QV4::CompiledData::Binding *> &bindings)
+{
+ return QByteArray::number(bindings.count());
+}
+
+void SimpleObjectCustomParser::setCustomData(QObject *object, const QByteArray &data)
+{
+ SimpleObjectWithCustomParser *o = qobject_cast<SimpleObjectWithCustomParser*>(object);
+ Q_ASSERT(o);
+ bool ok = false;
+ o->setCustomBindingsCount(data.toInt(&ok));
+ Q_ASSERT(ok);
+}
diff --git a/tests/auto/qml/qqmllanguage/testtypes.h b/tests/auto/qml/qqmllanguage/testtypes.h
index 6ed363e363..a8605da651 100644
--- a/tests/auto/qml/qqmllanguage/testtypes.h
+++ b/tests/auto/qml/qqmllanguage/testtypes.h
@@ -1104,6 +1104,33 @@ class CustomBindingParser : public QQmlCustomParser
virtual void setCustomData(QObject *object, const QByteArray &data);
};
+class SimpleObjectWithCustomParser : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int intProperty READ intProperty WRITE setIntProperty)
+public:
+ SimpleObjectWithCustomParser()
+ : m_intProperty(0)
+ , m_customBindingsCount(0)
+ {}
+
+ int intProperty() const { return m_intProperty; }
+ void setIntProperty(int value) { m_intProperty = value; }
+
+ void setCustomBindingsCount(int count) { m_customBindingsCount = count; }
+ int customBindingsCount() const { return m_customBindingsCount; }
+
+private:
+ int m_intProperty;
+ int m_customBindingsCount;
+};
+
+class SimpleObjectCustomParser : public QQmlCustomParser
+{
+ virtual QByteArray compile(const QV4::CompiledData::QmlUnit *, int, const QList<const QV4::CompiledData::Binding *> &bindings);
+ virtual void setCustomData(QObject *object, const QByteArray &data);
+};
+
class RootObjectInCreationTester : public QObject
{
Q_OBJECT
diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
index e5c86e744d..619c7719f6 100644
--- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
+++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
@@ -229,6 +229,7 @@ private slots:
void customParserBindingScopes();
void customParserEvaluateEnum();
+ void customParserProperties();
void preservePropertyCacheOnGroupObjects();
void propertyCacheInSync();
@@ -3598,6 +3599,20 @@ void tst_qqmllanguage::customParserEvaluateEnum()
QVERIFY(!o.isNull());
}
+void tst_qqmllanguage::customParserProperties()
+{
+ QQmlComponent component(&engine, testFile("customParserProperties.qml"));
+ VERIFY_ERRORS(0);
+ QScopedPointer<QObject> o(component.create());
+ QVERIFY(!o.isNull());
+ SimpleObjectWithCustomParser *testObject = qobject_cast<SimpleObjectWithCustomParser*>(o.data());
+ QVERIFY(testObject);
+ QCOMPARE(testObject->customBindingsCount(), 0);
+ QCOMPARE(testObject->intProperty(), 42);
+ QCOMPARE(testObject->property("qmlString").toString(), QStringLiteral("Hello"));
+ QVERIFY(!testObject->property("someObject").isNull());
+}
+
void tst_qqmllanguage::preservePropertyCacheOnGroupObjects()
{
QQmlComponent component(&engine, testFile("preservePropertyCacheOnGroupObjects.qml"));