From 9bd0b624fd6438fbf10056f8eba26ec3d634829c Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Sat, 4 Sep 2021 23:18:22 +0200 Subject: [PATCH] avm2: Add more Event class stubs and constants --- core/src/avm2/globals.rs | 12 ++++ core/src/avm2/globals/flash/events.rs | 2 + .../globals/flash/events/keyboardevent.rs | 50 +++++++++++++++++ .../avm2/globals/flash/events/mouseevent.rs | 22 +++++++- .../globals/flash/events/progressevent.rs | 56 +++++++++++++++++++ 5 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 core/src/avm2/globals/flash/events/keyboardevent.rs create mode 100644 core/src/avm2/globals/flash/events/progressevent.rs diff --git a/core/src/avm2/globals.rs b/core/src/avm2/globals.rs index ec1097cfb..8cd60cfd1 100644 --- a/core/src/avm2/globals.rs +++ b/core/src/avm2/globals.rs @@ -574,6 +574,18 @@ pub fn load_player_globals<'gc>( domain, script, )?; + class( + activation, + flash::events::keyboardevent::create_class(mc), + domain, + script, + )?; + class( + activation, + flash::events::progressevent::create_class(mc), + domain, + script, + )?; // package `flash.utils` avm2_system_class!( bytearray, diff --git a/core/src/avm2/globals/flash/events.rs b/core/src/avm2/globals/flash/events.rs index 4c56771ae..516ab8b75 100644 --- a/core/src/avm2/globals/flash/events.rs +++ b/core/src/avm2/globals/flash/events.rs @@ -3,4 +3,6 @@ pub mod event; pub mod eventdispatcher; pub mod ieventdispatcher; +pub mod keyboardevent; pub mod mouseevent; +pub mod progressevent; diff --git a/core/src/avm2/globals/flash/events/keyboardevent.rs b/core/src/avm2/globals/flash/events/keyboardevent.rs new file mode 100644 index 000000000..f606c3935 --- /dev/null +++ b/core/src/avm2/globals/flash/events/keyboardevent.rs @@ -0,0 +1,50 @@ +use crate::avm2::activation::Activation; +use crate::avm2::class::{Class, ClassAttributes}; +use crate::avm2::method::Method; +use crate::avm2::names::{Namespace, QName}; +use crate::avm2::object::Object; +use crate::avm2::value::Value; +use crate::avm2::Error; +use gc_arena::{GcCell, MutationContext}; + +/// Implements `flash.events.KeyboardEvent`'s instance constructor. +pub fn instance_init<'gc>( + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + args: &[Value<'gc>], +) -> Result, Error> { + if let Some(this) = this { + activation.super_init(this, args)?; // Event uses the first three parameters + } + Ok(Value::Undefined) +} + +/// Implements `flash.events.KeyboardEvent`'s class constructor. +pub fn class_init<'gc>( + _activation: &mut Activation<'_, 'gc, '_>, + _this: Option>, + _args: &[Value<'gc>], +) -> Result, Error> { + Ok(Value::Undefined) +} + +/// Construct `KeyboardEvent`'s class. +pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { + let class = Class::new( + QName::new(Namespace::package("flash.events"), "KeyboardEvent"), + Some(QName::new(Namespace::package("flash.events"), "Event").into()), + Method::from_builtin(instance_init, "", mc), + Method::from_builtin(class_init, "", mc), + mc, + ); + + let mut write = class.write(mc); + + write.set_attributes(ClassAttributes::SEALED); + + const CONSTANTS: &[(&str, &str)] = &[("KEY_DOWN", "keyDown"), ("KEY_UP", "keyUp")]; + + write.define_public_constant_string_class_traits(CONSTANTS); + + class +} diff --git a/core/src/avm2/globals/flash/events/mouseevent.rs b/core/src/avm2/globals/flash/events/mouseevent.rs index b27eb9a27..3868a0e4f 100644 --- a/core/src/avm2/globals/flash/events/mouseevent.rs +++ b/core/src/avm2/globals/flash/events/mouseevent.rs @@ -42,7 +42,27 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> write.set_attributes(ClassAttributes::SEALED); - const CONSTANTS: &[(&str, &str)] = &[("CLICK", "click")]; + const CONSTANTS: &[(&str, &str)] = &[ + ("CLICK", "click"), + ("CONTEXT_MENU", "contextMenu"), + ("DOUBLE_CLICK", "doubleClick"), + ("MIDDLE_CLICK", "middleClick"), + ("MIDDLE_MOUSE_DOWN", "middleMouseDown"), + ("MIDDLE_MOUSE_UP", "middleMouseUp"), + ("MOUSE_DOWN", "mouseDown"), + ("MOUSE_MOVE", "mouseMove"), + ("MOUSE_OUT", "mouseOut"), + ("MOUSE_OVER", "mouseOver"), + ("MOUSE_UP", "mouseUp"), + ("MOUSE_WHEEL", "mouseWheel"), + ("RELEASE_OUTSIDE", "releaseOutside"), + ("RIGHT_CLICK", "rightClick"), + ("RIGHT_MOUSE_DOWN", "rightMouseDown"), + ("RIGHT_MOUSE_UP", "rightMouseUp"), + ("ROLL_OUT", "rollOut"), + ("ROLL_OVER", "rollOver"), + ]; + write.define_public_constant_string_class_traits(CONSTANTS); class diff --git a/core/src/avm2/globals/flash/events/progressevent.rs b/core/src/avm2/globals/flash/events/progressevent.rs new file mode 100644 index 000000000..1d5a67ed2 --- /dev/null +++ b/core/src/avm2/globals/flash/events/progressevent.rs @@ -0,0 +1,56 @@ +use crate::avm2::activation::Activation; +use crate::avm2::class::{Class, ClassAttributes}; +use crate::avm2::method::Method; +use crate::avm2::names::{Namespace, QName}; +use crate::avm2::object::Object; +use crate::avm2::value::Value; +use crate::avm2::Error; +use gc_arena::{GcCell, MutationContext}; + +/// Implements `flash.events.ProgressEvent`'s instance constructor. +pub fn instance_init<'gc>( + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + args: &[Value<'gc>], +) -> Result, Error> { + if let Some(this) = this { + activation.super_init(this, args)?; // Event uses the first three parameters + } + Ok(Value::Undefined) +} + +/// Implements `flash.events.ProgressEvent`'s class constructor. +pub fn class_init<'gc>( + _activation: &mut Activation<'_, 'gc, '_>, + _this: Option>, + _args: &[Value<'gc>], +) -> Result, Error> { + Ok(Value::Undefined) +} + +/// Construct `ProgressEvent`'s class. +pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { + let class = Class::new( + QName::new(Namespace::package("flash.events"), "ProgressEvent"), + Some(QName::new(Namespace::package("flash.events"), "Event").into()), + Method::from_builtin(instance_init, "", mc), + Method::from_builtin(class_init, "", mc), + mc, + ); + + let mut write = class.write(mc); + + write.set_attributes(ClassAttributes::SEALED); + + const CONSTANTS: &[(&str, &str)] = &[ + ("PROGRESS", "progress"), + ("SOCKET_DATA", "socketData"), + ("STANDARD_ERROR_DATA", "standardErrorData"), + ("STANDARD_INPUT_PROGRESS", "standardInputProgress"), + ("STANDARD_OUTPUT_DATA", "standardOutputData"), + ]; + + write.define_public_constant_string_class_traits(CONSTANTS); + + class +}