avm2: `Object.hasOwnProperty`, `propertyIsEnumerable`, and `setPropertyIsEnumerable` only work with public-NS properties.
This commit is contained in:
parent
9aed0e7db4
commit
039777c41e
|
@ -159,14 +159,8 @@ pub fn has_own_property<'gc>(
|
|||
let name: Result<&Value<'gc>, Error> = args.get(0).ok_or_else(|| "No name specified".into());
|
||||
let name = name?.coerce_to_string(activation)?;
|
||||
|
||||
if let Some(ns) = this.resolve_any(name)? {
|
||||
if !ns.is_private() {
|
||||
let qname = QName::new(ns, name);
|
||||
return Ok(this.has_own_property(&qname)?.into());
|
||||
}
|
||||
}
|
||||
|
||||
Ok(false.into())
|
||||
let qname = QName::dynamic_name(name);
|
||||
Ok(this.has_own_property(&qname)?.into())
|
||||
}
|
||||
|
||||
/// `Object.prototype.isPrototypeOf`
|
||||
|
@ -202,14 +196,8 @@ pub fn property_is_enumerable<'gc>(
|
|||
let name: Result<&Value<'gc>, Error> = args.get(0).ok_or_else(|| "No name specified".into());
|
||||
let name = name?.coerce_to_string(activation)?;
|
||||
|
||||
if let Some(ns) = this.resolve_any(name)? {
|
||||
if !ns.is_private() {
|
||||
let qname = QName::new(ns, name);
|
||||
return Ok(this.property_is_enumerable(&qname).into());
|
||||
}
|
||||
}
|
||||
|
||||
Ok(false.into())
|
||||
let qname = QName::dynamic_name(name);
|
||||
Ok(this.property_is_enumerable(&qname).into())
|
||||
}
|
||||
|
||||
/// `Object.prototype.setPropertyIsEnumerable`
|
||||
|
@ -224,16 +212,8 @@ pub fn set_property_is_enumerable<'gc>(
|
|||
let name = name?.coerce_to_string(activation)?;
|
||||
|
||||
if let Some(Value::Bool(is_enum)) = args.get(1) {
|
||||
if let Some(ns) = this.resolve_any(name)? {
|
||||
if !ns.is_private() {
|
||||
let qname = QName::new(ns, name);
|
||||
this.set_local_property_is_enumerable(
|
||||
activation.context.gc_context,
|
||||
&qname,
|
||||
*is_enum,
|
||||
)?;
|
||||
}
|
||||
}
|
||||
let qname = QName::dynamic_name(name);
|
||||
this.set_local_property_is_enumerable(activation.context.gc_context, &qname, *is_enum)?;
|
||||
}
|
||||
|
||||
Ok(Value::Undefined)
|
||||
|
|
|
@ -707,6 +707,8 @@ swf_tests! {
|
|||
(as3_qname_tostring, "avm2/qname_tostring", 1),
|
||||
(as3_qname_valueof, "avm2/qname_valueof", 1),
|
||||
(as3_getouterscope, "avm2/getouterscope", 1),
|
||||
(as3_hasownproperty_namespaces, "avm2/hasownproperty_namespaces", 1),
|
||||
(as3_propertyisenumerable_namespaces, "avm2/propertyisenumerable_namespaces", 1),
|
||||
}
|
||||
|
||||
// TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough.
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
package {
|
||||
public class Test {}
|
||||
}
|
||||
|
||||
class ES4Class {
|
||||
AS3 function as3_prop() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
trace("///new ES4Class.hasOwnProperty(\"as3_prop\");");
|
||||
trace(new ES4Class().hasOwnProperty("as3_prop"));
|
|
@ -0,0 +1,2 @@
|
|||
///new ES4Class.hasOwnProperty("as3_prop");
|
||||
false
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,18 @@
|
|||
package {
|
||||
public class Test {}
|
||||
}
|
||||
|
||||
dynamic class ES4Class {
|
||||
AS3 function as3_prop() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
trace("///new ES4Class.propertyIsEnumerable(\"as3_prop\");");
|
||||
trace(new ES4Class().propertyIsEnumerable("as3_prop"));
|
||||
|
||||
trace("///new ES4Class.setPropertyIsEnumerable(\"as3_prop\", true);");
|
||||
trace(new ES4Class().setPropertyIsEnumerable("as3_prop", true));
|
||||
|
||||
trace("///new ES4Class.propertyIsEnumerable(\"as3_prop\");");
|
||||
trace(new ES4Class().propertyIsEnumerable("as3_prop"));
|
|
@ -0,0 +1,6 @@
|
|||
///new ES4Class.propertyIsEnumerable("as3_prop");
|
||||
false
|
||||
///new ES4Class.setPropertyIsEnumerable("as3_prop", true);
|
||||
undefined
|
||||
///new ES4Class.propertyIsEnumerable("as3_prop");
|
||||
false
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue