diff --git a/core/src/avm2/events.rs b/core/src/avm2/events.rs index a49c48b67..7a6eaa574 100644 --- a/core/src/avm2/events.rs +++ b/core/src/avm2/events.rs @@ -1,6 +1,7 @@ //! Core event structure use crate::avm2::activation::Activation; +use crate::avm2::error::type_error; use crate::avm2::object::{Object, TObject}; use crate::avm2::value::Value; use crate::avm2::Error; @@ -457,7 +458,19 @@ pub fn dispatch_event<'gc>( let event = if dispatched { event .call_public_property("clone", &[], activation)? - .coerce_to_object(activation)? + .coerce_to_object(activation) + .map_err(|_| { + let error = type_error( + activation, + &format!("Error #2007: Parameter event must be non-null."), + 2007, + ); + + match error { + Err(e) => e, + Ok(e) => Error::AvmError(e), + } + })? } else { event }; diff --git a/tests/tests/swfs/avm2/event_clone_error_redispatch/CustomEvent.as b/tests/tests/swfs/avm2/event_clone_error_redispatch/CustomEvent.as new file mode 100644 index 000000000..f4d753bd3 --- /dev/null +++ b/tests/tests/swfs/avm2/event_clone_error_redispatch/CustomEvent.as @@ -0,0 +1,15 @@ +package { + import flash.events.Event; + + public class CustomEvent extends Event { + public function CustomEvent(type:String, bubbles:Boolean, cancelable:Boolean) { + super(type, bubbles, cancelable); + } + + override public function clone():Event { + trace("CustomEvent cloned!"); + return null; + } + } + +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/event_clone_error_redispatch/Test.as b/tests/tests/swfs/avm2/event_clone_error_redispatch/Test.as new file mode 100644 index 000000000..2b751bd23 --- /dev/null +++ b/tests/tests/swfs/avm2/event_clone_error_redispatch/Test.as @@ -0,0 +1,36 @@ +package +{ + import flash.display.Sprite; + + public class Test extends Sprite + { + } +} + +import flash.events.EventDispatcher; +import flash.events.Event; + +var event:CustomEvent = new CustomEvent("custom", false, false); + +var dispatcher1:EventDispatcher = new EventDispatcher(); +var dispatcher2:EventDispatcher = new EventDispatcher(); + +dispatcher1.addEventListener("custom", function(event:CustomEvent):void +{ + trace("first handler called"); + try + { + dispatcher2.dispatchEvent(event); + } + catch (e:TypeError) + { + trace(e); + } +}); + +dispatcher2.addEventListener("custom", function(event:CustomEvent):void +{ + trace("second handler called"); +}); + +dispatcher1.dispatchEvent(event); \ No newline at end of file diff --git a/tests/tests/swfs/avm2/event_clone_error_redispatch/output.txt b/tests/tests/swfs/avm2/event_clone_error_redispatch/output.txt new file mode 100644 index 000000000..63c1770bc --- /dev/null +++ b/tests/tests/swfs/avm2/event_clone_error_redispatch/output.txt @@ -0,0 +1,3 @@ +first handler called +CustomEvent cloned! +TypeError: Error #2007: Parameter event must be non-null. diff --git a/tests/tests/swfs/avm2/event_clone_error_redispatch/test.swf b/tests/tests/swfs/avm2/event_clone_error_redispatch/test.swf new file mode 100644 index 000000000..ff93b3288 Binary files /dev/null and b/tests/tests/swfs/avm2/event_clone_error_redispatch/test.swf differ diff --git a/tests/tests/swfs/avm2/event_clone_error_redispatch/test.toml b/tests/tests/swfs/avm2/event_clone_error_redispatch/test.toml new file mode 100644 index 000000000..cf6123969 --- /dev/null +++ b/tests/tests/swfs/avm2/event_clone_error_redispatch/test.toml @@ -0,0 +1 @@ +num_ticks = 1