From f7485769272897d23475aa03a17e8585cc139b5b Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sun, 18 Oct 2020 00:25:07 -0400 Subject: [PATCH] avm2: Implement `getChildByName` --- .../flash/display/displayobjectcontainer.rs | 29 ++++++++++++++++++ core/tests/regression_tests.rs | 1 + .../output.txt | 4 +++ .../test.fla | Bin 0 -> 5138 bytes .../test.swf | Bin 0 -> 1266 bytes 5 files changed, 34 insertions(+) create mode 100644 core/tests/swfs/avm2/displayobjectcontainer_getchildbyname/output.txt create mode 100644 core/tests/swfs/avm2/displayobjectcontainer_getchildbyname/test.fla create mode 100644 core/tests/swfs/avm2/displayobjectcontainer_getchildbyname/test.swf diff --git a/core/src/avm2/globals/flash/display/displayobjectcontainer.rs b/core/src/avm2/globals/flash/display/displayobjectcontainer.rs index ebc42d4d6..4b00152d3 100644 --- a/core/src/avm2/globals/flash/display/displayobjectcontainer.rs +++ b/core/src/avm2/globals/flash/display/displayobjectcontainer.rs @@ -54,6 +54,31 @@ pub fn get_child_at<'gc>( Ok(Value::Undefined) } +/// Implements `DisplayObjectContainer.getChildByName` +pub fn get_child_by_name<'gc>( + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, + args: &[Value<'gc>], +) -> Result, Error> { + if let Some(dobj) = this.and_then(|this| this.as_display_object()) { + let name = args + .get(0) + .cloned() + .unwrap_or(Value::Undefined) + .coerce_to_string(activation)?; + let child = dobj.get_child_by_name(&name, false).ok_or_else(|| { + format!( + "RangeError: Display object container has no child with name {}", + name + ) + })?; + + return Ok(child.object2()); + } + + Ok(Value::Undefined) +} + /// Construct `DisplayObjectContainer`'s class. pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc>> { let class = Class::new( @@ -73,6 +98,10 @@ pub fn create_class<'gc>(mc: MutationContext<'gc, '_>) -> GcCell<'gc, Class<'gc> QName::new(Namespace::public_namespace(), "getChildAt"), Method::from_builtin(get_child_at), )); + write.define_instance_trait(Trait::from_method( + QName::new(Namespace::public_namespace(), "getChildByName"), + Method::from_builtin(get_child_by_name), + )); class } diff --git a/core/tests/regression_tests.rs b/core/tests/regression_tests.rs index 604832b8a..6cacff15e 100644 --- a/core/tests/regression_tests.rs +++ b/core/tests/regression_tests.rs @@ -412,6 +412,7 @@ swf_tests! { (as3_lazyinit, "avm2/lazyinit", 1), (as3_trace, "avm2/trace", 1), (as3_displayobjectcontainer_getchildat, "avm2/displayobjectcontainer_getchildat", 1), + (as3_displayobjectcontainer_getchildbyname, "avm2/displayobjectcontainer_getchildbyname", 1), } // TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough. diff --git a/core/tests/swfs/avm2/displayobjectcontainer_getchildbyname/output.txt b/core/tests/swfs/avm2/displayobjectcontainer_getchildbyname/output.txt new file mode 100644 index 000000000..992a07a74 --- /dev/null +++ b/core/tests/swfs/avm2/displayobjectcontainer_getchildbyname/output.txt @@ -0,0 +1,4 @@ +//this.getChildByName("child_clip") +[object ChildClip_1] +//this.getChildByName("child_clip").child_method() +//Child method called diff --git a/core/tests/swfs/avm2/displayobjectcontainer_getchildbyname/test.fla b/core/tests/swfs/avm2/displayobjectcontainer_getchildbyname/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..9b89634b8fb0ce3478915b507fed943e923c462d GIT binary patch literal 5138 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 literal 0 HcmV?d00001 diff --git a/core/tests/swfs/avm2/displayobjectcontainer_getchildbyname/test.swf b/core/tests/swfs/avm2/displayobjectcontainer_getchildbyname/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..f19cac92d06149930caa27c0f54de7c3aa660b81 GIT binary patch literal 1266 zcmVGl`3(l#0Auf-Z=0$kP6YeMUjw@kjkwWge@V2 zxP)1+ootF}S!F!){r@-r|NZmGTmkel0KrcHh*IEK9|r(fgc})@ldVdcyR-xeNR0}xo> zM)_kfI;?#0=f216@k`l5m$Ffii-NajZv8ZKo%{YV_ub8}GdI6_0!}{xiSVs^;p^*6ThSA;ZuOvkO*{hRr|+T*1iDB(*cG zOmZN@^w_9^^jarJMb(Rvs$7+@qHA8;RzoF4;_b19uzz!uEE%;<{JNoNM0I5o>Ldj+ zI$Tq#)g1_F=9Wxz&BUnIQG$uiz}7HH*0;|Akyf#`*|w}G9ewRJ>gc;tQwO(gcxG$E zx7(M9WQ^k5jmPXhSG{P+0qWiZA>HC*#p?9^6y)v(5 zGx(lPRV*Zg4~U;TtT>fBZ_MpDI*W#>4{Vd zR~3^SHQW|{bnP_pOpR|{obkl)W}(iz)xA4`?NjIeN5G`>Hcurc{v*B<%?PZ(N4)|y z$VP*-mmc84TtpDKK_M#a;9|l~VTch=( zwl|iHrD9?%O$X_hV?oy>%eg6<_jrBK9|(r}`Uk=hVKBNQwsUBB*T|@AYf{S@ndfeq|u;fpLhz`~bUnBn^&e;D#U z$j?LG4|)6lzV&LkNOJ=lTa6}-vB!{toC~<1i@YXo@`BKiV*m>oYa+pnMTTz5@^KVR z20S3m<7$W}$$Ut8y#1}dCe;v|@B%wKmt(1>>!cNyc-V$Wd~O0=E&_#y*vNtlTx(yG zii1X(&vCE`iPufo{7gecpx_Y;Ua{a43x2T>5DP)E0LkAuFl>KSs&%j#B~$1v5sVc( z-4HK?W)HPqX;QfmMYMz(v!N4xZQv%J1#3WeZ2h3gkcq5A)IjTqEh?NFutjmt6-9ML c(H&8T2h!~YhoIL*Ca#{xvi*er1IF!=j*2I28~^|S literal 0 HcmV?d00001