diff options
Diffstat (limited to 'components/script/dom/bindings/conversions.rs')
-rw-r--r-- | components/script/dom/bindings/conversions.rs | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs index 01282ea3b1f..3ac26b0f97b 100644 --- a/components/script/dom/bindings/conversions.rs +++ b/components/script/dom/bindings/conversions.rs @@ -39,7 +39,8 @@ use dom::bindings::reflector::{Reflectable, Reflector}; use dom::bindings::str::{ByteString, DOMString, USVString}; use dom::bindings::utils::DOMClass; use js; -pub use js::conversions::{FromJSValConvertible, ToJSValConvertible, ConversionBehavior}; +pub use js::conversions::{FromJSValConvertible, ToJSValConvertible, ConversionResult}; +pub use js::conversions::ConversionBehavior; use js::conversions::latin1_to_string; use js::error::throw_type_error; use js::glue::{GetProxyPrivate, IsWrapper}; @@ -81,10 +82,17 @@ impl<T: Float + FromJSValConvertible<Config=()>> FromJSValConvertible for Finite unsafe fn from_jsval(cx: *mut JSContext, value: HandleValue, option: ()) - -> Result<Finite<T>, ()> { - let result = try!(FromJSValConvertible::from_jsval(cx, value, option)); + -> Result<ConversionResult<Finite<T>>, ()> { + let result = match FromJSValConvertible::from_jsval(cx, value, option) { + Ok(ConversionResult::Success(v)) => v, + Ok(ConversionResult::Failure(error)) => { + throw_type_error(cx, &error); + return Err(()); + } + _ => return Err(()), + }; match Finite::new(result) { - Some(v) => Ok(v), + Some(v) => Ok(ConversionResult::Success(v)), None => { throw_type_error(cx, "this argument is not a finite floating-point value"); Err(()) @@ -99,12 +107,12 @@ impl <T: Reflectable + IDLInterface> FromJSValConvertible for Root<T> { unsafe fn from_jsval(cx: *mut JSContext, value: HandleValue, _config: Self::Config) - -> Result<Root<T>, ()> { + -> Result<ConversionResult<Root<T>>, ()> { let result = root_from_handlevalue(value); if let Err(()) = result { throw_type_error(cx, "value is not an object"); } - result + result.map(ConversionResult::Success) } } @@ -146,17 +154,17 @@ impl FromJSValConvertible for DOMString { unsafe fn from_jsval(cx: *mut JSContext, value: HandleValue, null_behavior: StringificationBehavior) - -> Result<DOMString, ()> { + -> Result<ConversionResult<DOMString>, ()> { if null_behavior == StringificationBehavior::Empty && value.get().is_null() { - Ok(DOMString::new()) + Ok(ConversionResult::Success(DOMString::new())) } else { let jsstr = ToString(cx, value); if jsstr.is_null() { debug!("ToString failed"); Err(()) } else { - Ok(jsstring_to_str(cx, jsstr)) + Ok(ConversionResult::Success(jsstring_to_str(cx, jsstr))) } } } @@ -203,7 +211,8 @@ pub unsafe fn jsstring_to_str(cx: *mut JSContext, s: *mut JSString) -> DOMString // http://heycam.github.io/webidl/#es-USVString impl FromJSValConvertible for USVString { type Config = (); - unsafe fn from_jsval(cx: *mut JSContext, value: HandleValue, _: ()) -> Result<USVString, ()> { + unsafe fn from_jsval(cx: *mut JSContext, value: HandleValue, _: ()) + -> Result<ConversionResult<USVString>, ()> { let jsstr = ToString(cx, value); if jsstr.is_null() { debug!("ToString failed"); @@ -212,13 +221,14 @@ impl FromJSValConvertible for USVString { let latin1 = JS_StringHasLatin1Chars(jsstr); if latin1 { // FIXME(ajeffrey): Convert directly from DOMString to USVString - return Ok(USVString(String::from(jsstring_to_str(cx, jsstr)))); + return Ok(ConversionResult::Success( + USVString(String::from(jsstring_to_str(cx, jsstr))))); } let mut length = 0; let chars = JS_GetTwoByteStringCharsAndLength(cx, ptr::null(), jsstr, &mut length); assert!(!chars.is_null()); let char_vec = slice::from_raw_parts(chars as *const u16, length as usize); - Ok(USVString(String::from_utf16_lossy(char_vec))) + Ok(ConversionResult::Success(USVString(String::from_utf16_lossy(char_vec)))) } } @@ -241,7 +251,7 @@ impl FromJSValConvertible for ByteString { unsafe fn from_jsval(cx: *mut JSContext, value: HandleValue, _option: ()) - -> Result<ByteString, ()> { + -> Result<ConversionResult<ByteString>, ()> { let string = ToString(cx, value); if string.is_null() { debug!("ToString failed"); @@ -255,7 +265,7 @@ impl FromJSValConvertible for ByteString { assert!(!chars.is_null()); let char_slice = slice::from_raw_parts(chars as *mut u8, length as usize); - return Ok(ByteString::new(char_slice.to_vec())); + return Ok(ConversionResult::Success(ByteString::new(char_slice.to_vec()))); } let mut length = 0; @@ -266,7 +276,8 @@ impl FromJSValConvertible for ByteString { throw_type_error(cx, "Invalid ByteString"); Err(()) } else { - Ok(ByteString::new(char_vec.iter().map(|&c| c as u8).collect())) + Ok(ConversionResult::Success( + ByteString::new(char_vec.iter().map(|&c| c as u8).collect()))) } } } |