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("- A
- B
");
+
+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