diff --git a/core/src/avm2/globals/object.rs b/core/src/avm2/globals/object.rs index f2b91806a..109f805f4 100644 --- a/core/src/avm2/globals/object.rs +++ b/core/src/avm2/globals/object.rs @@ -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) diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 8b3184e43..da14ec316 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -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. diff --git a/tests/tests/swfs/avm2/hasownproperty_namespaces/Test.as b/tests/tests/swfs/avm2/hasownproperty_namespaces/Test.as new file mode 100644 index 000000000..8a7859baa --- /dev/null +++ b/tests/tests/swfs/avm2/hasownproperty_namespaces/Test.as @@ -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")); \ No newline at end of file diff --git a/tests/tests/swfs/avm2/hasownproperty_namespaces/output.txt b/tests/tests/swfs/avm2/hasownproperty_namespaces/output.txt new file mode 100644 index 000000000..0ce11c476 --- /dev/null +++ b/tests/tests/swfs/avm2/hasownproperty_namespaces/output.txt @@ -0,0 +1,2 @@ +///new ES4Class.hasOwnProperty("as3_prop"); +false diff --git a/tests/tests/swfs/avm2/hasownproperty_namespaces/test.fla b/tests/tests/swfs/avm2/hasownproperty_namespaces/test.fla new file mode 100644 index 000000000..eac737de6 Binary files /dev/null and b/tests/tests/swfs/avm2/hasownproperty_namespaces/test.fla differ diff --git a/tests/tests/swfs/avm2/hasownproperty_namespaces/test.swf b/tests/tests/swfs/avm2/hasownproperty_namespaces/test.swf new file mode 100644 index 000000000..a3685a3f4 Binary files /dev/null and b/tests/tests/swfs/avm2/hasownproperty_namespaces/test.swf differ diff --git a/tests/tests/swfs/avm2/propertyisenumerable_namespaces/Test.as b/tests/tests/swfs/avm2/propertyisenumerable_namespaces/Test.as new file mode 100644 index 000000000..10eddfb4f --- /dev/null +++ b/tests/tests/swfs/avm2/propertyisenumerable_namespaces/Test.as @@ -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")); \ No newline at end of file diff --git a/tests/tests/swfs/avm2/propertyisenumerable_namespaces/output.txt b/tests/tests/swfs/avm2/propertyisenumerable_namespaces/output.txt new file mode 100644 index 000000000..7f224cb7c --- /dev/null +++ b/tests/tests/swfs/avm2/propertyisenumerable_namespaces/output.txt @@ -0,0 +1,6 @@ +///new ES4Class.propertyIsEnumerable("as3_prop"); +false +///new ES4Class.setPropertyIsEnumerable("as3_prop", true); +undefined +///new ES4Class.propertyIsEnumerable("as3_prop"); +false diff --git a/tests/tests/swfs/avm2/propertyisenumerable_namespaces/test.fla b/tests/tests/swfs/avm2/propertyisenumerable_namespaces/test.fla new file mode 100644 index 000000000..eac737de6 Binary files /dev/null and b/tests/tests/swfs/avm2/propertyisenumerable_namespaces/test.fla differ diff --git a/tests/tests/swfs/avm2/propertyisenumerable_namespaces/test.swf b/tests/tests/swfs/avm2/propertyisenumerable_namespaces/test.swf new file mode 100644 index 000000000..b8d9ecb3f Binary files /dev/null and b/tests/tests/swfs/avm2/propertyisenumerable_namespaces/test.swf differ