diff options
Diffstat (limited to 'components/script/dom/bindings/conversions.rs')
-rw-r--r-- | components/script/dom/bindings/conversions.rs | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs index a8a8775be40..9aa6331f2ed 100644 --- a/components/script/dom/bindings/conversions.rs +++ b/components/script/dom/bindings/conversions.rs @@ -19,6 +19,7 @@ //! | float | `f32` | //! | double | `f64` | //! | DOMString | `DOMString` | +//! | USVString | `USVString` | //! | ByteString | `ByteString` | //! | object | `*mut JSObject` | //! | interface types | `JSRef<T>` | `Temporary<T>` | @@ -31,7 +32,7 @@ use dom::bindings::codegen::PrototypeList; use dom::bindings::js::{JSRef, Root, Unrooted}; -use dom::bindings::str::ByteString; +use dom::bindings::str::{ByteString, USVString}; use dom::bindings::utils::{Reflectable, Reflector, DOMClass}; use util::str::DOMString; @@ -306,6 +307,7 @@ pub fn jsstring_to_str(cx: *mut JSContext, s: *mut JSString) -> DOMString { unsafe { let mut length = 0; let chars = JS_GetStringCharsAndLength(cx, s, &mut length); + assert!(!chars.is_null()); let char_vec = slice::from_raw_parts(chars, length as usize); String::from_utf16(char_vec).unwrap() } @@ -339,6 +341,32 @@ impl FromJSValConvertible for DOMString { } } +impl ToJSValConvertible for USVString { + fn to_jsval(&self, cx: *mut JSContext) -> JSVal { + self.0.to_jsval(cx) + } +} + +impl FromJSValConvertible for USVString { + type Config = (); + fn from_jsval(cx: *mut JSContext, value: JSVal, _: ()) + -> Result<USVString, ()> { + let jsstr = unsafe { JS_ValueToString(cx, value) }; + if jsstr.is_null() { + debug!("JS_ValueToString failed"); + Err(()) + } else { + unsafe { + let mut length = 0; + let chars = JS_GetStringCharsAndLength(cx, jsstr, &mut length); + assert!(!chars.is_null()); + let char_vec = slice::from_raw_parts(chars, length as usize); + Ok(USVString(String::from_utf16_lossy(char_vec))) + } + } + } +} + impl ToJSValConvertible for ByteString { fn to_jsval(&self, cx: *mut JSContext) -> JSVal { unsafe { |