avm2: Return correct error if Event.clone() returns null
This commit is contained in:
parent
925ed2e82b
commit
e8bc47a569
|
@ -1,6 +1,7 @@
|
||||||
//! Core event structure
|
//! Core event structure
|
||||||
|
|
||||||
use crate::avm2::activation::Activation;
|
use crate::avm2::activation::Activation;
|
||||||
|
use crate::avm2::error::type_error;
|
||||||
use crate::avm2::object::{Object, TObject};
|
use crate::avm2::object::{Object, TObject};
|
||||||
use crate::avm2::value::Value;
|
use crate::avm2::value::Value;
|
||||||
use crate::avm2::Error;
|
use crate::avm2::Error;
|
||||||
|
@ -457,7 +458,19 @@ pub fn dispatch_event<'gc>(
|
||||||
let event = if dispatched {
|
let event = if dispatched {
|
||||||
event
|
event
|
||||||
.call_public_property("clone", &[], activation)?
|
.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 {
|
} else {
|
||||||
event
|
event
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
|
@ -0,0 +1,3 @@
|
||||||
|
first handler called
|
||||||
|
CustomEvent cloned!
|
||||||
|
TypeError: Error #2007: Parameter event must be non-null.
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
num_ticks = 1
|
Loading…
Reference in New Issue