diff --git a/core/src/avm1/globals.rs b/core/src/avm1/globals.rs index c82ca4830..865643d58 100644 --- a/core/src/avm1/globals.rs +++ b/core/src/avm1/globals.rs @@ -39,6 +39,7 @@ pub(crate) mod system_security; pub(crate) mod text_field; mod text_format; mod xml; +pub(crate) mod context_menu; #[allow(non_snake_case, unused_must_use)] //can't use errors yet pub fn getURL<'a, 'gc>( @@ -314,6 +315,8 @@ pub fn create_globals<'gc>( //TODO: These need to be constructors and should also set `.prototype` on each one let object = object::create_object_object(gc_context, object_proto, function_proto); + let context_menu_proto = context_menu::create_proto(gc_context, object_proto, function_proto); + let button = FunctionObject::function( gc_context, Executable::Native(button::constructor), @@ -456,6 +459,14 @@ pub fn create_globals<'gc>( EnumSet::empty(), ); + let context_menu = context_menu::create_context_menu_object(gc_context, Some(context_menu_proto), Some(function_proto)); + globals.define_value( + gc_context, + "ContextMenu", + context_menu.into(), + EnumSet::empty() + ); + let system_security = system_security::create(gc_context, Some(object_proto), Some(function_proto)); let system_capabilities = system_capabilities::create(gc_context, Some(object_proto)); diff --git a/core/src/avm1/globals/context_menu.rs b/core/src/avm1/globals/context_menu.rs new file mode 100644 index 000000000..5cb2b278e --- /dev/null +++ b/core/src/avm1/globals/context_menu.rs @@ -0,0 +1,94 @@ +use gc_arena::MutationContext; +use crate::avm1::{Value, ScriptObject, Avm1}; +use crate::avm1::function::{FunctionObject, Executable}; +use crate::avm1::Object; +use crate::context::UpdateContext; +use crate::avm1::return_value::ReturnValue; +use crate::avm1::error::Error; +use enumset::EnumSet; + +pub fn constructor<'gc>( + _avm: &mut Avm1<'gc>, + _context: &mut UpdateContext<'_, 'gc, '_>, + _this: Object<'gc>, + _args: &[Value<'gc>], +) -> Result, Error> { + Ok(Value::Undefined.into()) +} + +pub fn create_context_menu_object<'gc>( + gc_context: MutationContext<'gc, '_>, + context_menu_proto: Option>, + fn_proto: Option>, +) -> Object<'gc> { + FunctionObject::function( + gc_context, + Executable::Native(constructor), + fn_proto, + context_menu_proto, + ) +} + +pub fn copy<'gc>( + _avm: &mut Avm1<'gc>, + _context: &mut UpdateContext<'_, 'gc, '_>, + _this: Object<'gc>, + _args: &[Value<'gc>], +) -> Result, Error> { + log::warn!("ContextMenu.copy() not implemented"); + Ok(Value::Undefined.into()) +} + +pub fn hide_builtin_items<'gc>( + _avm: &mut Avm1<'gc>, + _context: &mut UpdateContext<'_, 'gc, '_>, + _this: Object<'gc>, + _args: &[Value<'gc>], +) -> Result, Error> { + log::warn!("ContextMenu.hideBuiltInItems() not implemented"); + Ok(Value::Undefined.into()) +} + +pub fn on_select<'gc>( + _avm: &mut Avm1<'gc>, + _context: &mut UpdateContext<'_, 'gc, '_>, + _this: Object<'gc>, + _args: &[Value<'gc>], +) -> Result, Error> { + log::warn!("ContextMenu.onSelect() not implemented"); + Ok(Value::Undefined.into()) +} + +pub fn create_proto<'gc>( + gc_context: MutationContext<'gc, '_>, + proto: Object<'gc>, + fn_proto: Object<'gc>, +) -> Object<'gc> { + let mut object = ScriptObject::object(gc_context, Some(proto)); + + object.force_set_function( + "copy", + copy, + gc_context, + EnumSet::empty(), + Some(fn_proto) + ); + + object.force_set_function( + "hideBuiltInItems", + hide_builtin_items, + gc_context, + EnumSet::empty(), + Some(fn_proto) + ); + + object.force_set_function( + "onSelect", + on_select, + gc_context, + EnumSet::empty(), + Some(fn_proto) + ); + + object.into() +}