From 75566b92e0d07518da488e3c4b72b1fd94372393 Mon Sep 17 00:00:00 2001 From: sleepycatcoding <131554884+sleepycatcoding@users.noreply.github.com> Date: Fri, 25 Aug 2023 11:16:27 +0300 Subject: [PATCH] avm2: XML/XMLList is converted to a string when set as attribute value --- core/src/avm2/object/xml_object.rs | 9 -------- .../tests/swfs/avm2/xml_as_attribute/Test.as | 21 ++++++++++++++++++ .../swfs/avm2/xml_as_attribute/output.txt | 9 ++++++++ .../tests/swfs/avm2/xml_as_attribute/test.swf | Bin 0 -> 887 bytes .../swfs/avm2/xml_as_attribute/test.toml | 1 + .../swfs/avm2/xml_list_as_attribute/Test.as | 21 ++++++++++++++++++ .../avm2/xml_list_as_attribute/output.txt | 9 ++++++++ .../swfs/avm2/xml_list_as_attribute/test.swf | Bin 0 -> 889 bytes .../swfs/avm2/xml_list_as_attribute/test.toml | 1 + 9 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 tests/tests/swfs/avm2/xml_as_attribute/Test.as create mode 100644 tests/tests/swfs/avm2/xml_as_attribute/output.txt create mode 100644 tests/tests/swfs/avm2/xml_as_attribute/test.swf create mode 100644 tests/tests/swfs/avm2/xml_as_attribute/test.toml create mode 100644 tests/tests/swfs/avm2/xml_list_as_attribute/Test.as create mode 100644 tests/tests/swfs/avm2/xml_list_as_attribute/output.txt create mode 100644 tests/tests/swfs/avm2/xml_list_as_attribute/test.swf create mode 100644 tests/tests/swfs/avm2/xml_list_as_attribute/test.toml diff --git a/core/src/avm2/object/xml_object.rs b/core/src/avm2/object/xml_object.rs index e283daf94..4ae28111f 100644 --- a/core/src/avm2/object/xml_object.rs +++ b/core/src/avm2/object/xml_object.rs @@ -312,15 +312,6 @@ impl<'gc> TObject<'gc> for XmlObject<'gc> { if name.is_attribute() { self.delete_property_local(activation, name)?; - if let Some(obj) = value.as_object() { - if obj.as_xml_object().is_some() || obj.as_xml_list_object().is_some() { - return Err(format!( - "Cannot set an XML/XMLList object {:?} as an attribute", - obj - ) - .into()); - } - } let Some(local_name) = name.local_name() else { return Err(format!("Cannot set attribute {:?} without a local name", name).into()); }; diff --git a/tests/tests/swfs/avm2/xml_as_attribute/Test.as b/tests/tests/swfs/avm2/xml_as_attribute/Test.as new file mode 100644 index 000000000..43b34b4a7 --- /dev/null +++ b/tests/tests/swfs/avm2/xml_as_attribute/Test.as @@ -0,0 +1,21 @@ +package +{ + import flash.display.Sprite; + public class Test extends Sprite + { + } +} + +var main:XML = A; + +var part:XML = BC; + +trace(main); + +main.item[0].@name = "Hello"; + +trace(main); + +main.item[0].@name2 = part; + +trace(main); diff --git a/tests/tests/swfs/avm2/xml_as_attribute/output.txt b/tests/tests/swfs/avm2/xml_as_attribute/output.txt new file mode 100644 index 000000000..1b5603c20 --- /dev/null +++ b/tests/tests/swfs/avm2/xml_as_attribute/output.txt @@ -0,0 +1,9 @@ + + A + + + A + + + A + diff --git a/tests/tests/swfs/avm2/xml_as_attribute/test.swf b/tests/tests/swfs/avm2/xml_as_attribute/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..ed34db119476ffb3a983b1dc63054ff5025cbfd8 GIT binary patch literal 887 zcmV--1Bm=XS5qbx1poke0fkaeZyQw*e}C5AwVOCjQ{045aG_F!T6;Ge6-c^W#f=+U zi4s(US|M51^X^-F$$EFS`y9I`B#wLm4&32maN@wt9QXo=LyzVYgn7?N+@5&S`!h4Y z-^{$3nIi3Pget!vw24uBeG4J<{l;sIkdyhr!SnWUeL9Nb`~akfJ3}GT1Jj&LCe6uS zGsy<#?*9J1Y1yW2HvrMdU&Vq=8*%>8j;kEBdG2LlD#9eLONXqVjK#y9oeQtNcjYu4 zXOVL0dnS+gh{qx~cbmK5$oCF{BpWf|vNVlCk4bmtw2==J?{vb>cq52dK6K0_P;x{l zBJQ?Q<_&rMIO5ZKYe`q&1wvx|WuETEF9TpSnPRKF6yr^tAoftaui z0w&|wSD7l}5-4e2#+gX|mvjk}l!(QHF&l7~$GvYl%IB3z{eTJX+V`7vHXhV%%ide$ zE47X(OaDeIE;P_x7geg`tuId+U$r`&7bnl#Xto9;@YZTqUsDGik@NHOZ_5-+Mc7*P z^p8Cl6NFy;^Yh&w;q`m@Yn}`A+l^ldLeiqdDr!p5`6HEn`b;cO-upsFdp<& z^Bz2qfF{dJ@;2qMstip(%+rXyDt6K=6ufxS|BicN?eQ55NE=K{Kzp;51(r)~zAE)V zSwPpH#)4UfLZmcJa&q6+MvyM~%+^wt3A$^4Y7}sd)C!xp zRw`UKHV7p}y{Z$e)1ppvyJb7(rorE+;@&7Puv>3jn; zgb-}}gl87Wl%p;UsMXa1&FU6{g4HbsMXRd^y458CQO8SkORXUWMzL!I#=XiT?B5-c zxuK*rCDD1gTk<1vT*4pESKtwp@1Wq?y&G(0URheIR~A2_Y;}J9()7b$e?Bo_MoSx4 NgL(*`{|_rEZFDckwM75` literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/xml_as_attribute/test.toml b/tests/tests/swfs/avm2/xml_as_attribute/test.toml new file mode 100644 index 000000000..cf6123969 --- /dev/null +++ b/tests/tests/swfs/avm2/xml_as_attribute/test.toml @@ -0,0 +1 @@ +num_ticks = 1 diff --git a/tests/tests/swfs/avm2/xml_list_as_attribute/Test.as b/tests/tests/swfs/avm2/xml_list_as_attribute/Test.as new file mode 100644 index 000000000..150c379de --- /dev/null +++ b/tests/tests/swfs/avm2/xml_list_as_attribute/Test.as @@ -0,0 +1,21 @@ +package +{ + import flash.display.Sprite; + public class Test extends Sprite + { + } +} + +var main:XML = A; + +var part:XMLList = new XMLList("AB"); + +trace(main); + +main.item[0].@name = "Hello"; + +trace(main); + +main.item[0].@name2 = part; + +trace(main); diff --git a/tests/tests/swfs/avm2/xml_list_as_attribute/output.txt b/tests/tests/swfs/avm2/xml_list_as_attribute/output.txt new file mode 100644 index 000000000..58df395bf --- /dev/null +++ b/tests/tests/swfs/avm2/xml_list_as_attribute/output.txt @@ -0,0 +1,9 @@ + + A + + + A + + + A + diff --git a/tests/tests/swfs/avm2/xml_list_as_attribute/test.swf b/tests/tests/swfs/avm2/xml_list_as_attribute/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..0f8f3807a85d8924bf3ddfe618615cc55bda818f GIT binary patch literal 889 zcmV-<1BU!VS5qb_1poke0fkaaZyQwISP!;_LZth)J(*1E zlihlf4eXu0y*=A;ZP%>qx#-u z&~%(dDx~k(JmMoBi`?F+??52m+Ygd##6**&X%u=)hO?)&e3*F06L!LDLB#T5!(I@j zMuZ~b%~s01A+H`rd|GWS2B-21YlVqUsb22Aj#d#_$)<3ZJR z+}*SHN^irKU;kPu&OK1wCMuQ38=oE3K5un8UmZPfquC0yz?IQ1zoHHFh@76DeqE#h z=`gkO@gKX;CJ6oX!!LKghtu!HFL*A{Z#RA=2uVblWmK1>cQj?aXAhGRw@-L@oY(^B zVLa%m;@!V533ZlRa<}EOtbn>7=4r%U>YX$T1=o-I-*8W?JU)R2X#>Orls8*C<8tZE zm!%&hXVlfFvEUi=M0mo_Je4c>qXc?3jCn?1eEMv&ktK;}HsGdFv(>QG4*w^e2H?-a zT-^Cjj$%H%swfD!munJIp9AULcK6;rZ!qR3eO~vHk=^R-+OFe#VE4yi1bBa|dqW$qYS z*327(65Uue2sWs05W^^#1}z%&nn9NgvTTqQgREND@g^=+aOoyC^i4y*1(k+EA`K=% zbRBQJ3G*$OZ(~d>O_dlEirW~DD+k0x7?%&Ig}@0%)1ouyW9S5otzvQJ%$}lu=zI-4 zgb-~0h-VJil%p;UsMFN~&FL0`g45Ll-RT;E;dDtr)baw|Qe%igp?A%|+%7%D{@oFo zn_X+W{D~zEIxlvMenbw7_|AL@4#BnCC|KHlgDuZX3#5FB_z`8L`SlCvyTAT?VnW|q PYnRP?0J;AQa(#56b78;? literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/xml_list_as_attribute/test.toml b/tests/tests/swfs/avm2/xml_list_as_attribute/test.toml new file mode 100644 index 000000000..cf6123969 --- /dev/null +++ b/tests/tests/swfs/avm2/xml_list_as_attribute/test.toml @@ -0,0 +1 @@ +num_ticks = 1