diff options
author | Chris Adams <christopher.adams@nokia.com> | 2011-08-03 11:04:01 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-08-30 07:15:51 +0200 |
commit | be244df6cdce029eeb04d3e919ccf5c4983bd3e4 (patch) | |
tree | 2d6d839d5e398f996c481411b94fb5e4131f944c /src/declarative/qml/v8/qv8typewrapper.cpp | |
parent | 6cec35c85acdf458d14126784b7739c5419314eb (diff) |
Implement script module api property get and set
This commit adds code for property get and set for script module
APIs, and also splits up the module API unit tests into QObject and
Script (QJSValue) parts.
Related to commit: 3ee8a19f5b7142b96e2df649ea0dac444b5622a2
Task-number: QMLNG-33
Task-number: QTBUG-17318
Change-Id: I4aaf5d1cc1d4774dd0f0999f0985439e4d76f0ca
Reviewed-on: http://codereview.qt.nokia.com/1472
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Diffstat (limited to 'src/declarative/qml/v8/qv8typewrapper.cpp')
-rw-r--r-- | src/declarative/qml/v8/qv8typewrapper.cpp | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/declarative/qml/v8/qv8typewrapper.cpp b/src/declarative/qml/v8/qv8typewrapper.cpp index c51a2eeb7f..98ed1d51b2 100644 --- a/src/declarative/qml/v8/qv8typewrapper.cpp +++ b/src/declarative/qml/v8/qv8typewrapper.cpp @@ -45,6 +45,9 @@ #include <private/qdeclarativeengine_p.h> #include <private/qdeclarativecontext_p.h> +#include <private/qjsvalue_p.h> +#include <private/qscript_impl_p.h> + QT_BEGIN_NAMESPACE class QV8TypeResource : public QV8ObjectResource @@ -186,6 +189,11 @@ v8::Handle<v8::Value> QV8TypeWrapper::Getter(v8::Local<v8::String> property, if (moduleApi->qobjectApi) { v8::Handle<v8::Value> rv = v8engine->qobjectWrapper()->getProperty(moduleApi->qobjectApi, propertystring, QV8QObjectWrapper::IgnoreRevision); return rv; + } else if (moduleApi->scriptApi.isValid()) { + // NOTE: if used in a binding, changes will not trigger re-evaluation since non-NOTIFYable. + QJSValuePrivate *apiprivate = QJSValuePrivate::get(moduleApi->scriptApi); + QScopedPointer<QJSValuePrivate> propertyValue(apiprivate->property(property).give()); + return propertyValue->asV8Value(v8engine); } else { return v8::Handle<v8::Value>(); } @@ -212,8 +220,6 @@ v8::Handle<v8::Value> QV8TypeWrapper::Setter(v8::Local<v8::String> property, QV8Engine *v8engine = resource->engine; - // XXX TODO: Implement writes to module API objects - QHashedV8String propertystring(property); if (resource->type && resource->object) { @@ -235,9 +241,20 @@ v8::Handle<v8::Value> QV8TypeWrapper::Setter(v8::Local<v8::String> property, moduleApi->qobjectCallback = 0; } - if (moduleApi->qobjectApi) + if (moduleApi->qobjectApi) { v8engine->qobjectWrapper()->setProperty(moduleApi->qobjectApi, propertystring, value, QV8QObjectWrapper::IgnoreRevision); + } else if (moduleApi->scriptApi.isValid()) { + QScopedPointer<QJSValuePrivate> setvalp(new QJSValuePrivate(v8engine, value)); + QJSValuePrivate *apiprivate = QJSValuePrivate::get(moduleApi->scriptApi); + if (apiprivate->propertyFlags(property) & QJSValue::ReadOnly) { + QString error = QLatin1String("Cannot assign to read-only property \"") + + v8engine->toString(property) + QLatin1Char('\"'); + v8::ThrowException(v8::Exception::Error(v8engine->toString(error))); + } else { + apiprivate->setProperty(property, setvalp.data()); + } + } } } |