From b83b358634f7b5d5a80f29216233f3b462948922 Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Mon, 25 Jan 2016 14:17:55 +0200 Subject: Fix don't delete singletons objects owned by C++ Don't delete singletons objects that are created only from C++ and have explicitSetObjectOwnership flag set, explicitSetObjectOwnership flag is set only by QQmlEngine::setObjectOwnership. Task-number: QTBUG-49865 Change-Id: I0ef658c2094e67b5cd9a1585e273144dfcee736a Reviewed-by: Simon Hausmann --- tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'tests') diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index 1f299c0dbb..71f206ed8f 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -249,6 +249,8 @@ private slots: void dataAlignment(); + void deleteSingletons(); + private: QQmlEngine engine; QStringList defaultImportPathList; @@ -4089,6 +4091,24 @@ void tst_qqmllanguage::dataAlignment() QVERIFY(sizeof(QQmlVMEMetaData::MethodData) % sizeof(int) == 0); } +void tst_qqmllanguage::deleteSingletons() +{ + QPointer singleton; + { + QQmlEngine tmpEngine; + QQmlComponent component(&tmpEngine, testFile("singletonTest5.qml")); + VERIFY_ERRORS(0); + QObject *o = component.create(); + QVERIFY(o != 0); + QObject *s1 = NULL; + getSingletonInstance(o, "singletonInstance", &s1); + QVERIFY(s1 != 0); + singleton = s1; + QVERIFY(singleton.data() != 0); + } + QVERIFY(singleton.data() == 0); +} + QTEST_MAIN(tst_qqmllanguage) #include "tst_qqmllanguage.moc" -- cgit v1.2.3 From e9a6c1d4e30d6adb2190d52bebb7fecd2b539e82 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 19 Jan 2016 15:37:26 +0100 Subject: Don't check for revisions when assigning to grouped properties This leads to wrong behavior in some cases, where we reject valid revisions, and there is probably no case, where this could lead to a conflict for the user of the API. Change-Id: I1614332cf4c07c6a227551612331dd69b2ae71f3 Task-number: QTBUG-40043 Reviewed-by: Simon Hausmann --- .../qml/qqmlecmascript/data/metaobjectRevision5.qml | 12 ++++++++++++ tests/auto/qml/qqmlecmascript/testtypes.cpp | 1 + tests/auto/qml/qqmlecmascript/testtypes.h | 17 +++++++++++++++++ tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp | 9 +++++++++ 4 files changed, 39 insertions(+) create mode 100644 tests/auto/qml/qqmlecmascript/data/metaobjectRevision5.qml (limited to 'tests') diff --git a/tests/auto/qml/qqmlecmascript/data/metaobjectRevision5.qml b/tests/auto/qml/qqmlecmascript/data/metaobjectRevision5.qml new file mode 100644 index 0000000000..0493a7c0b9 --- /dev/null +++ b/tests/auto/qml/qqmlecmascript/data/metaobjectRevision5.qml @@ -0,0 +1,12 @@ +import Qt.test 1.1 +import QtQuick 2.0 + +MyItemUsingRevisionedObject { + property real test + + revisioned.prop1: 10 + revisioned.prop2: 1 + + Component.onCompleted: test = revisioned.prop1 + revisioned.prop2 +} + diff --git a/tests/auto/qml/qqmlecmascript/testtypes.cpp b/tests/auto/qml/qqmlecmascript/testtypes.cpp index 285158a4ea..b9e088d64c 100644 --- a/tests/auto/qml/qqmlecmascript/testtypes.cpp +++ b/tests/auto/qml/qqmlecmascript/testtypes.cpp @@ -452,6 +452,7 @@ void registerTypes() qmlRegisterType("Qt.test",1,0,"MyRevisionedSubclass"); // MyRevisionedSubclass 1.1 uses MyRevisionedClass revision 1 qmlRegisterType("Qt.test",1,1,"MyRevisionedSubclass"); + qmlRegisterType("Qt.test", 1, 0, "MyItemUsingRevisionedObject"); #ifndef QT_NO_WIDGETS qmlRegisterExtendedType("Qt.test",1,0,"QWidget"); diff --git a/tests/auto/qml/qqmlecmascript/testtypes.h b/tests/auto/qml/qqmlecmascript/testtypes.h index eb4a3147d3..5603356ef0 100644 --- a/tests/auto/qml/qqmlecmascript/testtypes.h +++ b/tests/auto/qml/qqmlecmascript/testtypes.h @@ -1084,10 +1084,27 @@ protected: qreal m_p4; }; + +class MyItemUsingRevisionedObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(MyRevisionedClass *revisioned READ revisioned) + +public: + MyItemUsingRevisionedObject() { + m_revisioned = new MyRevisionedClass; + } + + MyRevisionedClass *revisioned() const { return m_revisioned; } +private: + MyRevisionedClass *m_revisioned; +}; + QML_DECLARE_TYPE(MyRevisionedBaseClassRegistered) QML_DECLARE_TYPE(MyRevisionedBaseClassUnregistered) QML_DECLARE_TYPE(MyRevisionedClass) QML_DECLARE_TYPE(MyRevisionedSubclass) +QML_DECLARE_TYPE(MyItemUsingRevisionedObject) Q_DECLARE_METATYPE(MyQmlObject::MyType) diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp index b30dfcbd0b..a208bf5634 100644 --- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp +++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp @@ -6578,6 +6578,15 @@ void tst_qqmlecmascript::revision() QCOMPARE(object->property("test").toReal(), 11.); delete object; } + + { + QQmlComponent component(&engine, testFileUrl("metaobjectRevision5.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("test").toReal(), 11.); + delete object; + } } void tst_qqmlecmascript::realToInt() -- cgit v1.2.3 From afbfdcff3b3cd14f16736b7c84e04fe9ad61ef8d Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Wed, 27 Jan 2016 12:08:18 +0100 Subject: QML: do not wrap property values of type QVariant. When reading a propety from a QGadget or a QObject, the values are stored in a QVariant and later unwrapped/converted to the correct JavaScript type. However, if the property value is a QVariant, it does not need to wrap it (again) in a QVariant. Change-Id: I633d3194f82b6032fc15d9994c4dee5e5609fd21 Reviewed-by: Simon Hausmann --- tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'tests') diff --git a/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp b/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp index 58755927b5..04abe0bfcb 100644 --- a/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp +++ b/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp @@ -1493,6 +1493,7 @@ struct MyOffice { Q_PROPERTY(int chairs MEMBER m_chairs) Q_PROPERTY(MyDesk desk READ desk WRITE setDesk) + Q_PROPERTY(QVariant myThing READ myThing WRITE setMyThing) Q_GADGET public: MyOffice() : m_chairs(0) {} @@ -1500,8 +1501,12 @@ public: MyDesk desk() const { return m_desk; } void setDesk(const MyDesk &d) { m_desk = d; } + QVariant myThing() const { return m_myThing; } + void setMyThing(const QVariant &thingy) { m_myThing = thingy; } + int m_chairs; MyDesk m_desk; + QVariant m_myThing; }; Q_DECLARE_METATYPE(MyOffice) @@ -1513,6 +1518,11 @@ void tst_qqmlvaluetypes::customValueType() MyOffice cppOffice; cppOffice.m_chairs = 2; + QVariantMap m; + m.insert(QStringLiteral("hasChair"), false); + m.insert(QStringLiteral("textOnWhiteboard"), QStringLiteral("Blah blah")); + cppOffice.m_myThing = m; + QJSValue office = engine.toScriptValue(cppOffice); QCOMPARE(office.property("chairs").toInt(), 2); office.setProperty("chairs", 1); @@ -1530,6 +1540,14 @@ void tst_qqmlvaluetypes::customValueType() cppOffice = engine.fromScriptValue(office); QCOMPARE(cppOffice.m_chairs, 1); QCOMPARE(cppOffice.desk().monitorCount, 2); + + QJSValue thingy = office.property("myThing"); + QVERIFY(thingy.hasProperty("hasChair")); + QVERIFY(thingy.property("hasChair").isBool()); + QCOMPARE(thingy.property("hasChair").toBool(), false); + QVERIFY(thingy.property("textOnWhiteboard").isString()); + QVERIFY(thingy.hasProperty("textOnWhiteboard")); + QCOMPARE(thingy.property("textOnWhiteboard").toString(), QStringLiteral("Blah blah")); } struct BaseGadget -- cgit v1.2.3