From ee7403952afe1436d84f94bcbdd0d23209cb7d39 Mon Sep 17 00:00:00 2001 From: Toad06 Date: Sun, 30 Apr 2023 00:43:14 +0200 Subject: [PATCH] avm1: Allow `button.enabled` to hold any value --- core/src/avm1/globals/button.rs | 28 +------ core/src/avm1/globals/movie_clip.rs | 24 +----- .../avm2/globals/flash/display/movie_clip.rs | 4 +- core/src/display_object/avm1_button.rs | 41 ++++++---- core/src/display_object/avm2_button.rs | 6 +- core/src/display_object/edit_text.rs | 6 +- core/src/display_object/interactive.rs | 8 +- core/src/display_object/loader_display.rs | 6 +- core/src/display_object/movie_clip.rs | 70 +++++++++++++----- core/src/display_object/stage.rs | 6 +- .../button_enabled_special_cases/test.swf | Bin 701 -> 0 bytes .../input.json | 0 .../output.txt | 4 +- .../source.txt | 16 ++-- .../button_properties_special_cases/test.swf | Bin 0 -> 712 bytes .../test.toml | 1 - 16 files changed, 122 insertions(+), 98 deletions(-) delete mode 100644 tests/tests/swfs/avm1/button_enabled_special_cases/test.swf rename tests/tests/swfs/avm1/{button_enabled_special_cases => button_properties_special_cases}/input.json (100%) rename tests/tests/swfs/avm1/{button_enabled_special_cases => button_properties_special_cases}/output.txt (79%) rename tests/tests/swfs/avm1/{button_enabled_special_cases => button_properties_special_cases}/source.txt (73%) create mode 100644 tests/tests/swfs/avm1/button_properties_special_cases/test.swf rename tests/tests/swfs/avm1/{button_enabled_special_cases => button_properties_special_cases}/test.toml (53%) diff --git a/core/src/avm1/globals/button.rs b/core/src/avm1/globals/button.rs index 1402ee683..003bc69b7 100644 --- a/core/src/avm1/globals/button.rs +++ b/core/src/avm1/globals/button.rs @@ -38,10 +38,10 @@ macro_rules! button_setter { } const PROTO_DECLS: &[Declaration] = declare_properties! { - "enabled" => property(button_getter!(enabled), button_setter!(set_enabled)); - "getDepth" => method(globals::get_depth; DONT_ENUM | DONT_DELETE | READ_ONLY | VERSION_6); + "enabled" => bool(true); + "getDepth" => method(globals::get_depth; DONT_DELETE | READ_ONLY | VERSION_6); "useHandCursor" => property(button_getter!(use_hand_cursor), button_setter!(set_use_hand_cursor)); - "blendMode" => property(button_getter!(blend_mode), button_setter!(set_blend_mode); DONT_DELETE | DONT_ENUM); + "blendMode" => property(button_getter!(blend_mode), button_setter!(set_blend_mode); DONT_DELETE); }; pub fn create_proto<'gc>( @@ -63,28 +63,6 @@ pub fn constructor<'gc>( Ok(this.into()) } -fn enabled<'gc>( - this: Avm1Button<'gc>, - _activation: &mut Activation<'_, 'gc>, -) -> Result, Error<'gc>> { - // TODO: This property should return the value set by the user. - Ok(this.enabled().into()) -} - -fn set_enabled<'gc>( - this: Avm1Button<'gc>, - activation: &mut Activation<'_, 'gc>, - value: Value<'gc>, -) -> Result<(), Error<'gc>> { - let enabled = if matches!(value, Value::Undefined) { - true - } else { - value.as_bool(activation.swf_version()) - }; - this.set_enabled(&mut activation.context, enabled); - Ok(()) -} - fn use_hand_cursor<'gc>( this: Avm1Button<'gc>, _activation: &mut Activation<'_, 'gc>, diff --git a/core/src/avm1/globals/movie_clip.rs b/core/src/avm1/globals/movie_clip.rs index 5d78dcd23..b1e5a1fe8 100644 --- a/core/src/avm1/globals/movie_clip.rs +++ b/core/src/avm1/globals/movie_clip.rs @@ -107,7 +107,7 @@ const PROTO_DECLS: &[Declaration] = declare_properties! { "attachBitmap" => method(mc_method!(attach_bitmap); DONT_ENUM | DONT_DELETE | VERSION_8); "removeMovieClip" => method(remove_movie_clip; DONT_ENUM | DONT_DELETE); "transform" => property(mc_getter!(transform), mc_setter!(set_transform); DONT_ENUM | VERSION_8); - "enabled" => property(mc_getter!(enabled), mc_setter!(set_enabled); DONT_DELETE | DONT_ENUM); + "enabled" => bool(true; DONT_ENUM); "_lockroot" => property(mc_getter!(lock_root), mc_setter!(set_lock_root); DONT_DELETE | DONT_ENUM); "useHandCursor" => property(mc_getter!(use_hand_cursor), mc_setter!(set_use_hand_cursor); DONT_DELETE | DONT_ENUM); "blendMode" => property(mc_getter!(blend_mode), mc_setter!(set_blend_mode); DONT_DELETE | DONT_ENUM); @@ -1409,28 +1409,6 @@ fn set_transform<'gc>( Ok(()) } -fn enabled<'gc>( - this: MovieClip<'gc>, - _activation: &mut Activation<'_, 'gc>, -) -> Result, Error<'gc>> { - // TODO: This property should return the value set by the user. - Ok(this.enabled().into()) -} - -fn set_enabled<'gc>( - this: MovieClip<'gc>, - activation: &mut Activation<'_, 'gc>, - value: Value<'gc>, -) -> Result<(), Error<'gc>> { - let enabled = if matches!(value, Value::Undefined) { - true - } else { - value.as_bool(activation.swf_version()) - }; - this.set_enabled(&mut activation.context, enabled); - Ok(()) -} - fn lock_root<'gc>( this: MovieClip<'gc>, _activation: &mut Activation<'_, 'gc>, diff --git a/core/src/avm2/globals/flash/display/movie_clip.rs b/core/src/avm2/globals/flash/display/movie_clip.rs index 3499259bc..b13702492 100644 --- a/core/src/avm2/globals/flash/display/movie_clip.rs +++ b/core/src/avm2/globals/flash/display/movie_clip.rs @@ -204,7 +204,7 @@ pub fn get_enabled<'gc>( .and_then(|o| o.as_display_object()) .and_then(|dobj| dobj.as_movie_clip()) { - return Ok(mc.enabled().into()); + return Ok(mc.avm2_enabled().into()); } Ok(Value::Undefined) @@ -221,7 +221,7 @@ pub fn set_enabled<'gc>( { let enabled = args.get_bool(0); - mc.set_enabled(&mut activation.context, enabled); + mc.set_avm2_enabled(&mut activation.context, enabled); } Ok(Value::Undefined) diff --git a/core/src/display_object/avm1_button.rs b/core/src/display_object/avm1_button.rs index deea3dff3..a51a4f242 100644 --- a/core/src/display_object/avm1_button.rs +++ b/core/src/display_object/avm1_button.rs @@ -1,4 +1,4 @@ -use crate::avm1::{Object, StageObject, Value}; +use crate::avm1::{Activation, ActivationIdentifier, Object, StageObject, TObject, Value}; use crate::backend::ui::MouseCursor; use crate::context::{ActionType, RenderContext, UpdateContext}; use crate::display_object::container::{ @@ -43,7 +43,6 @@ pub struct Avm1ButtonData<'gc> { object: Option>, initialized: bool, has_focus: bool, - enabled: bool, use_hand_cursor: bool, } @@ -90,7 +89,6 @@ impl<'gc> Avm1Button<'gc> { ButtonTracking::Push }, has_focus: false, - enabled: true, use_hand_cursor: true, }, )) @@ -197,12 +195,23 @@ impl<'gc> Avm1Button<'gc> { } } - pub fn enabled(self) -> bool { - self.0.read().enabled - } - - pub fn set_enabled(self, context: &mut UpdateContext<'_, 'gc>, enabled: bool) { - self.0.write(context.gc_context).enabled = enabled; + pub fn enabled(self, context: &mut UpdateContext<'_, 'gc>) -> bool { + if let Some(object) = self.0.read().object { + let mut activation = Activation::from_stub( + context.reborrow(), + ActivationIdentifier::root("[AVM1 Button Enabled]"), + ); + if let Ok(enabled) = object.get("enabled", &mut activation) { + match enabled { + Value::Undefined => true, + _ => enabled.as_bool(activation.swf_version()), + } + } else { + true + } + } else { + false + } } pub fn use_hand_cursor(self) -> bool { @@ -421,7 +430,11 @@ impl<'gc> TInteractiveObject<'gc> for Avm1Button<'gc> { self.into() } - fn filter_clip_event(self, _event: ClipEvent) -> ClipEventResult { + fn filter_clip_event( + self, + _context: &mut UpdateContext<'_, 'gc>, + _event: ClipEvent, + ) -> ClipEventResult { // An invisible button can still run its `rollOut` or `releaseOutside` event. // A disabled button doesn't run its events (`KeyPress` being the exception) but // its state can still change. This is tested at "avm1/mouse_events_visible_enabled". @@ -438,6 +451,8 @@ impl<'gc> TInteractiveObject<'gc> for Avm1Button<'gc> { event: ClipEvent, ) -> ClipEventResult { let self_display_object = self.into(); + let is_enabled = self.enabled(context); + let mut write = self.0.write(context.gc_context); // Translate the clip event to a button event, based on how the button state changes. @@ -489,7 +504,7 @@ impl<'gc> TInteractiveObject<'gc> for Avm1Button<'gc> { _ => return ClipEventResult::NotHandled, }; - let (update_state, new_state) = if write.enabled { + let (update_state, new_state) = if is_enabled { write.run_actions(context, condition, None); write.play_sound(context, sound); @@ -557,8 +572,8 @@ impl<'gc> TInteractiveObject<'gc> for Avm1Button<'gc> { None } - fn mouse_cursor(self, _context: &mut UpdateContext<'_, 'gc>) -> MouseCursor { - if self.use_hand_cursor() && self.enabled() { + fn mouse_cursor(self, context: &mut UpdateContext<'_, 'gc>) -> MouseCursor { + if self.use_hand_cursor() && self.enabled(context) { MouseCursor::Hand } else { MouseCursor::Arrow diff --git a/core/src/display_object/avm2_button.rs b/core/src/display_object/avm2_button.rs index cf46a52c8..f5cdbf100 100644 --- a/core/src/display_object/avm2_button.rs +++ b/core/src/display_object/avm2_button.rs @@ -703,7 +703,11 @@ impl<'gc> TInteractiveObject<'gc> for Avm2Button<'gc> { self.into() } - fn filter_clip_event(self, event: ClipEvent) -> ClipEventResult { + fn filter_clip_event( + self, + _context: &mut UpdateContext<'_, 'gc>, + event: ClipEvent, + ) -> ClipEventResult { if !self.visible() { return ClipEventResult::NotHandled; } diff --git a/core/src/display_object/edit_text.rs b/core/src/display_object/edit_text.rs index c1a1070ae..f6e4ec9a6 100644 --- a/core/src/display_object/edit_text.rs +++ b/core/src/display_object/edit_text.rs @@ -1797,7 +1797,11 @@ impl<'gc> TInteractiveObject<'gc> for EditText<'gc> { self.into() } - fn filter_clip_event(self, event: ClipEvent) -> ClipEventResult { + fn filter_clip_event( + self, + _context: &mut UpdateContext<'_, 'gc>, + event: ClipEvent, + ) -> ClipEventResult { if event != ClipEvent::Press { return ClipEventResult::NotHandled; } diff --git a/core/src/display_object/interactive.rs b/core/src/display_object/interactive.rs index 0d50d2173..e588eee2a 100644 --- a/core/src/display_object/interactive.rs +++ b/core/src/display_object/interactive.rs @@ -168,7 +168,11 @@ pub trait TInteractiveObject<'gc>: /// machinery should run. Otherwise, the event will not be handled, neither /// by this interactive object nor it's children. The event will be passed /// onto other siblings of the display object instead. - fn filter_clip_event(self, event: ClipEvent) -> ClipEventResult; + fn filter_clip_event( + self, + _context: &mut UpdateContext<'_, 'gc>, + event: ClipEvent, + ) -> ClipEventResult; /// Propagate the event to children. /// @@ -424,7 +428,7 @@ pub trait TInteractiveObject<'gc>: return ClipEventResult::NotHandled; } - if self.filter_clip_event(event) == ClipEventResult::NotHandled { + if self.filter_clip_event(context, event) == ClipEventResult::NotHandled { return ClipEventResult::NotHandled; } diff --git a/core/src/display_object/loader_display.rs b/core/src/display_object/loader_display.rs index 675d8d021..77a4b1a3b 100644 --- a/core/src/display_object/loader_display.rs +++ b/core/src/display_object/loader_display.rs @@ -159,7 +159,11 @@ impl<'gc> TInteractiveObject<'gc> for LoaderDisplay<'gc> { self.into() } - fn filter_clip_event(self, _event: ClipEvent) -> ClipEventResult { + fn filter_clip_event( + self, + _context: &mut UpdateContext<'_, 'gc>, + _event: ClipEvent, + ) -> ClipEventResult { ClipEventResult::NotHandled } fn event_dispatch( diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 52141907b..fdafab064 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -111,7 +111,7 @@ pub struct MovieClipData<'gc> { avm2_class: Option>, drawing: Drawing, has_focus: bool, - enabled: bool, + avm2_enabled: bool, /// Show a hand cursor when the clip is in button mode. use_hand_cursor: bool, @@ -154,7 +154,7 @@ impl<'gc> MovieClip<'gc> { avm2_class: None, drawing: Drawing::new(), has_focus: false, - enabled: true, + avm2_enabled: true, use_hand_cursor: true, button_mode: false, last_queued_script_frame: None, @@ -193,7 +193,7 @@ impl<'gc> MovieClip<'gc> { avm2_class: Some(class), drawing: Drawing::new(), has_focus: false, - enabled: true, + avm2_enabled: true, use_hand_cursor: true, button_mode: false, last_queued_script_frame: None, @@ -236,7 +236,7 @@ impl<'gc> MovieClip<'gc> { avm2_class: None, drawing: Drawing::new(), has_focus: false, - enabled: true, + avm2_enabled: true, use_hand_cursor: true, button_mode: false, last_queued_script_frame: None, @@ -301,7 +301,7 @@ impl<'gc> MovieClip<'gc> { avm2_class: None, drawing: Drawing::new(), has_focus: false, - enabled: true, + avm2_enabled: true, use_hand_cursor: true, button_mode: false, last_queued_script_frame: None, @@ -2208,12 +2208,40 @@ impl<'gc> MovieClip<'gc> { Ok(()) } - pub fn enabled(self) -> bool { - self.0.read().enabled + fn enabled(self, context: &mut UpdateContext<'_, 'gc>) -> bool { + if !context.is_action_script_3() { + self.avm1_enabled(context) + } else { + self.avm2_enabled() + } } - pub fn set_enabled(self, context: &mut UpdateContext<'_, 'gc>, enabled: bool) { - self.0.write(context.gc_context).enabled = enabled; + fn avm1_enabled(self, context: &mut UpdateContext<'_, 'gc>) -> bool { + let object = self.object(); + if let Avm1Value::Object(object) = object { + let mut activation = Avm1Activation::from_stub( + context.reborrow(), + ActivationIdentifier::root("[AVM1 MovieClip Enabled]"), + ); + if let Ok(enabled) = object.get("enabled", &mut activation) { + match enabled { + Avm1Value::Undefined => true, + _ => enabled.as_bool(activation.swf_version()), + } + } else { + true + } + } else { + false + } + } + + pub fn avm2_enabled(self) -> bool { + self.0.read().avm2_enabled + } + + pub fn set_avm2_enabled(self, context: &mut UpdateContext<'_, 'gc>, enabled: bool) { + self.0.write(context.gc_context).avm2_enabled = enabled; } pub fn use_hand_cursor(self) -> bool { @@ -2783,17 +2811,19 @@ impl<'gc> TInteractiveObject<'gc> for MovieClip<'gc> { self.into() } - fn filter_clip_event(self, event: ClipEvent) -> ClipEventResult { - if event.is_button_event() && !self.visible() && !matches!(event, ClipEvent::ReleaseOutside) - { - return ClipEventResult::NotHandled; - } + fn filter_clip_event( + self, + context: &mut UpdateContext<'_, 'gc>, + event: ClipEvent, + ) -> ClipEventResult { + if event.is_button_event() { + if !self.visible() && !matches!(event, ClipEvent::ReleaseOutside) { + return ClipEventResult::NotHandled; + } - if !self.enabled() - && event.is_button_event() - && !matches!(event, ClipEvent::KeyPress { .. }) - { - return ClipEventResult::NotHandled; + if !self.enabled(context) && !matches!(event, ClipEvent::KeyPress { .. }) { + return ClipEventResult::NotHandled; + } } ClipEventResult::Handled @@ -3090,7 +3120,7 @@ impl<'gc> TInteractiveObject<'gc> for MovieClip<'gc> { } fn mouse_cursor(self, context: &mut UpdateContext<'_, 'gc>) -> MouseCursor { - if self.use_hand_cursor() && self.enabled() && self.is_button_mode(context) { + if self.use_hand_cursor() && self.enabled(context) && self.is_button_mode(context) { MouseCursor::Hand } else { MouseCursor::Arrow diff --git a/core/src/display_object/stage.rs b/core/src/display_object/stage.rs index 79ada0593..5f64c8365 100644 --- a/core/src/display_object/stage.rs +++ b/core/src/display_object/stage.rs @@ -867,7 +867,11 @@ impl<'gc> TInteractiveObject<'gc> for Stage<'gc> { self.into() } - fn filter_clip_event(self, _event: ClipEvent) -> ClipEventResult { + fn filter_clip_event( + self, + _context: &mut UpdateContext<'_, 'gc>, + _event: ClipEvent, + ) -> ClipEventResult { ClipEventResult::Handled } diff --git a/tests/tests/swfs/avm1/button_enabled_special_cases/test.swf b/tests/tests/swfs/avm1/button_enabled_special_cases/test.swf deleted file mode 100644 index 425d4846b1741138d06b01e7ec2060d245de08a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701 zcmV;u0z&;mS5pX-1^@tfoW)enYZE~jeLI_NqqfG>)Lg189#Ta}EyYVQrCK5MU{Vzi z9<)u(B;B&?hTYlJ{sjhwq9B1B1QAa{Zyr1d#hc9Ki@1^mf0js_KdBt=Y6w1l{Z@VTFdlq5w_knt;I*a+N}Hr0 zpLVC6xbR`W`u@#r|NHK*&nfr$qw`P_`XGt9xweuJolZMIVlRHn00@x8xW?TeMs(R= zmj4@*JXG_j?_)h+%yll^WtQupNf1ZVz^L#l23jtSIgT~bJi((jE%|halzA+oajKV6 z447|~hsk6y4UJtbjaAQe8GJ@-piXJsrsZYlvP?(WwVV#vFL{I0P0X9P>eel~WLvdt z&2yQ{wre!IQSysh&Wh*OsK>U?Oos~7XQO;{`RM1P%Qr2@RI~C#)yal24$RD${g|0E z1E)+Ymc!ky^~css%Qqc&%Pg6dlI?Gs^^zUX>_A#qWN_GLmTeECqlghT?zqg$#ONQ! z4>Zd>p$*Tq?P8sJs*qE%f`z6Ay)yBX;0cMqohlc57}<%7|!A@kFk>wUt??&gx0CU@Keq-B7IHe zMKhY0;`vO(2cJ_PlMtPe0%{J}Z8hx3ypq diff --git a/tests/tests/swfs/avm1/button_enabled_special_cases/input.json b/tests/tests/swfs/avm1/button_properties_special_cases/input.json similarity index 100% rename from tests/tests/swfs/avm1/button_enabled_special_cases/input.json rename to tests/tests/swfs/avm1/button_properties_special_cases/input.json diff --git a/tests/tests/swfs/avm1/button_enabled_special_cases/output.txt b/tests/tests/swfs/avm1/button_properties_special_cases/output.txt similarity index 79% rename from tests/tests/swfs/avm1/button_enabled_special_cases/output.txt rename to tests/tests/swfs/avm1/button_properties_special_cases/output.txt index 9bb6e5434..561cac79e 100644 --- a/tests/tests/swfs/avm1/button_enabled_special_cases/output.txt +++ b/tests/tests/swfs/avm1/button_properties_special_cases/output.txt @@ -1,19 +1,21 @@ Step 1: rollOver MovieClip.prototype.hasOwnProperty('enabled'): true +button.hasOwnProperty('enabled'): false 'enabled' in button: true button.enabled: true // button.enabled = undefined +button.hasOwnProperty('enabled'): true 'enabled' in button: true `button.enabled` is now a falsy value. `button.enabled` is undefined. Step 2: press -'enabled' in button: true `button.enabled` is still a falsy value. `button.enabled` is still undefined. Step 3: release // delete button.enabled +button.hasOwnProperty('enabled'): false 'enabled' in button: true `button.enabled` is now true. diff --git a/tests/tests/swfs/avm1/button_enabled_special_cases/source.txt b/tests/tests/swfs/avm1/button_properties_special_cases/source.txt similarity index 73% rename from tests/tests/swfs/avm1/button_enabled_special_cases/source.txt rename to tests/tests/swfs/avm1/button_properties_special_cases/source.txt index 20167d4b7..609952974 100644 --- a/tests/tests/swfs/avm1/button_enabled_special_cases/source.txt +++ b/tests/tests/swfs/avm1/button_properties_special_cases/source.txt @@ -3,9 +3,9 @@ if(_root.step === undefined) { _root.step = 1; - _root.enabledInButton = function() { - for(var i in _root.doin) { - if(i === "enabled") { return true; } + _root.propInButton = function(property) { + for(var k in _root.doin) { + if(k === property) { return true; } } return false; }; @@ -16,12 +16,14 @@ if(_root.step === undefined) { case 1: // The mouse moved inside of the button area, this triggers the rollOver event. trace("MovieClip.prototype.hasOwnProperty('enabled'): " + MovieClip.prototype.hasOwnProperty("enabled")); - trace("'enabled' in button: " + enabledInButton()); + trace("button.hasOwnProperty('enabled'): " + button.hasOwnProperty("enabled")); + trace("'enabled' in button: " + propInButton("enabled")); trace("button.enabled: " + button.enabled); button.enabled = false; button.enabled = undefined; trace("// button.enabled = undefined"); - trace("'enabled' in button: " + enabledInButton()); + trace("button.hasOwnProperty('enabled'): " + button.hasOwnProperty("enabled")); + trace("'enabled' in button: " + propInButton("enabled")); if(!button.enabled) { trace("`button.enabled` is now a falsy value."); if(button.enabled === undefined) { @@ -31,7 +33,6 @@ if(_root.step === undefined) { break; case 2: // The mouse left button was pressed, this triggers the press event. - trace("'enabled' in button: " + enabledInButton()); if(!button.enabled) { trace("`button.enabled` is still a falsy value."); if(button.enabled === undefined) { @@ -44,7 +45,8 @@ if(_root.step === undefined) { button.enabled = false; delete button.enabled; trace("// delete button.enabled"); - trace("'enabled' in button: " + enabledInButton()); + trace("button.hasOwnProperty('enabled'): " + button.hasOwnProperty("enabled")); + trace("'enabled' in button: " + propInButton("enabled")); if(button.enabled === true) { trace("`button.enabled` is now true."); } diff --git a/tests/tests/swfs/avm1/button_properties_special_cases/test.swf b/tests/tests/swfs/avm1/button_properties_special_cases/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..bbd7690bfb52c5856053410cbc80ee255e05e77b GIT binary patch literal 712 zcmV;(0yq6bS5pWT2LJ$goW)d4XcIvcemlEKqqfGx)Od)pct{nYwFEE0lxl_0gGsCO zC~aycb!FKNyR)gidNC*zy%cf~M7(OP6Fo zeBGc=U;VPX_W8qI_t%@>-!t~BXIDTjj;5wVT^Ck8#%$~QJ!aSzY!OJnRt!dXu6&}DvQR**okfB}OD= zQuUZ?)Q4g2X$rKzDraHYv26w}qfJcIZq8db1Q+VIVfE|WK_4B8I^42b2AwmF<|Hzh z%{H2J@_x;&u3HPJKpnPmae`X4Rg=~yE}_3a?(rbxK|jwAc%)i5(G5$N{)qZS--f`{ zl-`f&CEc^?v|(77%1Xa&MK@gCve)&R-l&=GhTf`~9-SQM7K#iuyUZ}nVRWQpL=7{p z<1sS2FY!Z@We(Q{$2QGsi#qb4bK-<6TMDR+^a}!eBmxIjQ0-x4GtF<2_5esTIE6(n zr77I3R+b(k1Lep(s!au>RN(iYwwA6z%AKF$ryy2=Nyh%i_ z$uW`b@d|HG+!nbcM)!M(9SF^12Si9oT26+(iHcm7oQU12M&`Imu~*5ziWh{!HC_<- zsVEv2M_kxadEABfFo>2uf_9qI9>L*jDT?FD{F8-QEm5 literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm1/button_enabled_special_cases/test.toml b/tests/tests/swfs/avm1/button_properties_special_cases/test.toml similarity index 53% rename from tests/tests/swfs/avm1/button_enabled_special_cases/test.toml rename to tests/tests/swfs/avm1/button_properties_special_cases/test.toml index 882311bc9..071c36f74 100644 --- a/tests/tests/swfs/avm1/button_enabled_special_cases/test.toml +++ b/tests/tests/swfs/avm1/button_properties_special_cases/test.toml @@ -1,2 +1 @@ num_frames = 20 -ignore = true