From 0d5ead4c022ea811d32f8a37efd3c499a97f2b52 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Tue, 6 Jun 2023 08:56:35 -0500 Subject: [PATCH] core: Ignore newer PlaceObject tag in same frame with duplicate depth If we have two PlaceObject tags in the same frame with the same depth, only the first one actually places an object. The second one is ignored (Flash Player logs a warning). --- core/src/display_object/movie_clip.rs | 7 ++++++- .../place_object_same_depth_frame/FirstChild.as | 14 ++++++++++++++ .../place_object_same_depth_frame/SecondChild.as | 14 ++++++++++++++ .../place_object_same_depth_frame/output.txt | 1 + .../avm2/place_object_same_depth_frame/test.fla | Bin 0 -> 5366 bytes .../avm2/place_object_same_depth_frame/test.swf | Bin 0 -> 684 bytes .../avm2/place_object_same_depth_frame/test.toml | 3 +++ 7 files changed, 38 insertions(+), 1 deletion(-) create mode 100755 tests/tests/swfs/avm2/place_object_same_depth_frame/FirstChild.as create mode 100755 tests/tests/swfs/avm2/place_object_same_depth_frame/SecondChild.as create mode 100644 tests/tests/swfs/avm2/place_object_same_depth_frame/output.txt create mode 100755 tests/tests/swfs/avm2/place_object_same_depth_frame/test.fla create mode 100644 tests/tests/swfs/avm2/place_object_same_depth_frame/test.swf create mode 100644 tests/tests/swfs/avm2/place_object_same_depth_frame/test.toml diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 0686bce47..b3be41e19 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -4439,7 +4439,12 @@ impl QueuedTagList { fn queue_add(&mut self, add_tag: QueuedTag) { let new = match self { QueuedTagList::None => QueuedTagList::Add(add_tag), - QueuedTagList::Add(_) => QueuedTagList::Add(add_tag), + QueuedTagList::Add(existing) => { + // Flash player traces "Warning: Failed to place object at depth 1.", + // so let's log a warning too. + tracing::warn!("Ignoring queued tag {add_tag:?} at same depth as {existing:?}"); + QueuedTagList::Add(*existing) + } QueuedTagList::Remove(r) => QueuedTagList::RemoveThenAdd(*r, add_tag), QueuedTagList::RemoveThenAdd(r, _) => QueuedTagList::RemoveThenAdd(*r, add_tag), }; diff --git a/tests/tests/swfs/avm2/place_object_same_depth_frame/FirstChild.as b/tests/tests/swfs/avm2/place_object_same_depth_frame/FirstChild.as new file mode 100755 index 000000000..d14815f1d --- /dev/null +++ b/tests/tests/swfs/avm2/place_object_same_depth_frame/FirstChild.as @@ -0,0 +1,14 @@ +package { + + import flash.display.MovieClip; + + + public class FirstChild extends MovieClip { + + + public function FirstChild() { + trace("Constructed FirstChild"); + } + } + +} diff --git a/tests/tests/swfs/avm2/place_object_same_depth_frame/SecondChild.as b/tests/tests/swfs/avm2/place_object_same_depth_frame/SecondChild.as new file mode 100755 index 000000000..0370f3b91 --- /dev/null +++ b/tests/tests/swfs/avm2/place_object_same_depth_frame/SecondChild.as @@ -0,0 +1,14 @@ +package { + + import flash.display.MovieClip; + + + public class SecondChild extends MovieClip { + + + public function SecondChild() { + trace("Constructed SecondChild") + } + } + +} diff --git a/tests/tests/swfs/avm2/place_object_same_depth_frame/output.txt b/tests/tests/swfs/avm2/place_object_same_depth_frame/output.txt new file mode 100644 index 000000000..f28642c74 --- /dev/null +++ b/tests/tests/swfs/avm2/place_object_same_depth_frame/output.txt @@ -0,0 +1 @@ +Constructed FirstChild diff --git a/tests/tests/swfs/avm2/place_object_same_depth_frame/test.fla b/tests/tests/swfs/avm2/place_object_same_depth_frame/test.fla new file mode 100755 index 0000000000000000000000000000000000000000..01dff2f8a550655b047d94272c0fe2dc1e7f7f42 GIT binary patch literal 5366 zcmbVQcQ{;Y6JMQ(vdAh+)F4<^ix$1tC{d#>YxPbfqQ?@1)q5||2|>aQA!>-IA%vA6 z(QAm3@U7%Zxliu>A?jJu~k+GurAnxKscDApjtw)MdaxVuM2j002%E z^9bMt_w?fRwRO_gy=G(#k=GN}{tb>n{E$<)hN_&dtgbQNzoSkKYbsusg{W#N{Ra$) zfw_6Zoa{aAyx`7mPF5I4{)S@{5`J?v2Qihni46d}#F!+*z!k1(D!5vEJHuTt9y>dY z8BBR(K*{|#G)`m-q^2y-U$J2l6rHFWQy+`_#Haex2V-n^Ys z#c!{|C)Q`HU`n-P1g@GYw^D1l4TIPReN=<+p0}IDb2NK$W(U zGl9$YavO<5xMeK^;wtl6VoH}dpU{9XR4qjg&~0cEA0j|8OUktKUIG~J0kZ6K$N;4h zQE>Bi@qEN0t!JeYFzGrM0aC2+;C%r&$>o{jzBlBLAIO$>& z_B6nC)RNAxTOeEu-MlQ`fIv2^g_)yQN$FpKNtGBRI#L*=nZEAVa#5Q1tlg{=wY7iP zPnb>|PvEN%cHPiZMIC%D8mM15$|l*Ib5kUpCQLrGBr`6ga2aPo!*1e8W)K4F&RI7e(&0 zJemU|L<-Xj)`K~~W$v{FueFx7jypu5*{KA=mJ$wo*2{K02Lczo^5z2)HSy+A5wtpy zwauaTI|VM6WCrF@1jKPYHBWFlLGzwqe@{8=zw;QA4?pAr=I%$zIm5lIY^=PjPE+KJ z@;#rZD{_qRG4y770Duxh(f*!(dT=i}BV-Z*9wxXXd4Zsp17xk17 zY+c5idgIt?j{O3139;~vLKEIgcK4){k9?5^{Cp|-7pz6!G4^Fvx{2+VUSEzexW?ZL z!g-M#5lf@VKZlFBl$ra0<{EK6(^dUQ7g4MkW#A|14PB2A zQ?cU4N4=q#6P@FDV_V$F+I{nLdv=IL%~Qs3Te*(4G)~Pm5_j9k!6`x9{Dux-*y2s2M||gJ(86GJd1?JPrdJHBc1R7^!U54fufY|$s}#^4YUus zKH?5o{LHm$P-!gYYA}`L)BNV@#^)oe>YL`t-8G`SxlKDe*&-!|uecERWh-^7Z{_w@ zzvd3DnOPPF@9rr+JvR4-`hM=927WR0flk>n+o%nXTMdZhAnl z?EDa9A-hap-VsrifTEeyqd>if`X+L_+Y!d!z9K);^c*k8hQymt@iATM?qk zvzeo7#;+*!k!#A+NSaTRE5#zBZ_jKv%Rf3lB-D|{OouE1w~HveB+q6kvn@F%Z~okn ztpv~(Q?oE8qpD1ka2LuBngDjCGYtZ}=%6#eE(Kq4xdOml2=w|&3Dh_1>V!Zd*W=H$ zz1-HZ?DV&*L}l;sdZFoN^vS#E>u}xgsB~5Z>Ao)maUAmN=2qz*Rc>%4>cs``&dd8O zOiDRZIGWll9AgRhh84A}FPR&?^kvd(A*3VGu28|VuoAG?%r(a|9qHm0NNFTfT&!om zi|}xc*PbOQDkZG_qCc3*+NErl^sW@eTWi83_d*o|(N=1ai_qb5=4Bq0+mI5KPRdk> z+2<{}dt#cGx;dUZBPm=+w>bA8Rq2(&9u{G?(Q8uMkW`H&Ta^bMYj|3YEXH&NG$)3@|**=bLGMKmH)_d0mev;By7Zl}75Kb3N+*D01_U{;)M}~waxT)oA zvS|=fDVvt*JJu6vUEJuVR2ijBtEQnCbMo*O`73R4b-eenwd&0lyy>@j2RN`^XhvUO z#C@u$S~K6um4}a=>C1a>3ayQ3VjDYhhLI75rv3$R;S3Axx(pX^N!Nv@0`+gqB1e_k z7Hm{oLhwQ65mw+qIra7pnn*WJ;@18(hW>#ZgIx&E?RcQ|hmq+qSJ}clFlTxv-hGFmZ16Ni9ob$^8=56=WsEys;0}I9X zOZUu&1J-ay#partdIn=ym2_Q3gFpD!%-B*%7KpX@0&hrLHdSrNLbibKqj-82sLBnY zdyr4K6%yLKB{7s=a<+0mFZsCnAG~`$%T8}0iTr%iFh|M)Z65GtA?LyZL)>iSvWkCa z+O67(51u_yKwFfZseX@S33p7bll&VY&U4^?FKB(8d=tCC)hm|7vUVHhddA(RDn#ZS zj`2XzMiCFROjanBdU}77v!eRelt8R_wPZ)NW=f1I$l(}D;-mqX5$PWtw( zigd)llJ~IPr6yUjZN0*~FF)QOiDJ=~bMW{qq}PK(1yR81UAn_*>OR@66HSA(os>!t zP=uzeQZD-DUQoGgvv2yW*PWoZQ$uV-K+I9AC{@6~^)tk}san+1x+OCEh$aR;E3Clb zBa?uy^H=)&)^OG&Y_SJ^S70L~`_xLnn1>Fc?epeWEhMP!-2#n1EsLy!X-f4zy(im^Zq-vA$dd9XZOScu9xQ@?ksI<)8~al6wxw(Q-XfdSk-Ho_Xu* zM6MsZ#V@M&f7rYe8}$xoc7$?&{P>BwaMbuEQBPckeL0`c5)&UTflL(J#ZXUX>{_(@ zeE3(U5f*HbH>0Iz{R3Acw`L^x7Bl+f9(Nr|#np+6DUZuOU8<*ZRxxc`++iEYDzTf| zxw+o}Rk&)>6Zw`y-M!c;cd=#7dgw@9;Am)I#j&vBz1Y{+mo@_N32O-|g9y$UJc@Y} zugfd#@9-k^_R>&lEl-IsT|3Gu%KhPAd`P&L-$B9iZFV%7sHc`M94OB& zZ(T^iVP;hiqo3xxI&y8R_E2L#sc{E-+q; zX(~Hmvpyz&f@9OxdR8`k?-+iR8JHW2(@Mh?X72?5wQBf|KkG2k&_46h7~H9zmKiX6 z7e2jP&I)ihxQh+1wUxCU9D#ZKkpLfn4Zz2+1Oe2THKx!9oCoN^tzBJg&CxJ-u%UmO zYdoaYj&tbYe9~=kuH@Ou*GC+3q~Xsup%>3RVP-{>_2i5>raR{qUMx>6*2jM=TOXlD zV$b^;+OMD*gIDd&+*Xo*iOsjSaJUXKC#KXNeJ72>cN+@n(jm;Y2yEl*h^TW=7O4?k z4;xiy4lE{mz0ENBB3iE~V3$+Vpju(z9R974P*u?_#)5FB_E+duW-3R65M}^4ZDRF! zEwia0c7(D=Y<1U1XGpl3wh}2gIqMwmFo)c#*UDa6J#-DyVSkJwI(~PgzLU0ZrdIL^ zZm3c8jCtfMZE`&dsp;+UvI1@aE5oStM$Zth^#x!Qt!s_^RiZDcyqIfP-F$ntWLgLG;HWZxxS6z)c{^d zVFZl^uy|)7tkqGo!6GF7^O7+Iv3;b9#Z;+}9Ra8w3SF1-x(K>suXtsE(4S3;bBH2I=pILlWw6IEQDnhh5Q=!yk)Qk>%W46meQ+t zXz-71=E5A8VLK>yQY^%n)YNe25|cwx#36!CUO#Y9N^mYMv2|T+x7H*w#F+*HQwgyT z%8?5c2;)PyVv%1q(0wVhrtxa`06kTteD0P{@owhDQ5PM!qYGzcB&dpLmGsRk@C%W; ziS0N0e8EiArlb5{g5C2OB~MBmO-k2IHHs5QOsB_dDl$y!dNb;a4PX>O`goF^zkC zl-nwmEt_D7TzZ-KDkvN|rl>mx3q;H)-q$?I*~iDR$#$QdFuT{(zYnbv-i-QkpI=_d zlvJXE+)S1J)6ViJPD}v&hCBa zW{Iyo-p0l*KJ@OMh}M#*GG%PMXDP>%Pi)|_C}MhLa9)dA=<-dCFZdr0XF8S&kRv47 zayMS$YEc_8T!G&;Hl;RNO0JXaduB+V$2`I!NR#5eCsQ^qfh$x&9OQD9g-HaNuBEHJjK}_)34ofgIl?|IoVrVdD*+V z@cCf2Nh=#y82sB@=C^Uo|3SyXrULx?_y^;{FY;p;r2aeW7sxlSzpu$L7e0)h<&O4$ zuui8!-{q90kI^3u>wnQsr$pc7ly(QBf0!A4_x0bVMt}1$mvW5$V}^A0?tkm5f0BD} zesTHt9{czA|Fg^fY2pZD;txIdfBA5F-u@JU^M5{lfB#tjJb!=kVHo}&PUD{r{P{rr zXj?JXw-LGV&U6zR#M7k`fSAl{_JipL%V4_<^;>P66XcDEtv#f!u4 zzPImv@B8M>zP$rN2B32VAdVmv_5nZ=+qS(wRNXs}7?>R&n5;}@4mCp}e*3*~D%dcP55rW6|5gSFoU3U0rF*Ljl z^2XQF#ib|PaWp2vwfSJ|SqkP}LG;kRhmCu=bKlVDFF5f0r?2uB4ys_wAy$hS`CU;& z%)n`fE5cNPgM2mq=KIRA^tSeB`Hv$A`48=a*7}d%9f|dKecc~ForE1SzDdS;WcMAP zhu)`W*6Oa0p?B-cMtwE%9y?vJ6@o#>M4)HfFfE$YjY4jy<;G@6wp7e{;Wppjf&}vg z&C&;RhE*2N{phY z5a;7kv;zVX;w3CfNRp5&p@1X=CA>$%oe~a7I4pXf5`$-vJ3p?)2+JIEI4tvQ4xBi~ z2=NF6#PJA;fROCx8p>G)$H*UuZTU9khQjU%*z{lJ5BsNiv>9M&r%oPfC=4JHPz6O5 z6;)DHpQ6f&>Q_|Et~u!QmW~*XV`W@RfcFHtb_;Yj1%#$R*S`c%Q-EVQN8nU