avm2: Namespace support for XML.name()

This commit is contained in:
Tom Schuster 2023-09-23 14:34:22 +02:00 committed by Adrian Wielgosik
parent 30614bdd2f
commit 6d51bc3964
3 changed files with 10 additions and 8 deletions

View File

@ -73,9 +73,7 @@ pub fn name<'gc>(
) -> Result<Value<'gc>, Error<'gc>> { ) -> Result<Value<'gc>, Error<'gc>> {
let node = this.as_xml_object().unwrap(); let node = this.as_xml_object().unwrap();
if let Some(local_name) = node.local_name() { if let Some(local_name) = node.local_name() {
avm2_stub_method!(activation, "XML", "name", "namespaces"); let namespace = node.namespace(activation);
// FIXME - use namespace
let namespace = activation.avm2().public_namespace;
Ok(QNameObject::from_name(activation, Multiname::new(namespace, local_name))?.into()) Ok(QNameObject::from_name(activation, Multiname::new(namespace, local_name))?.into())
} else { } else {
Ok(Value::Null) Ok(Value::Null)
@ -162,10 +160,7 @@ pub fn namespace_internal_impl<'gc>(
// b. Return the result of calling the [[GetNamespace]] method of x.[[Name]] with argument inScopeNS // b. Return the result of calling the [[GetNamespace]] method of x.[[Name]] with argument inScopeNS
// FIXME: Use inScopeNS // FIXME: Use inScopeNS
let namespace = match node.namespace() { let namespace = xml.namespace(activation);
Some(ns) => Namespace::package(ns, &mut activation.context.borrow_gc()),
None => activation.avm2().public_namespace,
};
Ok(NamespaceObject::from_namespace(activation, namespace)?.into()) Ok(NamespaceObject::from_namespace(activation, namespace)?.into())
} else { } else {
// a. Let prefix = ToString(prefix) // a. Let prefix = ToString(prefix)

View File

@ -7,6 +7,7 @@ use crate::avm2::object::script_object::ScriptObjectData;
use crate::avm2::object::{ClassObject, Object, ObjectPtr, TObject, XmlListObject}; use crate::avm2::object::{ClassObject, Object, ObjectPtr, TObject, XmlListObject};
use crate::avm2::string::AvmString; use crate::avm2::string::AvmString;
use crate::avm2::value::Value; use crate::avm2::value::Value;
use crate::avm2::Namespace;
use crate::avm2::{Error, Multiname}; use crate::avm2::{Error, Multiname};
use core::fmt; use core::fmt;
use gc_arena::{Collect, GcCell, GcWeakCell, Mutation}; use gc_arena::{Collect, GcCell, GcWeakCell, Mutation};
@ -75,6 +76,13 @@ impl<'gc> XmlObject<'gc> {
self.0.read().node.local_name() self.0.read().node.local_name()
} }
pub fn namespace(&self, activation: &mut Activation<'_, 'gc>) -> Namespace<'gc> {
match self.0.read().node.namespace() {
Some(ns) => Namespace::package(ns, &mut activation.context.borrow_gc()),
None => activation.avm2().public_namespace,
}
}
pub fn matches_name(&self, multiname: &Multiname<'gc>) -> bool { pub fn matches_name(&self, multiname: &Multiname<'gc>) -> bool {
self.0.read().node.matches_name(multiname) self.0.read().node.matches_name(multiname)
} }

View File

@ -1,2 +1 @@
num_ticks = 1 num_ticks = 1
known_failure = true # https://github.com/ruffle-rs/ruffle/issues/12351