diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2012-03-23 13:18:04 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-23 08:04:08 +0100 |
commit | 91f9f123eb67bbdb2a0e65df6f29c6833635679b (patch) | |
tree | acbf962f29f663c2f1110d75b5a35763ad754677 /tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp | |
parent | b63ce68f316c91b0a3107d3d20e160628f5cefef (diff) |
Prevent the root object from being garbage collected.
Passing the root object as a return value from a C++ function could
cause the indestructible flag to be set to false.
Change-Id: Ib70c666f0d0ffbb48bca1996c2517fbccafa5dc1
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
Diffstat (limited to 'tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp')
-rw-r--r-- | tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp index a94e8374cc..403cc63496 100644 --- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp +++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp @@ -133,6 +133,8 @@ private slots: void ownership(); void cppOwnershipReturnValue(); void ownershipCustomReturnValue(); + void ownershipRootObject(); + void ownershipConsistency(); void qlistqobjectMethods(); void strictlyEquals(); void compiled(); @@ -2939,6 +2941,72 @@ void tst_qqmlecmascript::ownershipCustomReturnValue() QVERIFY(source.value == 0); } +//the return value from getObject will be JS ownership, +//unless strong Cpp ownership has been set +class OwnershipChangingObject : public QObject +{ + Q_OBJECT +public: + OwnershipChangingObject(): object(0) { } + + QPointer<QObject> object; + +public slots: + QObject *getObject() { return object; } + void setObject(QObject *obj) { object = obj; } +}; + +void tst_qqmlecmascript::ownershipRootObject() +{ + OwnershipChangingObject own; + QQmlContext *context = new QQmlContext(engine.rootContext()); + context->setContextObject(&own); + + QQmlComponent component(&engine, testFileUrl("ownershipRootObject.qml")); + QQmlGuard<QObject> object = component.create(context); + QVERIFY(object); + + engine.collectGarbage(); + + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QCoreApplication::processEvents(); + + QVERIFY(own.object != 0); + + delete context; + delete object; +} + +void tst_qqmlecmascript::ownershipConsistency() +{ + OwnershipChangingObject own; + QQmlContext *context = new QQmlContext(engine.rootContext()); + context->setContextObject(&own); + + QString expectedWarning = testFileUrl("ownershipConsistency.qml").toString() + QLatin1String(":19: Error: Invalid attempt to destroy() an indestructible object"); + QTest::ignoreMessage(QtWarningMsg, qPrintable(expectedWarning)); // we expect a meaningful warning to be printed. + expectedWarning = testFileUrl("ownershipConsistency.qml").toString() + QLatin1String(":15: Error: Invalid attempt to destroy() an indestructible object"); + QTest::ignoreMessage(QtWarningMsg, qPrintable(expectedWarning)); // we expect a meaningful warning to be printed. + expectedWarning = testFileUrl("ownershipConsistency.qml").toString() + QLatin1String(":6: Error: Invalid attempt to destroy() an indestructible object"); + QTest::ignoreMessage(QtWarningMsg, qPrintable(expectedWarning)); // we expect a meaningful warning to be printed. + expectedWarning = testFileUrl("ownershipConsistency.qml").toString() + QLatin1String(":10: Error: Invalid attempt to destroy() an indestructible object"); + QTest::ignoreMessage(QtWarningMsg, qPrintable(expectedWarning)); // we expect a meaningful warning to be printed. + + QQmlComponent component(&engine, testFileUrl("ownershipConsistency.qml")); + QQmlGuard<QObject> object = component.create(context); + QVERIFY(object); + + engine.collectGarbage(); + + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QCoreApplication::processEvents(); + + QVERIFY(own.object != 0); + + delete context; + delete object; +} + class QListQObjectMethodsObject : public QObject { Q_OBJECT |