diff options
Diffstat (limited to 'src/components/script/dom/bindings/conversions.rs')
-rw-r--r-- | src/components/script/dom/bindings/conversions.rs | 21 |
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)) + } + } +} |