use std::ffi;
use js::context::JSContext;
pub(crate) use js::conversions::{
ConversionBehavior, ConversionResult, FromJSValConvertible, ToJSValConvertible,
};
use js::jsapi::{JSContext as RawJSContext, JSObject};
use js::jsval::UndefinedValue;
use js::rust::wrappers2::JS_GetProperty;
use js::rust::{HandleObject, MutableHandleValue};
pub(crate) use script_bindings::conversions::{is_dom_proxy, *};
use script_bindings::reflector::DomObject;
use crate::dom::bindings::error::{Error, Fallible};
use crate::dom::bindings::root::DomRoot;
pub(crate) fn root_from_object_static<T>(obj: *mut JSObject) -> Result<DomRoot<T>, ()>
where
T: DomObject + IDLInterface,
{
unsafe { native_from_object_static(obj).map(|ptr| DomRoot::from_ref(&*ptr)) }
}
pub(crate) fn root_from_handleobject<T>(
obj: HandleObject,
cx: *mut RawJSContext,
) -> Result<DomRoot<T>, ()>
where
T: DomObject + IDLInterface,
{
unsafe { root_from_object(obj.get(), cx) }
}
pub(crate) fn get_property_jsval(
cx: &mut JSContext,
object: HandleObject,
name: &ffi::CStr,
rval: MutableHandleValue,
) -> Fallible<()> {
if unsafe { !JS_GetProperty(cx, object, name.as_ptr(), rval) } {
return Err(Error::JSFailed);
}
Ok(())
}
pub(crate) fn get_property<T>(
cx: &mut JSContext,
object: HandleObject,
name: &ffi::CStr,
option: T::Config,
) -> Fallible<Option<T>>
where
T: FromJSValConvertible,
{
rooted!(&in(cx) let mut result = UndefinedValue());
get_property_jsval(cx, object, name, result.handle_mut())?;
if result.is_undefined() {
return Ok(None);
}
let value = T::safe_from_jsval(cx, result.handle(), option);
match value {
Ok(ConversionResult::Success(value)) => Ok(Some(value)),
Ok(ConversionResult::Failure(error)) => Err(Error::Type(error.into_owned())),
Err(()) => Err(Error::JSFailed),
}
}