aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-12-07 14:20:01 +0000
committerQt by Nokia <qt-info@nokia.com>2011-12-07 15:22:37 +0100
commit1c3a4e6f824289cd82aa1c4b0039b2e80c122d96 (patch)
tree09e23ea6bb14c152eef1a9d80fafa327b6dbe290
parent01cb691e8a619fcb4c6e1e67980ae10fe04b364e (diff)
Fix QObject V8 wrapping for extended types
The meta object for extended types must be marked as dynamic, to prevent their properties from being marked as IsDirect. Task-number: QTBUG-22997 Change-Id: I825f94f072cb46981706221a1044c9e2feeedcc2 Reviewed-by: Simon Hausmann <simon.hausmann@nokia.com> Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
-rw-r--r--src/declarative/qml/qdeclarativemetatype.cpp7
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/extendedObjectPropertyLookup2.qml14
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp16
3 files changed, 35 insertions, 2 deletions
diff --git a/src/declarative/qml/qdeclarativemetatype.cpp b/src/declarative/qml/qdeclarativemetatype.cpp
index c175d725b8..ac89eb9a2e 100644
--- a/src/declarative/qml/qdeclarativemetatype.cpp
+++ b/src/declarative/qml/qdeclarativemetatype.cpp
@@ -429,8 +429,10 @@ void QDeclarativeTypePrivate::init() const
// XXX - very inefficient
const QMetaObject *mo = m_baseMetaObject;
if (m_extFunc) {
- QMetaObject *mmo = new QMetaObject;
- *mmo = *m_extMetaObject;
+ QMetaObjectBuilder builder;
+ clone(builder, m_extMetaObject, m_extMetaObject, m_extMetaObject);
+ builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
+ QMetaObject *mmo = builder.toMetaObject();
mmo->d.superdata = mo;
QDeclarativeProxyMetaObject::ProxyData data = { mmo, m_extFunc, 0, 0 };
m_metaObjects << data;
@@ -443,6 +445,7 @@ void QDeclarativeTypePrivate::init() const
if (t->d->m_extFunc) {
QMetaObjectBuilder builder;
clone(builder, t->d->m_extMetaObject, t->d->m_baseMetaObject, m_baseMetaObject);
+ builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
QMetaObject *mmo = builder.toMetaObject();
mmo->d.superdata = m_baseMetaObject;
if (!m_metaObjects.isEmpty())
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/extendedObjectPropertyLookup2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/extendedObjectPropertyLookup2.qml
new file mode 100644
index 0000000000..e4af3359d0
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/extendedObjectPropertyLookup2.qml
@@ -0,0 +1,14 @@
+import Qt.test 1.0
+import QtQuick 2.0
+
+QtObject {
+ id: root
+ property MyExtendedObject a;
+ a: MyExtendedObject {
+ id: obj
+ extendedProperty: 42;
+ }
+ function getValue() {
+ return obj.extendedProperty;
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
index 5e62ec6508..31d4feb655 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
@@ -114,6 +114,7 @@ private slots:
void objectHasOwnProperty();
void selfDeletingBinding();
void extendedObjectPropertyLookup();
+ void extendedObjectPropertyLookup2();
void scriptErrors();
void functionErrors();
void propertyAssignmentErrors();
@@ -1361,6 +1362,21 @@ void tst_qdeclarativeecmascript::extendedObjectPropertyLookup()
}
/*
+Test that extended object properties can be accessed correctly.
+*/
+void tst_qdeclarativeecmascript::extendedObjectPropertyLookup2()
+{
+ QDeclarativeComponent component(&engine, TEST_FILE("extendedObjectPropertyLookup2.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QVariant returnValue;
+ QVERIFY(QMetaObject::invokeMethod(object, "getValue", Q_RETURN_ARG(QVariant, returnValue)));
+ QCOMPARE(returnValue.toInt(), 42);
+
+ delete object;
+}
+/*
Test file/lineNumbers for binding/Script errors.
*/
void tst_qdeclarativeecmascript::scriptErrors()