From d22b07167c8587fb342e1c1068b08ad83c723607 Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Thu, 16 Mar 2023 00:13:57 +0100 Subject: [PATCH] avm2: Implement XML.nodeKind --- core/src/avm2/globals/XML.as | 6 ++++ core/src/avm2/globals/xml.rs | 18 ++++++++++++ tests/tests/swfs/avm2/xml_nodekind/Test.as | 26 ++++++++++++++++++ tests/tests/swfs/avm2/xml_nodekind/output.txt | 3 ++ tests/tests/swfs/avm2/xml_nodekind/test.fla | Bin 0 -> 4423 bytes tests/tests/swfs/avm2/xml_nodekind/test.swf | Bin 0 -> 978 bytes tests/tests/swfs/avm2/xml_nodekind/test.toml | 1 + 7 files changed, 54 insertions(+) create mode 100644 tests/tests/swfs/avm2/xml_nodekind/Test.as create mode 100644 tests/tests/swfs/avm2/xml_nodekind/output.txt create mode 100644 tests/tests/swfs/avm2/xml_nodekind/test.fla create mode 100644 tests/tests/swfs/avm2/xml_nodekind/test.swf create mode 100644 tests/tests/swfs/avm2/xml_nodekind/test.toml diff --git a/core/src/avm2/globals/XML.as b/core/src/avm2/globals/XML.as index 02f53afc4..15ae80b5c 100644 --- a/core/src/avm2/globals/XML.as +++ b/core/src/avm2/globals/XML.as @@ -16,6 +16,7 @@ package { AS3 native function elements(name:*):XMLList; AS3 native function attributes():XMLList; AS3 native function attribute(name:*):XMLList; + AS3 native function nodeKind():String; AS3 native function toString():String; @@ -71,5 +72,10 @@ package { var self:XML = this; return self.AS3::attribute(name); }; + + prototype.nodeKind = function():String { + var self:XML = this; + return self.AS3::nodeKind(); + }; } } diff --git a/core/src/avm2/globals/xml.rs b/core/src/avm2/globals/xml.rs index 3683cd10f..b5c81be19 100644 --- a/core/src/avm2/globals/xml.rs +++ b/core/src/avm2/globals/xml.rs @@ -203,3 +203,21 @@ pub fn call_handler<'gc>( .construct(activation, args)? .into()) } + +pub fn node_kind<'gc>( + _activation: &mut Activation<'_, 'gc>, + this: Option>, + _args: &[Value<'gc>], +) -> Result, Error<'gc>> { + let this = this.unwrap(); + let xml = this.as_xml_object().unwrap(); + let name = match &*xml.node().kind() { + E4XNodeKind::Text(_) => "text", + E4XNodeKind::CData(_) => "text", // cdata pretends to be text here + E4XNodeKind::Comment(_) => "comment", + E4XNodeKind::ProcessingInstruction(_) => "processing-instruction", + E4XNodeKind::Attribute(_) => "attribute", + E4XNodeKind::Element { .. } => "element", + }; + Ok(name.into()) +} diff --git a/tests/tests/swfs/avm2/xml_nodekind/Test.as b/tests/tests/swfs/avm2/xml_nodekind/Test.as new file mode 100644 index 000000000..53ae2649d --- /dev/null +++ b/tests/tests/swfs/avm2/xml_nodekind/Test.as @@ -0,0 +1,26 @@ +package { + + import flash.display.MovieClip; + + + public class Test extends MovieClip { + + + public function Test() { + // Taken from https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/XML.html#nodeKind() + // Modified to run with what ruffle support + //XML.ignoreComments = false; + + var xml:XML = + + + and some text + ; + + trace(xml.nodeKind()); // element + trace(xml.children()[0].nodeKind()); // text + trace(xml.children()[1].nodeKind()); // text + } + } + +} diff --git a/tests/tests/swfs/avm2/xml_nodekind/output.txt b/tests/tests/swfs/avm2/xml_nodekind/output.txt new file mode 100644 index 000000000..464314f8e --- /dev/null +++ b/tests/tests/swfs/avm2/xml_nodekind/output.txt @@ -0,0 +1,3 @@ +element +text +text diff --git a/tests/tests/swfs/avm2/xml_nodekind/test.fla b/tests/tests/swfs/avm2/xml_nodekind/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..6edb6f290a9eaa62b4734c01c91dd6f208b23802 GIT binary patch literal 4423 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 literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/xml_nodekind/test.swf b/tests/tests/swfs/avm2/xml_nodekind/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..324767c865168fb557580851586dd3ea4a8d85ec GIT binary patch literal 978 zcmV;@11EHUBw}0D%dWH+EqDwVf<#=^rLHPT> zX^|HD*9)jn%%NgVR=S0vs+3hl{sze^LQC8b8B#lhVgpmWN-lR1V=Ag#S|+bxXLQFf z`!}CNzDJ5R>4B4<=B=SGtaV48HN7uGmxx7%#HK#8SDxBy=xX2bhM3l|>sqFc13_t$ z^9PRp%NSpiTtBe7Cfx%+HzjtmPUqQSZI)|9FDtJJw#%h5-H zZ!S8PH4=+liDzCD zL-U;B^cGy~`6O`aI6Jp0uxaYAYOb-V{BH+)M4hV{pL3u`)VZ4Te{A|k32|{T_dcyJ zX=&C3>mq1!cXxLmpCws?gy2FaHW6h2KJNd)1pzj8Kt7lbL9|PJnwq{DmZ|Sr_(teB z*CuINrW<+J`SH9)CV1#tL^O@#tcnCmLWavEGRe$lCY9OBY^T5A zQc)P&;3IJ%k=#seZSj!fxhM}~JmiHq6n5Zq$irQJdynV#dF~m{rFrfk0+t7aoDi8- z4CEk;LckVKNJMVY8y1RiiR95Ox;+KG$hR9O@VCfcm(f497&wc<;9~>40)2jE4d-jd z=a{7M`W6w;i=&=^dI{7^qTVLzrBIJ!zjxrPa0~+YcY6W|t2ZcF@ICwZ8(!UIaFy5M AYXATM literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/xml_nodekind/test.toml b/tests/tests/swfs/avm2/xml_nodekind/test.toml new file mode 100644 index 000000000..dbee897f5 --- /dev/null +++ b/tests/tests/swfs/avm2/xml_nodekind/test.toml @@ -0,0 +1 @@ +num_frames = 1