From 06ba2f898adea4636465c7d775ec5e0e85c5a073 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 2 Dec 2020 22:17:49 -0500 Subject: [PATCH] avm2: Implement `visible`. --- .../globals/flash/display/displayobject.rs | 40 ++++++++++++++++++ core/tests/regression_tests.rs | 1 + .../avm2/displayobject_visible/output.txt | 23 ++++++++++ .../swfs/avm2/displayobject_visible/test.fla | Bin 0 -> 5731 bytes .../swfs/avm2/displayobject_visible/test.swf | Bin 0 -> 1415 bytes 5 files changed, 64 insertions(+) create mode 100644 core/tests/swfs/avm2/displayobject_visible/output.txt create mode 100644 core/tests/swfs/avm2/displayobject_visible/test.fla create mode 100644 core/tests/swfs/avm2/displayobject_visible/test.swf diff --git a/core/src/avm2/globals/flash/display/displayobject.rs b/core/src/avm2/globals/flash/display/displayobject.rs index 418afa9d1..10849d21f 100644 --- a/core/src/avm2/globals/flash/display/displayobject.rs +++ b/core/src/avm2/globals/flash/display/displayobject.rs @@ -371,6 +371,38 @@ pub fn root<'gc>( Ok(Value::Undefined) } +/// Implements `visible`'s getter. +pub fn visible<'gc>( + _activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + _args: &[Value<'gc>], +) -> Result, Error> { + if let Some(dobj) = this.and_then(|this| this.as_display_object()) { + return Ok(dobj.visible().into()); + } + + Ok(Value::Undefined) +} + +/// Implements `visible`'s setter. +pub fn set_visible<'gc>( + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + args: &[Value<'gc>], +) -> Result, Error> { + if let Some(dobj) = this.and_then(|this| this.as_display_object()) { + let new_visible = args + .get(0) + .cloned() + .unwrap_or(Value::Undefined) + .coerce_to_boolean(); + + dobj.set_visible(activation.context.gc_context, new_visible); + } + + Ok(Value::Undefined) +} + /// Construct `DisplayObject`'s class. pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { let class = Class::new( @@ -463,6 +495,14 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> QName::new(Namespace::package(""), "root"), Method::from_builtin(root), )); + write.define_instance_trait(Trait::from_getter( + QName::new(Namespace::package(""), "visible"), + Method::from_builtin(visible), + )); + write.define_instance_trait(Trait::from_setter( + QName::new(Namespace::package(""), "visible"), + Method::from_builtin(set_visible), + )); class } diff --git a/core/tests/regression_tests.rs b/core/tests/regression_tests.rs index d5ebd90dc..3d1fa0c19 100644 --- a/core/tests/regression_tests.rs +++ b/core/tests/regression_tests.rs @@ -440,6 +440,7 @@ swf_tests! { (as3_displayobject_name, "avm2/displayobject_name", 4), (as3_displayobject_parent, "avm2/displayobject_parent", 4), (as3_displayobject_root, "avm2/displayobject_root", 4), + (as3_displayobject_visible, "avm2/displayobject_visible", 4), } // TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough. diff --git a/core/tests/swfs/avm2/displayobject_visible/output.txt b/core/tests/swfs/avm2/displayobject_visible/output.txt new file mode 100644 index 000000000..0755af85c --- /dev/null +++ b/core/tests/swfs/avm2/displayobject_visible/output.txt @@ -0,0 +1,23 @@ +//this.visible (Timeline) +true +//this.visible (Symbol 1) +true +//this.visible = false; +//this.visible; +false +//this.visible (Symbol 1) +true +//this.visible = false; +//this.visible; +false +//this.visible (Symbol 2) +true +//this.visible = false; +//this.visible; +false +//var s1 = new MovieClip(); +//s1.visible; +true +//this.addChild(s1); +//s1.visible; +true diff --git a/core/tests/swfs/avm2/displayobject_visible/test.fla b/core/tests/swfs/avm2/displayobject_visible/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..8baebdad344ab41ccf7735c0f1f803cf7aff3fda GIT binary patch literal 5731 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 P^oJY>0JvQg6M+8%n^|2e literal 0 HcmV?d00001 diff --git a/core/tests/swfs/avm2/displayobject_visible/test.swf b/core/tests/swfs/avm2/displayobject_visible/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..939a1ca19d07258c5ccb8177eba2ff164bb4d27c GIT binary patch literal 1415 zcmV;21$g>HS5qqy3jhFkoSjz9Q`<%qU#%ps_Khbf%}~mUgC@&UA84Z}}J8e<1C-In+!Koymo+tPgA; zp;M37dhhq%zV~}iZ)I%*eieZ5QvjkYSm+V}09m-Vw>R9m*`G)!Htr^7ZE%_Ml)8=$@nST2w%iKhX0*|Q;90R41=q;kVfW+spEYDGsqba|(;rm5-G^xKmj;o?CD15K|^9~Y?2#e)PF z3byhLQNSoCi;7WGswxy7)s?>UqtO^-6Ezxl4K_l(6S=g5u(PQ3yxERr6bI?d3 z-qhs+=})E1vSK8+6hm24NqpSRJu&2NNw!kTI88v#hIe|+45U(9vK}|m@r&^)xfl29 z9iNyBrBX)P%{vDZ(n#4fYnfC^E^2EeSTD~~97H$#wzf{Rij!kq z)z)NH`C2v=ts1bg3MneGXvnyyqS>vd1nXbPe`zJ^?>wP>Vj?9()M z43ktGCMMdIvt>ms zjvMKTIll9Zd7J5lgnyF zlG8U!C6(j~noe>S86#)hD;YU?t1_K)I-oTptUB|aJ9O^sa~V%h#Jp;}bL<|vz5|;s z#!IqlkhyR>J~wn!2v2-l>ghwN=~Kc@eK2IxaXf-Y z@kyM(r|=j)jmPl>K7%Lm6h4cSIE5vg#?yEPpTp<(UXZ&W2eV4V*CgO5!ZpZFycB9--Y;Y#6%F& zi?}|-#l#qcxDOFGkGM;S`v`@z2reLa1;MKbUJKcOV301BE)LkbwRpOGEjpr0uw|Bk z0t;B4wRUpWkL3(}3}6rgpa2CQKnzuVA`}n^SfbyGC<2ya7>)q~BTym8h#Uh$fMG;G zTbHiU;E?eLVs&Z7KNa2WZ!k-KrU6&{^-{o+Sn2^Sk6c~a9cZxBYtX{E`U<=OL78v( zC^Te2$lAo0f|e{&@S-L7>l9lGF^!<>7HV+|*Oxj#qm$-fd75LOF4Y&oN_h8jgGqpT z$(Mlj5?Ts#4M<%$NJ&rDB?9uDQoc*dcT4$*l<$%9y;2_1@0Vc6{*;;B>y0Sg!ta;q zvx>OTEOT-9#=$Z<3V&<~eEqZ>uu7S_X{mzeA<`I#r7^He@|Ht#DGZzZgk$+JEWiElvZfz63?Ik7IM9xF9Z4YAMv`4;SxnvYBY`|KTlEK&II V