Expose `appendChild` to ActionScript

This commit is contained in:
David Wendt 2019-12-23 00:23:10 -05:00
parent 08c0f273a6
commit 37f6efb753
1 changed files with 28 additions and 1 deletions

View File

@ -7,6 +7,7 @@ use crate::avm1::script_object::ScriptObject;
use crate::avm1::xml_object::XMLObject; use crate::avm1::xml_object::XMLObject;
use crate::avm1::{Avm1, Error, Object, TObject, UpdateContext, Value}; use crate::avm1::{Avm1, Error, Object, TObject, UpdateContext, Value};
use crate::xml::{XMLDocument, XMLNode}; use crate::xml::{XMLDocument, XMLNode};
use enumset::EnumSet;
use gc_arena::MutationContext; use gc_arena::MutationContext;
/// XMLNode constructor /// XMLNode constructor
@ -38,11 +39,27 @@ pub fn xmlnode_constructor<'gc>(
Ok(Value::Undefined.into()) Ok(Value::Undefined.into())
} }
pub fn xmlnode_append_child<'gc>(
_avm: &mut Avm1<'gc>,
ac: &mut UpdateContext<'_, 'gc, '_>,
this: Object<'gc>,
args: &[Value<'gc>],
) -> Result<ReturnValue<'gc>, Error> {
if let (Some(mut xmlnode), Some(Ok(Some(child_xmlnode)))) = (
this.as_xml_node(),
args.get(0).map(|n| n.as_object().map(|n| n.as_xml_node())),
) {
xmlnode.append_child(ac.gc_context, child_xmlnode)?;
}
Ok(Value::Undefined.into())
}
/// Construct the prototype for `XMLNode`. /// Construct the prototype for `XMLNode`.
pub fn create_xmlnode_proto<'gc>( pub fn create_xmlnode_proto<'gc>(
gc_context: MutationContext<'gc, '_>, gc_context: MutationContext<'gc, '_>,
proto: Object<'gc>, proto: Object<'gc>,
_fn_proto: Object<'gc>, fn_proto: Object<'gc>,
) -> Object<'gc> { ) -> Object<'gc> {
let xmlnode_proto = XMLObject::empty_node(gc_context, Some(proto)); let xmlnode_proto = XMLObject::empty_node(gc_context, Some(proto));
@ -141,6 +158,16 @@ pub fn create_xmlnode_proto<'gc>(
None, None,
ReadOnly.into(), ReadOnly.into(),
); );
xmlnode_proto
.as_script_object()
.unwrap()
.force_set_function(
"appendChild",
xmlnode_append_child,
gc_context,
EnumSet::empty(),
Some(fn_proto),
);
xmlnode_proto xmlnode_proto
} }