avm2: Pass status events through to AVM2.

This commit is contained in:
David Wendt 2023-04-21 23:37:08 -04:00 committed by kmeisthax
parent 757ae40abc
commit 63b27a4a20
3 changed files with 55 additions and 4 deletions

View File

@ -141,6 +141,7 @@ pub struct SystemClasses<'gc> {
pub morphshape: ClassObject<'gc>, pub morphshape: ClassObject<'gc>,
pub shaderinput: ClassObject<'gc>, pub shaderinput: ClassObject<'gc>,
pub shaderparameter: ClassObject<'gc>, pub shaderparameter: ClassObject<'gc>,
pub netstatusevent: ClassObject<'gc>,
} }
impl<'gc> SystemClasses<'gc> { impl<'gc> SystemClasses<'gc> {
@ -256,6 +257,7 @@ impl<'gc> SystemClasses<'gc> {
morphshape: object, morphshape: object,
shaderinput: object, shaderinput: object,
shaderparameter: object, shaderparameter: object,
netstatusevent: object,
} }
} }
} }
@ -711,6 +713,7 @@ fn load_playerglobal<'gc>(
("flash.events", "MouseEvent", mouseevent), ("flash.events", "MouseEvent", mouseevent),
("flash.events", "FullScreenEvent", fullscreenevent), ("flash.events", "FullScreenEvent", fullscreenevent),
("flash.events", "UncaughtErrorEvents", uncaughterrorevents), ("flash.events", "UncaughtErrorEvents", uncaughterrorevents),
("flash.events", "NetStatusEvent", netstatusevent),
("flash.geom", "Matrix", matrix), ("flash.geom", "Matrix", matrix),
("flash.geom", "Point", point), ("flash.geom", "Point", point),
("flash.geom", "Rectangle", rectangle), ("flash.geom", "Rectangle", rectangle),

View File

@ -2,6 +2,7 @@
use crate::avm2::activation::Activation; use crate::avm2::activation::Activation;
use crate::avm2::events::Event; use crate::avm2::events::Event;
use crate::avm2::multiname::Multiname;
use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::script_object::ScriptObjectData;
use crate::avm2::object::{ClassObject, Object, ObjectPtr, TObject}; use crate::avm2::object::{ClassObject, Object, ObjectPtr, TObject};
use crate::avm2::value::Value; use crate::avm2::value::Value;
@ -144,6 +145,48 @@ impl<'gc> EventObject<'gc> {
) )
.unwrap() // we don't expect to break here .unwrap() // we don't expect to break here
} }
pub fn net_status_event<S>(
activation: &mut Activation<'_, 'gc>,
event_type: S,
info: &[(&'static str, &'static str)],
) -> Object<'gc>
where
S: Into<AvmString<'gc>>,
{
let mut info_object = activation
.avm2()
.classes()
.object
.construct(activation, &[])
.unwrap();
for (key, value) in info {
info_object
.set_property(
&Multiname::new(activation.avm2().public_namespace, AvmString::from(*key)),
Value::String(AvmString::from(*value)),
activation,
)
.unwrap();
}
let event_type: AvmString<'gc> = event_type.into();
let net_status_cls = activation.avm2().classes().netstatusevent;
net_status_cls
.construct(
activation,
&[
event_type.into(),
//bubbles
false.into(),
//cancelable
false.into(),
info_object.into(),
],
)
.unwrap() // we don't expect to break here
}
} }
impl<'gc> TObject<'gc> for EventObject<'gc> { impl<'gc> TObject<'gc> for EventObject<'gc> {

View File

@ -1,5 +1,6 @@
//! NetStream implementation //! NetStream implementation
use crate::avm2::{Activation as Avm2Activation, Avm2, EventObject as Avm2EventObject};
use crate::backend::navigator::Request; use crate::backend::navigator::Request;
use crate::context::UpdateContext; use crate::context::UpdateContext;
use crate::loader::Error; use crate::loader::Error;
@ -552,16 +553,20 @@ impl<'gc> NetStream<'gc> {
/// Trigger a status event on the stream. /// Trigger a status event on the stream.
pub fn trigger_status_event( pub fn trigger_status_event(
self, self,
_context: &mut UpdateContext<'_, 'gc>, context: &mut UpdateContext<'_, 'gc>,
_values: &[(&str, &str)], values: &[(&'static str, &'static str)],
) { ) {
let object = self.0.read().avm_object; let object = self.0.read().avm_object;
match object { match object {
Some(AvmObject::Avm1(_object)) => { Some(AvmObject::Avm1(_object)) => {
tracing::warn!("Status event (AVM1) is a stub!"); tracing::warn!("Status event (AVM1) is a stub!");
} }
Some(AvmObject::Avm2(_object)) => { Some(AvmObject::Avm2(object)) => {
tracing::warn!("Status event (AVM2) is a stub!"); let domain = context.avm2.stage_domain();
let mut activation = Avm2Activation::from_domain(context.reborrow(), domain);
let net_status_event =
Avm2EventObject::net_status_event(&mut activation, "netStatus", values);
Avm2::dispatch_event(&mut activation.context, net_status_event, object);
} }
None => {} None => {}
} }