From 6f48f3436fc23c6fa41f98abf66d8462410573f4 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 25 Dec 2019 20:55:24 -0500 Subject: [PATCH] Expose `previousSibling` and `nextSibling` to ActionScript. This commit also fixes a bug caused by excessive use of copypaste, which was detected by the included test. --- core/src/avm1/globals/xml.rs | 42 +++++++++++++++++++ core/src/xml/tree.rs | 2 +- core/tests/regression_tests.rs | 1 + core/tests/swfs/avm1/xml_siblings/output.txt | 10 +++++ core/tests/swfs/avm1/xml_siblings/test.fla | Bin 0 -> 22016 bytes core/tests/swfs/avm1/xml_siblings/test.swf | Bin 0 -> 246 bytes 6 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 core/tests/swfs/avm1/xml_siblings/output.txt create mode 100644 core/tests/swfs/avm1/xml_siblings/test.fla create mode 100644 core/tests/swfs/avm1/xml_siblings/test.swf diff --git a/core/src/avm1/globals/xml.rs b/core/src/avm1/globals/xml.rs index 92b906b72..389e1e7e9 100644 --- a/core/src/avm1/globals/xml.rs +++ b/core/src/avm1/globals/xml.rs @@ -299,6 +299,48 @@ pub fn create_xmlnode_proto<'gc>( None, ReadOnly.into(), ); + xmlnode_proto.add_property( + gc_context, + "previousSibling", + Executable::Native(|avm, ac, this: Object<'gc>, _args| { + if let Some(node) = this.as_xml_node() { + return Ok(node + .prev_sibling() + .unwrap_or(None) + .map(|mut parent| { + parent + .script_object(ac.gc_context, Some(avm.prototypes.xml_node)) + .into() + }) + .unwrap_or_else(|| Value::Null.into())); + } + + Ok(Value::Undefined.into()) + }), + None, + ReadOnly.into(), + ); + xmlnode_proto.add_property( + gc_context, + "nextSibling", + Executable::Native(|avm, ac, this: Object<'gc>, _args| { + if let Some(node) = this.as_xml_node() { + return Ok(node + .next_sibling() + .unwrap_or(None) + .map(|mut parent| { + parent + .script_object(ac.gc_context, Some(avm.prototypes.xml_node)) + .into() + }) + .unwrap_or_else(|| Value::Null.into())); + } + + Ok(Value::Undefined.into()) + }), + None, + ReadOnly.into(), + ); xmlnode_proto .as_script_object() .unwrap() diff --git a/core/src/xml/tree.rs b/core/src/xml/tree.rs index 88564e792..753540f88 100644 --- a/core/src/xml/tree.rs +++ b/core/src/xml/tree.rs @@ -320,7 +320,7 @@ impl<'gc> XMLNode<'gc> { .checked_sub(1) .and_then(|p| children.get(p).cloned()); let new_next = new_child_position - .checked_sub(1) + .checked_add(1) .and_then(|p| children.get(p).cloned()); child.adopt_siblings(mc, new_prev, new_next)? diff --git a/core/tests/regression_tests.rs b/core/tests/regression_tests.rs index 38bc7f85c..7a809648f 100644 --- a/core/tests/regression_tests.rs +++ b/core/tests/regression_tests.rs @@ -111,6 +111,7 @@ swf_tests! { (xml_has_child_nodes, "avm1/xml_has_child_nodes", 1), (xml_first_last_child, "avm1/xml_first_last_child", 1), (xml_parent_and_child, "avm1/xml_parent_and_child", 1), + (xml_siblings, "avm1/xml_siblings", 1), } #[test] diff --git a/core/tests/swfs/avm1/xml_siblings/output.txt b/core/tests/swfs/avm1/xml_siblings/output.txt new file mode 100644 index 000000000..e91f9bcdb --- /dev/null +++ b/core/tests/swfs/avm1/xml_siblings/output.txt @@ -0,0 +1,10 @@ +null +true +true +true +true +true +true +null +null +null diff --git a/core/tests/swfs/avm1/xml_siblings/test.fla b/core/tests/swfs/avm1/xml_siblings/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..d1f054e76af3ed24df68d42b4cabfa50532fabd8 GIT binary patch literal 22016 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 b*cu**T8nM?%S3f+iTsuzWHRB>f93r@ZVhc@ literal 0 HcmV?d00001 diff --git a/core/tests/swfs/avm1/xml_siblings/test.swf b/core/tests/swfs/avm1/xml_siblings/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..cb74897939b8386f111dd875b551497c41ec4e75 GIT binary patch literal 246 zcmVUl3Z5D=DIRfDjnQPF~M1p0*y(UOG+4l`2k*lWk2UlHdGZvS()!5!k2cQh4p w@G_o!oUFeckWzs5bw)XE7_a46gHg^k%&p~kgLzZ}^+tGZFs&-z0YdU!#@s!2@&Et; literal 0 HcmV?d00001