From aca4329dbff6673713c9613ee9e98a215c33b02d Mon Sep 17 00:00:00 2001 From: Tom Schuster Date: Mon, 27 Mar 2023 18:39:33 +0200 Subject: [PATCH] avm2: Implement XMLList.child --- core/src/avm2/globals/XMLList.as | 6 ++++++ core/src/avm2/globals/xml_list.rs | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/core/src/avm2/globals/XMLList.as b/core/src/avm2/globals/XMLList.as index 83f71e7e2..f039f262e 100644 --- a/core/src/avm2/globals/XMLList.as +++ b/core/src/avm2/globals/XMLList.as @@ -10,6 +10,7 @@ package { AS3 native function hasSimpleContent():Boolean; AS3 native function length():int; + AS3 native function child(name:Object):XMLList; AS3 native function children():XMLList; AS3 native function copy():XMLList; AS3 native function attribute(name:*):XMLList; @@ -37,6 +38,11 @@ package { return self.AS3::length(); } + prototype.child = function(name:Object):XMLList { + var self:XML = this; + return self.AS3::child(name); + }; + prototype.children = function():XMLList { var self:XMLList = this; return self.AS3::children(); diff --git a/core/src/avm2/globals/xml_list.rs b/core/src/avm2/globals/xml_list.rs index 976f42959..b339a48a4 100644 --- a/core/src/avm2/globals/xml_list.rs +++ b/core/src/avm2/globals/xml_list.rs @@ -99,6 +99,28 @@ pub fn length<'gc>( Ok(children.len().into()) } +pub fn child<'gc>( + activation: &mut Activation<'_, 'gc>, + this: Option>, + args: &[Value<'gc>], +) -> Result, Error<'gc>> { + let list = this.unwrap().as_xml_list_object().unwrap(); + let multiname = name_to_multiname(activation, &args[0])?; + let children = list.children(); + let mut sub_children = Vec::new(); + for child in &*children { + if let E4XNodeKind::Element { ref children, .. } = &*child.node().kind() { + sub_children.extend( + children + .iter() + .filter(|node| node.matches_name(&multiname)) + .map(|node| E4XOrXml::E4X(*node)), + ); + } + } + Ok(XmlListObject::new(activation, sub_children, Some(list.into())).into()) +} + pub fn children<'gc>( activation: &mut Activation<'_, 'gc>, this: Option>,