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>(
|
pub fn elements<'gc>(
|
||||||
activation: &mut Activation<'_, 'gc>,
|
activation: &mut Activation<'_, 'gc>,
|
||||||
this: Option<Object<'gc>>,
|
this: Option<Object<'gc>>,
|
||||||
_args: &[Value<'gc>],
|
args: &[Value<'gc>],
|
||||||
) -> Result<Value<'gc>, Error<'gc>> {
|
) -> Result<Value<'gc>, Error<'gc>> {
|
||||||
let xml = this.unwrap().as_xml_object().unwrap();
|
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() {
|
let children = if let E4XNodeKind::Element { children, .. } = &*xml.node().kind() {
|
||||||
children
|
children
|
||||||
.iter()
|
.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))
|
.map(|node| E4XOrXml::E4X(*node))
|
||||||
.collect()
|
.collect()
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -9,3 +9,8 @@ trace('elements() length: ' + xml.elements().length());
|
||||||
for each (var element in xml.elements()) {
|
for each (var element in xml.elements()) {
|
||||||
trace('elements() element toString: ' + element.toString());
|
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() length: 2
|
||||||
elements() element toString: foo1
|
elements() element toString: foo1
|
||||||
elements() element toString: bar2
|
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