From 2fd8f600bc23ab0f7b35949b853f245cea016c20 Mon Sep 17 00:00:00 2001 From: Tom Schuster Date: Fri, 30 Aug 2024 23:51:41 +0200 Subject: [PATCH] avm2: Correctly set XML attribute with namespace --- core/src/avm2/e4x.rs | 3 ++- core/src/avm2/object/xml_list_object.rs | 1 + core/src/avm2/object/xml_object.rs | 3 ++- .../tests/swfs/from_avmplus/e4x/Expressions/e11_1_2/test.toml | 1 - 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/avm2/e4x.rs b/core/src/avm2/e4x.rs index 06cec7224..eb4d9764b 100644 --- a/core/src/avm2/e4x.rs +++ b/core/src/avm2/e4x.rs @@ -212,6 +212,7 @@ impl<'gc> E4XNode<'gc> { pub fn attribute( mc: &Mutation<'gc>, + namespace: Option>, name: AvmString<'gc>, value: AvmString<'gc>, parent: Option>, @@ -220,7 +221,7 @@ impl<'gc> E4XNode<'gc> { mc, E4XNodeData { parent, - namespace: None, + namespace: namespace.map(Box::new), local_name: Some(name), kind: E4XNodeKind::Attribute(value), notification: None, diff --git a/core/src/avm2/object/xml_list_object.rs b/core/src/avm2/object/xml_list_object.rs index 81dc1c9a0..02abc7e2b 100644 --- a/core/src/avm2/object/xml_list_object.rs +++ b/core/src/avm2/object/xml_list_object.rs @@ -722,6 +722,7 @@ impl<'gc> TObject<'gc> for XmlListObject<'gc> { // 2.c.iv.3. Let y.[[Class]] = "attribute" E4XNode::attribute( activation.gc(), + x.explicit_namespace().map(E4XNamespace::new_uri), x.local_name().unwrap(), "".into(), r, diff --git a/core/src/avm2/object/xml_object.rs b/core/src/avm2/object/xml_object.rs index 361377882..279425e8b 100644 --- a/core/src/avm2/object/xml_object.rs +++ b/core/src/avm2/object/xml_object.rs @@ -511,7 +511,8 @@ impl<'gc> TObject<'gc> for XmlObject<'gc> { let Some(local_name) = name.local_name() else { return Err(format!("Cannot set attribute {:?} without a local name", name).into()); }; - let new_attr = E4XNode::attribute(mc, local_name, value, Some(self.node())); + let ns = name.explicit_namespace().map(E4XNamespace::new_uri); + let new_attr = E4XNode::attribute(mc, ns, local_name, value, Some(self.node())); let node = self.0.node.get(); let mut kind = node.kind_mut(mc); diff --git a/tests/tests/swfs/from_avmplus/e4x/Expressions/e11_1_2/test.toml b/tests/tests/swfs/from_avmplus/e4x/Expressions/e11_1_2/test.toml index e115772d5..cf6123969 100644 --- a/tests/tests/swfs/from_avmplus/e4x/Expressions/e11_1_2/test.toml +++ b/tests/tests/swfs/from_avmplus/e4x/Expressions/e11_1_2/test.toml @@ -1,2 +1 @@ num_ticks = 1 -known_failure = true # https://github.com/ruffle-rs/ruffle/issues/12351