aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2011-10-25 08:52:01 +1000
committerQt by Nokia <qt-info@nokia.com>2011-10-26 02:11:24 +0200
commit4e931c4a436ea3dcf6e1921488771aa1e79eda13 (patch)
tree42ca55bb58cfc827a291e1bca122a901670d8ad0 /src
parent2413cc1e87c051760210028979b4db8e4c13eca0 (diff)
Fix "for (... in ...)" loops for list properties.
Task-number: QTBUG-22276 Change-Id: Ibe5a1180044d8e4a6ca6458e8170dd027885ad10 Reviewed-by: Chris Adams <christopher.adams@nokia.com> Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/declarative/qml/v8/qv8listwrapper.cpp20
-rw-r--r--src/declarative/qml/v8/qv8listwrapper_p.h1
2 files changed, 19 insertions, 2 deletions
diff --git a/src/declarative/qml/v8/qv8listwrapper.cpp b/src/declarative/qml/v8/qv8listwrapper.cpp
index 777ce78686..9c1e3205af 100644
--- a/src/declarative/qml/v8/qv8listwrapper.cpp
+++ b/src/declarative/qml/v8/qv8listwrapper.cpp
@@ -69,11 +69,11 @@ void QV8ListWrapper::init(QV8Engine *engine)
{
m_engine = engine;
v8::Local<v8::FunctionTemplate> ft = v8::FunctionTemplate::New();
- ft->InstanceTemplate()->SetFallbackPropertyHandler(Getter, Setter);
+ ft->InstanceTemplate()->SetFallbackPropertyHandler(Getter, Setter, 0, 0, Enumerator);
ft->InstanceTemplate()->SetIndexedPropertyHandler(IndexedGetter);
ft->InstanceTemplate()->SetAccessor(v8::String::New("length"), LengthGetter, 0,
v8::Handle<v8::Value>(), v8::DEFAULT,
- v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete));
+ v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete | v8::DontEnum));
ft->InstanceTemplate()->SetHasExternalResource(true);
m_constructor = qPersistentNew<v8::Function>(ft->GetFunction());
}
@@ -175,4 +175,20 @@ v8::Handle<v8::Value> QV8ListWrapper::LengthGetter(v8::Local<v8::String> propert
return v8::Integer::NewFromUnsigned(count);
}
+v8::Handle<v8::Array> QV8ListWrapper::Enumerator(const v8::AccessorInfo &info)
+{
+ QV8ListResource *resource = v8_resource_cast<QV8ListResource>(info.This());
+
+ if (!resource || resource->object.isNull()) return v8::Array::New();
+
+ quint32 count = resource->property.count?resource->property.count(&resource->property):0;
+
+ v8::Local<v8::Array> rv = v8::Array::New(count);
+
+ for (int ii = 0; ii < count; ++ii)
+ rv->Set(ii, v8::Number::New(ii));
+
+ return rv;
+}
+
QT_END_NAMESPACE
diff --git a/src/declarative/qml/v8/qv8listwrapper_p.h b/src/declarative/qml/v8/qv8listwrapper_p.h
index 8cbc7db0b8..e18d1eef21 100644
--- a/src/declarative/qml/v8/qv8listwrapper_p.h
+++ b/src/declarative/qml/v8/qv8listwrapper_p.h
@@ -85,6 +85,7 @@ private:
const v8::AccessorInfo &info);
static v8::Handle<v8::Value> LengthGetter(v8::Local<v8::String> property,
const v8::AccessorInfo &info);
+ static v8::Handle<v8::Array> Enumerator(const v8::AccessorInfo &info);
QV8Engine *m_engine;
v8::Persistent<v8::Function> m_constructor;