From 3ee8a19f5b7142b96e2df649ea0dac444b5622a2 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Tue, 12 Jul 2011 16:46:09 +1000 Subject: [PATCH] Enable support for QObject based module APIs Task-number: QTBUG-17318 Change-Id: Ia887f563b337b1c34ff65a0559bb7f33c18b4e28 Reviewed-on: http://codereview.qt.nokia.com/1479 Reviewed-by: Aaron Kennedy --- src/declarative/qml/v8/qv8typewrapper.cpp | 34 ++++++++++++++++++-- .../tst_qdeclarativeecmascript.cpp | 5 ++- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/declarative/qml/v8/qv8typewrapper.cpp b/src/declarative/qml/v8/qv8typewrapper.cpp index 9aac7a3..39d03db 100644 --- a/src/declarative/qml/v8/qv8typewrapper.cpp +++ b/src/declarative/qml/v8/qv8typewrapper.cpp @@ -172,10 +172,24 @@ v8::Handle QV8TypeWrapper::Getter(v8::Local property, if (d && d->type) { return v8engine->typeWrapper()->newObject(object, d->type, resource->mode); } else if (QDeclarativeMetaType::ModuleApiInstance *moduleApi = typeNamespace->moduleApi()) { - // XXX TODO: Currently module APIs are implemented against QScriptValues. Consequently we - // can't do anything here until the QtScript/V8 binding is complete. - return v8::Undefined(); + // XXX TODO: Currently module APIs are implemented against QScriptValues. Consequently we + // can't do anything for script module apis here until the QtScript/V8 binding is complete. + if (moduleApi->qobjectCallback) { + moduleApi->qobjectApi = moduleApi->qobjectCallback(v8engine->engine(), 0); + moduleApi->scriptCallback = 0; + moduleApi->qobjectCallback = 0; + } + + if (moduleApi->qobjectApi) { + v8::Handle rv = v8engine->qobjectWrapper()->getProperty(moduleApi->qobjectApi, propertystring, QV8QObjectWrapper::IgnoreRevision); + if (rv.IsEmpty()) + return v8::Undefined(); + else + return rv; + } else { + return v8::Undefined(); + } } // Fall through to undefined @@ -209,6 +223,20 @@ v8::Handle QV8TypeWrapper::Setter(v8::Local property, if (ao) v8engine->qobjectWrapper()->setProperty(ao, propertystring, value, QV8QObjectWrapper::IgnoreRevision); + } else if (resource->typeNamespace) { + if (QDeclarativeMetaType::ModuleApiInstance *moduleApi = resource->typeNamespace->moduleApi()) { + // XXX TODO: Currently module APIs are implemented against QScriptValues. Consequently we + // can't do anything for script module apis here until the QtScript/V8 binding is complete. + if (moduleApi->qobjectCallback) { + moduleApi->qobjectApi = moduleApi->qobjectCallback(v8engine->engine(), 0); + moduleApi->scriptCallback = 0; + moduleApi->qobjectCallback = 0; + } + + if (moduleApi->qobjectApi) + v8engine->qobjectWrapper()->setProperty(moduleApi->qobjectApi, propertystring, value, + QV8QObjectWrapper::IgnoreRevision); + } } return value; diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp index 6f87640..22c2096 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -2585,12 +2585,12 @@ void tst_qdeclarativeecmascript::signalWithUnknownTypes() void tst_qdeclarativeecmascript::moduleApi() { - QSKIP("Module API not supported with V8", SkipAll); - QDeclarativeComponent component(&engine, TEST_FILE("moduleApi.qml")); QObject *object = component.create(); QVERIFY(object != 0); QCOMPARE(object->property("existingUriTest").toInt(), 20); + + QEXPECT_FAIL("", "QTBUG-17318", Continue); QCOMPARE(object->property("scriptTest").toInt(), 13); QCOMPARE(object->property("qobjectTest").toInt(), 20); QCOMPARE(object->property("qobjectMethodTest").toInt(), 1); // first call of method, so count = 1. @@ -2604,6 +2604,7 @@ void tst_qdeclarativeecmascript::moduleApi() object = componentTwo.create(); QVERIFY(object != 0); QCOMPARE(object->property("existingUriTest").toInt(), 20); + QEXPECT_FAIL("", "QTBUG-17318", Continue); QCOMPARE(object->property("scriptTest").toInt(), 13); // shouldn't have incremented. QCOMPARE(object->property("qobjectParentedTest").toInt(), 26); // shouldn't have incremented. delete object; -- 1.7.2.5