From da0b245fb8dc2e1c73beba8eb0e956506ca1ba44 Mon Sep 17 00:00:00 2001 From: yoganlava Date: Tue, 21 Mar 2023 22:10:21 +0000 Subject: [PATCH] avm2: Fully implement XML.elements() --- core/src/avm2/globals/xml.rs | 16 ++++++++++++++-- tests/tests/swfs/avm2/xml_elements/Test.as | 5 +++++ tests/tests/swfs/avm2/xml_elements/output.txt | 3 +++ tests/tests/swfs/avm2/xml_elements/test.swf | Bin 952 -> 1050 bytes 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/core/src/avm2/globals/xml.rs b/core/src/avm2/globals/xml.rs index c1436ceab..b255fbad8 100644 --- a/core/src/avm2/globals/xml.rs +++ b/core/src/avm2/globals/xml.rs @@ -164,13 +164,25 @@ pub fn parent<'gc>( pub fn elements<'gc>( activation: &mut Activation<'_, 'gc>, this: Option>, - _args: &[Value<'gc>], + args: &[Value<'gc>], ) -> Result, 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 { diff --git a/tests/tests/swfs/avm2/xml_elements/Test.as b/tests/tests/swfs/avm2/xml_elements/Test.as index d094706a0..c6dce3ce6 100644 --- a/tests/tests/swfs/avm2/xml_elements/Test.as +++ b/tests/tests/swfs/avm2/xml_elements/Test.as @@ -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("foobarbar") +trace('elements(foo) length: ' + xml2.elements("foo").length()); +trace('elements(bar) length: ' + xml2.elements("bar").length()); +trace('elements(baz) length: ' + xml2.elements("baz").length()); \ No newline at end of file diff --git a/tests/tests/swfs/avm2/xml_elements/output.txt b/tests/tests/swfs/avm2/xml_elements/output.txt index b7e955a4c..10cf7f029 100644 --- a/tests/tests/swfs/avm2/xml_elements/output.txt +++ b/tests/tests/swfs/avm2/xml_elements/output.txt @@ -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 diff --git a/tests/tests/swfs/avm2/xml_elements/test.swf b/tests/tests/swfs/avm2/xml_elements/test.swf index 79922c9e70f70de093ff12de09d5df70d5295d66..845010cfd84ff363766ab20a110bc3c2d1a172c0 100644 GIT binary patch literal 1050 zcmV+#1m*ifS5qcy1^@tf0fkgSbK67|-qp&I<;ICaikkodhXg{0$g-6t5LZ=`i7}L+ zq*J#;hq1>aODkJcmORorc6(u_7ybq({st!w+yV^r#-SHDnm<5zE8B5$!s93Je((Ff zeY^YQ5fWb^wDz zVbsye2L}gQN!N5;1%?_w3z#)hgLre>Obn_twj;04yf7$mL#rJQ*q!a|sjFjOnDz&e zpIAD!Mt$0&0gJVAu?$9zU2(&xXED?2_kGW{xScjq<8Ej_9a^VUb$u)D8rq!5HOyl^ zHIMq1-KB+^Pe+BLxjZ3H7@X_O>oljkbU{(H5_M8nqPWcCy8fW;dvTXWvvumB%Z642 z3xTal`l^xa9h z95gh3@|SL6iooTXXfZcf`|?D6a8$2t0 z`tvSy2}0S8J?T3b{gin`V}^db{x5KNCYk0?k(0K?WcKK|(s&%xC~gekAiIrfXb+N$ zZaj#>Z>Y`UMl^8Y;2R9Q;^{LUx^crg?dc6@#n!AhZr|pXMJrbLuf`wQqz#IW7x#VZ znN;sb9;4Dpn>#Okata+)g_OmhAEJc`mvS`DavUTR>hisS(a5rycSx?5YPNj~zJ?oyCPdlL_{eBmkqMz28XpFgf*hm4m25kwKEU*WS7%n3zJ;*wHRbj4CL<)%ta$(2e?*_BI8!4;Cn6SSUux)>Bv zGrhC;c^W$(_JpzARCaQXFVr%qb`5=BQ}E5PvW5PbKrdeA;9p$%?bl5plW_*fuRA`e zEzFoY5tjcvKTngiFwTPSjft-~UIgl@nurN7v`*i{F3w UEDf)|vU2hMAHtFT2YB4t2u;TS@Bjb+ literal 952 zcmV;p14sNrS5qc_1poke0fke`Zrer_orlDS;)h(Pj@{M;0|#&)mPpgBTiXm{BZ}Gt zNnJ!O8Wa$O5jm9DP$WT)EM-+7i=sbKpsW5x(N!1SxzFsg%F_J;_YNi5$*P3z=+2#U z4rlHhj#243LJL13w2DzLt?eYtZkdyhr{=-Jo7!RU2--p@F&At%nzG;p|qxxv4 zo@709dv9;gv~1J1Yk;WbPh!EwwK(6{bPIt7&%G>6MVQ2f6lC3GC~j_UPE~#HLNpy_ zQ6cGjCXe`l$09ek>)RmYd;39>4VZ9Qnnt0=q?|df<^9BaJYpxj7DO!XJLV-&azrR1 z?jEJg>vN+S@v(7qNiVF3Vg9+c9P4m}9pr;Dvm7cDQ%m zH6kAOM1SAVX0@WBaNZmC-u0;|nV)od-GlxewRTL~vUbhxFpNYPD--(qj0}R))DTHa zWMSL`=~;TM)9EE0k#u|>gmEa3(dqLjrD>9r4|gf_oqYU}I#r+j0Dy^vWic05HGOvtmV6^6lt;s%Cv{t&PjFC0oI5eliM(^KmcS;Ts!a%!F4MgP*XIj9g?#@Y|~ z)PgzXs7(WEwM#+CYL|nu)m8$3{yQ@t#)#0_~Qx5+Eu-d)<#{bMAs;Q?m5e a`ME|l^82S6d<^>X#TRi1E%*<