aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp13
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp11
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"