From 0ed447b42877b10fdaaf913015eb2783cd9afb04 Mon Sep 17 00:00:00 2001 From: Abiel Deneke Date: Fri, 18 Aug 2023 20:57:50 -0500 Subject: [PATCH] avm1: Set target clip to None if target is an undefined object SetTarget currently sets the target clip to the base clip if the target passed to tellTarget() is an undefined object. This causes goto's to run on the base clip in Ruffle, when Adobe Flash Player does not run the goto's at all. Fixes #12389 and #12390 --- core/src/avm1/activation.rs | 15 +++++++++++---- .../swfs/avm1/tell_target_invalid/output.txt | 5 ++++- .../swfs/avm1/tell_target_invalid/test.fla | Bin 6335 -> 4505 bytes .../swfs/avm1/tell_target_invalid/test.swf | Bin 260 -> 474 bytes .../swfs/avm1/tell_target_invalid/test.toml | 2 +- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/core/src/avm1/activation.rs b/core/src/avm1/activation.rs index 30e9c7fba..e8e35296e 100644 --- a/core/src/avm1/activation.rs +++ b/core/src/avm1/activation.rs @@ -1981,9 +1981,7 @@ impl<'a, 'gc> Activation<'a, 'gc> { return self.set_target(&target); } Value::Undefined => { - // Reset. - let base_clip = self.base_clip(); - self.set_target_clip(Some(base_clip)); + self.set_target_clip(None); } Value::Object(o) => { if let Some(clip) = o.as_display_object() { @@ -2012,7 +2010,10 @@ impl<'a, 'gc> Activation<'a, 'gc> { } }; - let clip_obj = self.target_clip_or_root().object().coerce_to_object(self); + let clip_obj = self + .target_clip_or_base_clip() + .object() + .coerce_to_object(self); self.set_scope(Scope::new_target_scope( self.scope(), @@ -2925,6 +2926,12 @@ impl<'a, 'gc> Activation<'a, 'gc> { .unwrap_or_else(|| self.base_clip().avm1_root()) } + /// The current target clip of the executing code. + /// Actions that affect the base clip after an invalid `tellTarget` will use this. + pub fn target_clip_or_base_clip(&self) -> DisplayObject<'gc> { + self.target_clip().unwrap_or_else(|| self.base_clip()) + } + /// Obtain the value of `_root`. pub fn root_object(&self) -> Value<'gc> { self.base_clip().avm1_root().object() diff --git a/tests/tests/swfs/avm1/tell_target_invalid/output.txt b/tests/tests/swfs/avm1/tell_target_invalid/output.txt index 6b7bf9523..e77fbd8f4 100644 --- a/tests/tests/swfs/avm1/tell_target_invalid/output.txt +++ b/tests/tests/swfs/avm1/tell_target_invalid/output.txt @@ -1,3 +1,6 @@ Target not found: Target="dummy" Base="_level0.mc" -/tellTarget('dummy') { gotoAndStop(n); } +/tellTarget('dummy') { gotoAndPlay(n); } +pass +/tellTarget(undefined) { gotoAndPlay(5); } +/tellTarget(undefined) { gotoAndPlay(n); } pass diff --git a/tests/tests/swfs/avm1/tell_target_invalid/test.fla b/tests/tests/swfs/avm1/tell_target_invalid/test.fla index c352bbc6108903cdff755f5b249d292f59798c62..135be0a5b88004a1cb2003860898426f26ddffc7 100644 GIT binary patch literal 4505 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 diff --git a/tests/tests/swfs/avm1/tell_target_invalid/test.swf b/tests/tests/swfs/avm1/tell_target_invalid/test.swf index ec078e0891c214f39ebb47e6a48addc4424cd690..09e1e704f7d77c2f4cf4b8910a634ee4a35699fc 100644 GIT binary patch literal 474 zcmZ<@59Ytc$iPs+z#7lMz`uZjL4uXRMUVjqoSFXr|8LLC1Z1)^>}OB~(u@oV40a7b z1k|Aw!zjXV=FAyE(FTTJax)BG)bdTg@S>T4;XkJUP$?5oaT^;OBamWn0P_EHS^`M+%x~4+4LVA8lzGGfWKu%(%MxLg% zLM=l#8v|IHVHy(y2g5X026m9cY(P9lHL#e>e4u6BKuaL@0;L^*(4N^9VjClhU8Q*` zscD&csVV5TnSyPb#>l{|05(;vk%@tY0c-GXo=oJ#*y5GL5w0lKcXV zJWXqbT83^mhLqCW+)9RN>`Xv~Hq)3GI2hGHB!kR+plRJe%+SWh#>fDab^x;X ivvC4RHAbMB47tfbA$w+SpujXX28M#f;$j9huqps?5f?!K diff --git a/tests/tests/swfs/avm1/tell_target_invalid/test.toml b/tests/tests/swfs/avm1/tell_target_invalid/test.toml index dbee897f5..1e15fdf27 100644 --- a/tests/tests/swfs/avm1/tell_target_invalid/test.toml +++ b/tests/tests/swfs/avm1/tell_target_invalid/test.toml @@ -1 +1 @@ -num_frames = 1 +num_frames = 5