avm2: Fully implement XML.elements()
This commit is contained in:
parent
b7c20a6c60
commit
da0b245fb8
|
@ -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 {
|
||||
|
|
|
@ -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());
|
|
@ -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
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue