aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/bindings/conversions.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/script/dom/bindings/conversions.rs')
-rw-r--r--src/components/script/dom/bindings/conversions.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/components/script/dom/bindings/conversions.rs b/src/components/script/dom/bindings/conversions.rs
index bed52b0338d..2a59b52791b 100644
--- a/src/components/script/dom/bindings/conversions.rs
+++ b/src/components/script/dom/bindings/conversions.rs
@@ -6,8 +6,9 @@ use js::jsapi::{JSVal, JSBool, JSContext};
use js::jsapi::{JS_ValueToUint64, JS_ValueToInt64};
use js::jsapi::{JS_ValueToECMAUint32, JS_ValueToECMAInt32};
use js::jsapi::{JS_ValueToUint16, JS_ValueToNumber, JS_ValueToBoolean};
-use js::{JSVAL_FALSE, JSVAL_TRUE};
+use js::{JSVAL_FALSE, JSVAL_TRUE, JSVAL_NULL};
use js::glue::{RUST_INT_TO_JSVAL, RUST_UINT_TO_JSVAL, RUST_JS_NumberValue};
+use js::glue::{RUST_JSVAL_IS_NULL, RUST_JSVAL_IS_VOID};
pub trait JSValConvertible {
fn to_jsval(&self) -> JSVal;
@@ -165,3 +166,21 @@ impl JSValConvertible for f64 {
unsafe { convert_from_jsval(cx, val, JS_ValueToNumber) }
}
}
+
+impl<T: JSValConvertible> JSValConvertible for Option<T> {
+ fn to_jsval(&self) -> JSVal {
+ match self {
+ &Some(ref value) => value.to_jsval(),
+ &None => JSVAL_NULL,
+ }
+ }
+
+ fn from_jsval(cx: *JSContext, value: JSVal) -> Option<Option<T>> {
+ if unsafe { RUST_JSVAL_IS_NULL(value) != 0 || RUST_JSVAL_IS_VOID(value) != 0 } {
+ Some(None)
+ } else {
+ let result: Option<T> = JSValConvertible::from_jsval(cx, value);
+ result.map(|v| Some(v))
+ }
+ }
+}