aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/conversions.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2015-11-11 23:15:15 +0530
committerbors-servo <lbergstrom+bors@mozilla.com>2015-11-11 23:15:15 +0530
commit12f6ba29a74029fa8c83cc7274181d441e1e52dd (patch)
tree449ede9784e35351d4445e107854bf27f79afde4 /components/script/dom/bindings/conversions.rs
parent01ff78b438fe905b02735762d696408b4d073e90 (diff)
parente33330db4eb9d9187c98139aad732ff86ab9d828 (diff)
downloadservo-12f6ba29a74029fa8c83cc7274181d441e1e52dd.tar.gz
servo-12f6ba29a74029fa8c83cc7274181d441e1e52dd.zip
Auto merge of #8412 - ecoal95:webidl-sequence-return, r=jdm
Add WebIDL sequence return values And use it for `WebGLRenderingContext::getSupportedExtensions`. Part of #544 <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/8412) <!-- Reviewable:end -->
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) {