avm2: Implement `Event.preventDefault` and `Event.isDefaultPrevented`

This commit is contained in:
David Wendt 2020-12-09 18:09:24 -05:00 committed by Mike Welsh
parent 8b9a804ae9
commit d393a5f4f8
7 changed files with 87 additions and 0 deletions

View File

@ -103,6 +103,16 @@ impl<'gc> Event<'gc> {
self.cancelable = cancelable;
}
pub fn is_cancelled(&self) -> bool {
self.cancelled
}
pub fn cancel(&mut self) {
if self.cancelable {
self.cancelled = true;
}
}
pub fn phase(&self) -> EventPhase {
self.event_phase
}

View File

@ -191,6 +191,32 @@ pub fn format_to_string<'gc>(
Ok(Value::Undefined)
}
/// Implements `isDefaultPrevented`
pub fn is_default_prevented<'gc>(
_activation: &mut Activation<'_, 'gc, '_>,
this: Option<Object<'gc>>,
_args: &[Value<'gc>],
) -> Result<Value<'gc>, Error> {
if let Some(evt) = this.unwrap().as_event() {
return Ok(evt.is_cancelled().into());
}
Ok(Value::Undefined)
}
/// Implements `preventDefault`
pub fn prevent_default<'gc>(
activation: &mut Activation<'_, 'gc, '_>,
this: Option<Object<'gc>>,
_args: &[Value<'gc>],
) -> Result<Value<'gc>, Error> {
if let Some(mut evt) = this.unwrap().as_event_mut(activation.context.gc_context) {
evt.cancel();
}
Ok(Value::Undefined)
}
/// Construct `Event`'s class.
pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> {
let class = Class::new(
@ -235,6 +261,14 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>
QName::new(Namespace::public_namespace(), "formatToString"),
Method::from_builtin(format_to_string),
));
write.define_instance_trait(Trait::from_method(
QName::new(Namespace::public_namespace(), "isDefaultPrevented"),
Method::from_builtin(is_default_prevented),
));
write.define_instance_trait(Trait::from_method(
QName::new(Namespace::public_namespace(), "preventDefault"),
Method::from_builtin(prevent_default),
));
class
}

View File

@ -451,6 +451,7 @@ swf_tests! {
(as3_event_type, "avm2/event_type", 1),
(as3_event_clone, "avm2/event_clone", 1),
(as3_event_formattostring, "avm2/event_formattostring", 1),
(as3_event_isdefaultprevented, "avm2/event_isdefaultprevented", 1),
}
// TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough.

View File

@ -0,0 +1,30 @@
package {
public class Test {
}
}
import flash.events.Event;
trace("//var e = new Event(\"test_event\", false, false);");
var e = new Event("test_event", false, false);
trace("//e.isDefaultPrevented();");
trace(e.isDefaultPrevented());
trace("//e.preventDefault()");
e.preventDefault();
trace("//e.isDefaultPrevented();");
trace(e.isDefaultPrevented());
trace("//var e = new Event(\"test_event\", true, true);");
var e = new Event("test_event", true, true);
trace("//e.isDefaultPrevented();");
trace(e.isDefaultPrevented());
trace("//e.preventDefault()");
e.preventDefault();
trace("//e.isDefaultPrevented();");
trace(e.isDefaultPrevented());

View File

@ -0,0 +1,12 @@
//var e = new Event("test_event", false, false);
//e.isDefaultPrevented();
false
//e.preventDefault()
//e.isDefaultPrevented();
false
//var e = new Event("test_event", true, true);
//e.isDefaultPrevented();
false
//e.preventDefault()
//e.isDefaultPrevented();
true

Binary file not shown.

Binary file not shown.