aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/conversions.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/bindings/conversions.rs')
-rw-r--r--components/script/dom/bindings/conversions.rs23
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) {