avm2: Fully implement XML.elements()

This commit is contained in:
yoganlava 2023-03-21 22:10:21 +00:00 committed by Mike Welsh
parent b7c20a6c60
commit da0b245fb8
4 changed files with 22 additions and 2 deletions

View File

@ -164,13 +164,25 @@ pub fn parent<'gc>(
pub fn elements<'gc>(
activation: &mut Activation<'_, 'gc>,
this: Option<Object<'gc>>,
_args: &[Value<'gc>],
args: &[Value<'gc>],
) -> Result<Value<'gc>, Error<'gc>> {
let xml = this.unwrap().as_xml_object().unwrap();
let element_name = if args[0] == Value::Undefined {
AvmString::from("*")
} else {
args[0].coerce_to_string(activation)?
};
let is_asterisk = element_name == AvmString::from("*");
let children = if let E4XNodeKind::Element { children, .. } = &*xml.node().kind() {
children
.iter()
.filter(|node| matches!(&*node.kind(), E4XNodeKind::Element { .. }))
.filter(|node| {
if is_asterisk {
matches!(&*node.kind(), E4XNodeKind::Element { .. })
} else {
matches!(&*node.kind(), E4XNodeKind::Element { .. }) && node.local_name().unwrap() == element_name
}
})
.map(|node| E4XOrXml::E4X(*node))
.collect()
} else {

View File

@ -9,3 +9,8 @@ trace('elements() length: ' + xml.elements().length());
for each (var element in xml.elements()) {
trace('elements() element toString: ' + element.toString());
}
var xml2 = new XML("<x><foo>foo</foo><foo>bar</foo><bar>bar</bar></x>")
trace('elements(foo) length: ' + xml2.elements("foo").length());
trace('elements(bar) length: ' + xml2.elements("bar").length());
trace('elements(baz) length: ' + xml2.elements("baz").length());

View File

@ -1,3 +1,6 @@
elements() length: 2
elements() element toString: foo1
elements() element toString: bar2
elements(foo) length: 2
elements(bar) length: 1
elements(baz) length: 0