diff options
Diffstat (limited to 'components/script/dom/bindings/conversions.rs')
-rw-r--r-- | components/script/dom/bindings/conversions.rs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs index 45279e7a966..493ed4c0c27 100644 --- a/components/script/dom/bindings/conversions.rs +++ b/components/script/dom/bindings/conversions.rs @@ -46,6 +46,7 @@ use js::jsapi::{HandleId, HandleObject, HandleValue, JS_GetClass}; use js::jsapi::{JSClass, JSContext, JSObject, JSString, MutableHandleValue}; use js::jsapi::{JS_GetLatin1StringCharsAndLength, JS_GetReservedSlot}; use js::jsapi::{JS_GetTwoByteStringCharsAndLength, JS_NewStringCopyN}; +use js::jsapi::{JS_NewArrayObject1, JS_DefineElement, RootedValue, RootedObject}; use js::jsapi::{JS_NewUCStringCopyN, JS_StringHasLatin1Chars, JS_WrapValue}; use js::jsval::{BooleanValue, Int32Value, NullValue, UInt32Value, UndefinedValue}; use js::jsval::{JSVal, ObjectOrNullValue, ObjectValue, StringValue}; @@ -811,6 +812,28 @@ impl<T: FromJSValConvertible> FromJSValConvertible for Option<T> { } } +impl<T: ToJSValConvertible> ToJSValConvertible for Vec<T> { + fn to_jsval(&self, cx: *mut JSContext, rval: MutableHandleValue) { + let js_array = RootedObject::new(cx, + unsafe { JS_NewArrayObject1(cx, self.len() as libc::size_t) }); + assert!(!js_array.handle().is_null()); + + for (index, obj) in self.iter().enumerate() { + let mut val = RootedValue::new(cx, UndefinedValue()); + obj.to_jsval(cx, val.handle_mut()); + + unsafe { + assert!(JS_DefineElement(cx, js_array.handle(), + index as u32, val.handle(), js::JSPROP_ENUMERATE, None, None)); + } + } + + unsafe { + rval.set(ObjectValue(&*js_array.handle().get())); + } + } +} + //http://heycam.github.io/webidl/#es-object impl ToJSValConvertible for *mut JSObject { fn to_jsval(&self, cx: *mut JSContext, rval: MutableHandleValue) { |