diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-06-24 12:05:35 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-06-24 16:48:18 +0200 |
commit | cf93acbee66db96a6f7fab8607432b70ec5c0437 (patch) | |
tree | c99629d115d1dd54022c6827ff666b77e621864d /tests/auto/qml/qjsengine/tst_qjsengine.cpp | |
parent | 745a71196c8893a35a80a679674bee396606f79b (diff) |
Exclude private methods and QObject::deleteLater from enumerable properties
This is a regression from Qt 5.1/5.0 introduced with 5.2. Private slots/methods
such as QObject::_q_reRegisterTimers() as well as QObject::deleteLater() are
not suitable for calls from JavaScript. deleteLater() in particular is covered
by the destroy() replacement slot.
Task-number: QTBUG-39744
Change-Id: I9b25f3c0d4095ba8e2e8e5ee47e37903b5def1f9
Reviewed-by: Michael Brasser <michael.brasser@live.com>
Diffstat (limited to 'tests/auto/qml/qjsengine/tst_qjsengine.cpp')
-rw-r--r-- | tests/auto/qml/qjsengine/tst_qjsengine.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp index feef9d27f8..8a1bedb600 100644 --- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp +++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp @@ -178,6 +178,8 @@ private slots: void translateScriptUnicodeIdBased(); void translateFromBuiltinCallback(); + void privateMethods(); + signals: void testSignal(); }; @@ -3548,6 +3550,41 @@ void tst_QJSEngine::translateFromBuiltinCallback() eng.evaluate("[10,20].forEach(foo)", "script.js"); } +class ObjectWithPrivateMethods : public QObject +{ + Q_OBJECT +private slots: + void myPrivateMethod() {} +}; + +void tst_QJSEngine::privateMethods() +{ + ObjectWithPrivateMethods object; + QJSEngine engine; + QJSValue jsWrapper = engine.newQObject(&object); + QQmlEngine::setObjectOwnership(&object, QQmlEngine::CppOwnership); + + QSet<QString> privateMethods; + { + const QMetaObject *mo = object.metaObject(); + for (int i = 0; i < mo->methodCount(); ++i) { + const QMetaMethod method = mo->method(i); + if (method.access() == QMetaMethod::Private) + privateMethods << QString::fromUtf8(method.name()); + } + } + + QVERIFY(privateMethods.contains("myPrivateMethod")); + QVERIFY(privateMethods.contains("_q_reregisterTimers")); + privateMethods << QStringLiteral("deleteLater") << QStringLiteral("destroyed"); + + QJSValueIterator it(jsWrapper); + while (it.hasNext()) { + it.next(); + QVERIFY(!privateMethods.contains(it.name())); + } +} + QTEST_MAIN(tst_QJSEngine) #include "tst_qjsengine.moc" |