Add support for more array-like types in is_array_like

This commit is contained in:
George Roman 2019-06-30 19:21:28 +03:00
parent 3e446ef718
commit b26aa3ec19

View file

@ -40,6 +40,11 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::str::{ByteString, DOMString, USVString}; use crate::dom::bindings::str::{ByteString, DOMString, USVString};
use crate::dom::bindings::trace::{JSTraceable, RootedTraceableBox}; use crate::dom::bindings::trace::{JSTraceable, RootedTraceableBox};
use crate::dom::bindings::utils::DOMClass; use crate::dom::bindings::utils::DOMClass;
use crate::dom::filelist::FileList;
use crate::dom::htmlcollection::HTMLCollection;
use crate::dom::htmlformcontrolscollection::HTMLFormControlsCollection;
use crate::dom::htmloptionscollection::HTMLOptionsCollection;
use crate::dom::nodelist::NodeList;
use js::conversions::latin1_to_string; use js::conversions::latin1_to_string;
pub use js::conversions::ConversionBehavior; pub use js::conversions::ConversionBehavior;
pub use js::conversions::{ConversionResult, FromJSValConvertible, ToJSValConvertible}; pub use js::conversions::{ConversionResult, FromJSValConvertible, ToJSValConvertible};
@ -548,13 +553,38 @@ impl<T: DomObject> ToJSValConvertible for DomRoot<T> {
} }
} }
/// Returns whether `value` is an array-like object. /// Returns whether `value` is an array-like object (Array, FileList,
/// Note: Currently only Arrays are supported. /// HTMLCollection, HTMLFormControlsCollection, HTMLOptionsCollection,
/// TODO: Expand this to support sequences and other array-like objects /// NodeList).
pub unsafe fn is_array_like(cx: *mut JSContext, value: HandleValue) -> bool { pub unsafe fn is_array_like(cx: *mut JSContext, value: HandleValue) -> bool {
let mut result = false; let mut is_array = false;
assert!(JS_IsArrayObject(cx, value, &mut result)); assert!(JS_IsArrayObject(cx, value, &mut is_array));
result if is_array {
return true;
}
let object: *mut JSObject = match FromJSValConvertible::from_jsval(cx, value, ()).unwrap() {
ConversionResult::Success(object) => object,
_ => return false,
};
if root_from_object::<FileList>(object, cx).is_ok() {
return true;
}
if root_from_object::<HTMLCollection>(object, cx).is_ok() {
return true;
}
if root_from_object::<HTMLFormControlsCollection>(object, cx).is_ok() {
return true;
}
if root_from_object::<HTMLOptionsCollection>(object, cx).is_ok() {
return true;
}
if root_from_object::<NodeList>(object, cx).is_ok() {
return true;
}
false
} }
/// Get a property from a JS object. /// Get a property from a JS object.