diff options
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 13 | ||||
-rw-r--r-- | tests/auto/qml/qjsengine/tst_qjsengine.cpp | 11 |
2 files changed, 21 insertions, 3 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index f611be2965..de556dc9ed 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -682,9 +682,16 @@ void QObjectWrapper::put(Managed *m, const StringRef name, const ValueRef value) QQmlContextData *qmlContext = QV4::QmlContextWrapper::callingContext(v4); if (!setQmlProperty(v4->currentContext(), qmlContext, that->m_object, name.getPointer(), QV4::QObjectWrapper::IgnoreRevision, value)) { - QString error = QLatin1String("Cannot assign to non-existent property \"") + - name->toQString() + QLatin1Char('\"'); - v4->currentContext()->throwError(error); + QQmlData *ddata = QQmlData::get(that->m_object); + // Types created by QML are not extensible at run-time, but for other QObjects we can store them + // as regular JavaScript properties, like on JavaScript objects. + if (ddata && ddata->compiledData) { + QString error = QLatin1String("Cannot assign to non-existent property \"") + + name->toQString() + QLatin1Char('\"'); + v4->currentContext()->throwError(error); + } else { + QV4::Object::put(m, name, value); + } } } diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp index 7ef6bd9d2b..0a56c2f6d0 100644 --- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp +++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp @@ -153,6 +153,8 @@ private slots: void prototypeChainGc(); + void dynamicProperties(); + signals: void testSignal(); }; @@ -2960,6 +2962,15 @@ void tst_QJSEngine::prototypeChainGc() QVERIFY(proto.isObject()); } +void tst_QJSEngine::dynamicProperties() +{ + QJSEngine engine; + QObject *obj = new QObject; + QJSValue wrapper = engine.newQObject(obj); + wrapper.setProperty("someRandomProperty", 42); + QCOMPARE(wrapper.property("someRandomProperty").toInt(), 42); +} + QTEST_MAIN(tst_QJSEngine) #include "tst_qjsengine.moc" |