From 039777c41ef6b62989d93e8e24b9065afac1f6cb Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sat, 30 Oct 2021 12:40:30 -0400 Subject: [PATCH] avm2: `Object.hasOwnProperty`, `propertyIsEnumerable`, and `setPropertyIsEnumerable` only work with public-NS properties. --- core/src/avm2/globals/object.rs | 32 ++++-------------- tests/tests/regression_tests.rs | 2 ++ .../avm2/hasownproperty_namespaces/Test.as | 12 +++++++ .../avm2/hasownproperty_namespaces/output.txt | 2 ++ .../avm2/hasownproperty_namespaces/test.fla | Bin 0 -> 3880 bytes .../avm2/hasownproperty_namespaces/test.swf | Bin 0 -> 1052 bytes .../propertyisenumerable_namespaces/Test.as | 18 ++++++++++ .../output.txt | 6 ++++ .../propertyisenumerable_namespaces/test.fla | Bin 0 -> 3880 bytes .../propertyisenumerable_namespaces/test.swf | Bin 0 -> 1094 bytes 10 files changed, 46 insertions(+), 26 deletions(-) create mode 100644 tests/tests/swfs/avm2/hasownproperty_namespaces/Test.as create mode 100644 tests/tests/swfs/avm2/hasownproperty_namespaces/output.txt create mode 100644 tests/tests/swfs/avm2/hasownproperty_namespaces/test.fla create mode 100644 tests/tests/swfs/avm2/hasownproperty_namespaces/test.swf create mode 100644 tests/tests/swfs/avm2/propertyisenumerable_namespaces/Test.as create mode 100644 tests/tests/swfs/avm2/propertyisenumerable_namespaces/output.txt create mode 100644 tests/tests/swfs/avm2/propertyisenumerable_namespaces/test.fla create mode 100644 tests/tests/swfs/avm2/propertyisenumerable_namespaces/test.swf 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 0000000000000000000000000000000000000000..eac737de6ba75802f62b70d572f28953936ca02b GIT binary patch literal 3880 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 M0k4?lKP4$kc3?akG5`Po literal 0 HcmV?d00001