From e71c749db56c9c4e8f072bda65b767f0ec257b26 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sat, 2 Oct 2021 17:28:51 -0400 Subject: [PATCH] avm2: Implement accessors for new `InteractiveObject` flags. --- .../flash/display/interactiveobject.rs | 93 +++++++++++++++++- tests/tests/regression_tests.rs | 1 + .../avm2/interactiveobject_enabled/output.txt | 25 +++++ .../avm2/interactiveobject_enabled/test.fla | Bin 0 -> 4010 bytes .../avm2/interactiveobject_enabled/test.swf | Bin 0 -> 688 bytes 5 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 tests/tests/swfs/avm2/interactiveobject_enabled/output.txt create mode 100644 tests/tests/swfs/avm2/interactiveobject_enabled/test.fla create mode 100644 tests/tests/swfs/avm2/interactiveobject_enabled/test.swf diff --git a/core/src/avm2/globals/flash/display/interactiveobject.rs b/core/src/avm2/globals/flash/display/interactiveobject.rs index 1dd644d13..2e71d69c3 100644 --- a/core/src/avm2/globals/flash/display/interactiveobject.rs +++ b/core/src/avm2/globals/flash/display/interactiveobject.rs @@ -2,11 +2,12 @@ use crate::avm2::activation::Activation; use crate::avm2::class::Class; -use crate::avm2::method::Method; +use crate::avm2::method::{Method, NativeMethodImpl}; use crate::avm2::names::{Namespace, QName}; -use crate::avm2::object::Object; +use crate::avm2::object::{Object, TObject}; use crate::avm2::value::Value; use crate::avm2::Error; +use crate::display_object::{TDisplayObject, TInteractiveObject}; use gc_arena::{GcCell, MutationContext}; /// Implements `flash.display.InteractiveObject`'s instance constructor. @@ -40,6 +41,80 @@ pub fn class_init<'gc>( Ok(Value::Undefined) } +/// Implements `InteractiveObject.mouseEnabled`'s getter. +pub fn mouse_enabled<'gc>( + _activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + _args: &[Value<'gc>], +) -> Result, Error> { + if let Some(int) = this + .and_then(|t| t.as_display_object()) + .and_then(|dobj| dobj.as_interactive()) + { + return Ok(int.mouse_enabled().into()); + } + + Ok(Value::Undefined) +} + +/// Implements `InteractiveObject.mouseEnabled`'s setter. +pub fn set_mouse_enabled<'gc>( + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + args: &[Value<'gc>], +) -> Result, Error> { + if let Some(int) = this + .and_then(|t| t.as_display_object()) + .and_then(|dobj| dobj.as_interactive()) + { + let value = args + .get(0) + .cloned() + .unwrap_or(Value::Undefined) + .coerce_to_boolean(); + int.set_mouse_enabled(activation.context.gc_context, value); + } + + Ok(Value::Undefined) +} + +/// Implements `InteractiveObject.doubleClickEnabled`'s getter. +pub fn double_click_enabled<'gc>( + _activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + _args: &[Value<'gc>], +) -> Result, Error> { + if let Some(int) = this + .and_then(|t| t.as_display_object()) + .and_then(|dobj| dobj.as_interactive()) + { + return Ok(int.double_click_enabled().into()); + } + + Ok(Value::Undefined) +} + +/// Implements `InteractiveObject.doubleClickEnabled`'s setter. +pub fn set_double_click_enabled<'gc>( + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + args: &[Value<'gc>], +) -> Result, Error> { + if let Some(int) = this + .and_then(|t| t.as_display_object()) + .and_then(|dobj| dobj.as_interactive()) + { + let value = args + .get(0) + .cloned() + .unwrap_or(Value::Undefined) + .coerce_to_boolean(); + int.set_double_click_enabled(activation.context.gc_context, value); + } + + Ok(Value::Undefined) +} + /// Construct `InteractiveObject`'s class. pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { let class = Class::new( @@ -62,5 +137,19 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> mc, )); + const PUBLIC_INSTANCE_PROPERTIES: &[( + &str, + Option, + Option, + )] = &[ + ("mouseEnabled", Some(mouse_enabled), Some(set_mouse_enabled)), + ( + "doubleClickEnabled", + Some(double_click_enabled), + Some(set_double_click_enabled), + ), + ]; + write.define_public_builtin_instance_properties(mc, PUBLIC_INSTANCE_PROPERTIES); + class } diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 0826bf046..1363eabad 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -711,6 +711,7 @@ swf_tests! { (as3_hasownproperty_namespaces, "avm2/hasownproperty_namespaces", 1), (as3_propertyisenumerable_namespaces, "avm2/propertyisenumerable_namespaces", 1), (as3_interface_namespaces, "avm2/interface_namespaces", 1), + (as3_interactiveobject_enabled, "avm2/interactiveobject_enabled", 1), } // TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough. diff --git a/tests/tests/swfs/avm2/interactiveobject_enabled/output.txt b/tests/tests/swfs/avm2/interactiveobject_enabled/output.txt new file mode 100644 index 000000000..1abe3e341 --- /dev/null +++ b/tests/tests/swfs/avm2/interactiveobject_enabled/output.txt @@ -0,0 +1,25 @@ +///(Initial state of event enabled flags...) +///this.mouseEnabled +true +///this.doubleClickEnabled +false +///this.doubleClickEnabled = true +///this.mouseEnabled +true +///this.doubleClickEnabled +true +///this.mouseEnabled = false +///this.mouseEnabled +false +///this.doubleClickEnabled +true +///this.doubleClickEnabled = false +///this.mouseEnabled +false +///this.doubleClickEnabled +false +///this.mouseEnabled = true +///this.mouseEnabled +true +///this.doubleClickEnabled +false diff --git a/tests/tests/swfs/avm2/interactiveobject_enabled/test.fla b/tests/tests/swfs/avm2/interactiveobject_enabled/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..f2fd6a7b9bb9faa5745b8e1675816e2dbd065394 GIT binary patch literal 4010 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 A*8l(j literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/interactiveobject_enabled/test.swf b/tests/tests/swfs/avm2/interactiveobject_enabled/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..cc37cd68da3cb93f557964e11767121e02b8672a GIT binary patch literal 688 zcmV;h0#E%zS5qtK1ONbdoQ0C>PTMdP$8G20UTL{BlzU)huz}iiNc(^^v8iQKKOjC7 zZTnC}LhGzyX;LL_x4puiVsFALn$y#};YW*0A(w4mny@qMp$uhqYR5zvWoeGHlhS1|_O%s$@(YsuIVzwn}FsMH&g z^~Y9ZKGU#$vhz=T60-IL&vVZiz219%u6Eb6hVlrVk)k~CH(ZCZ1&AlNhn_{rN$a@NaC@ZVjZD)f9lj}l z`uD$?e#aOOUUjTLN!>}Bt7#`YSP>PuoLUwYsFcARh7v{?i)k!nur!CIB9=;6TE_AU zMynXDVYH6X#`Inz_6d_q4zBIXqkE8an%5um3uJ+0{(P0wn2PSf+6j@bJdY(!5V-ff0u WhMX*}M%@69-c9h9d42=KQ)_`Nn@djs literal 0 HcmV?d00001