core: Add ability to call out to ExternalInterfaceProviders
This commit is contained in:
parent
502ea98ed4
commit
e1b3ac79d6
|
@ -41,6 +41,21 @@ pub fn add_callback<'gc>(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn call<'gc>(
|
||||
activation: &mut Activation<'_, 'gc, '_>,
|
||||
_this: Object<'gc>,
|
||||
args: &[Value<'gc>],
|
||||
) -> Result<Value<'gc>, Error<'gc>> {
|
||||
if args.is_empty() {
|
||||
return Ok(Value::Null);
|
||||
}
|
||||
|
||||
let name = args.get(0).unwrap().coerce_to_string(activation)?;
|
||||
activation.context.external_interface.call_external(&name);
|
||||
|
||||
Ok(Value::Null)
|
||||
}
|
||||
|
||||
pub fn create_external_interface_object<'gc>(
|
||||
gc_context: MutationContext<'gc, '_>,
|
||||
proto: Object<'gc>,
|
||||
|
@ -69,6 +84,14 @@ pub fn create_external_interface_object<'gc>(
|
|||
Some(fn_proto),
|
||||
);
|
||||
|
||||
object.force_set_function(
|
||||
"call",
|
||||
call,
|
||||
gc_context,
|
||||
Attribute::DontDelete | Attribute::DontEnum,
|
||||
Some(fn_proto),
|
||||
);
|
||||
|
||||
object.into()
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,9 @@ impl<'gc> Callback<'gc> {
|
|||
}
|
||||
}
|
||||
|
||||
pub trait ExternalInterfaceProvider {}
|
||||
pub trait ExternalInterfaceProvider {
|
||||
fn call(&self, name: &str) -> Option<()>;
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct ExternalInterface<'gc> {
|
||||
|
@ -68,6 +70,14 @@ impl<'gc> ExternalInterface<'gc> {
|
|||
self.callbacks.get(name).cloned()
|
||||
}
|
||||
|
||||
pub fn call_external(&self, name: &str) {
|
||||
for provider in &self.providers {
|
||||
if provider.call(name).is_some() {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn available(&self) -> bool {
|
||||
!self.providers.is_empty()
|
||||
}
|
||||
|
|
|
@ -546,4 +546,14 @@ impl ExternalInterfaceTestProvider {
|
|||
}
|
||||
}
|
||||
|
||||
impl ExternalInterfaceProvider for ExternalInterfaceTestProvider {}
|
||||
impl ExternalInterfaceProvider for ExternalInterfaceTestProvider {
|
||||
fn call(&self, name: &str) -> Option<()> {
|
||||
match name {
|
||||
"ping" => {
|
||||
log::info!(target: "avm_trace", "[ExternalInterface] ping");
|
||||
Some(())
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,16 @@ true
|
|||
// ExternalInterface.addCallback("dump", object, dump)
|
||||
true
|
||||
|
||||
// ExternalInterface.call()
|
||||
null
|
||||
|
||||
// ExternalInterface.call("ping")
|
||||
[ExternalInterface] ping
|
||||
null
|
||||
|
||||
// ExternalInterface.call("non_existent")
|
||||
null
|
||||
|
||||
/// dump() start
|
||||
// this
|
||||
[object Object]
|
||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue