From 4d3788bfe173b7e6e6ec56b5e58245aabdc3c827 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 25 Jan 2022 23:29:16 -0500 Subject: [PATCH] tests: Add tests for AS3 gotos during `enterFrame`, `frameConstructed`, and/or `exitFrame` --- tests/tests/regression_tests.rs | 3 + .../EventWatcher.as | 37 ++++++ .../MainTimeline.as | 68 ++++++++++ .../output.txt | 110 +++++++++++++++++ .../test.fla | Bin 0 -> 5024 bytes .../test.swf | Bin 0 -> 1922 bytes .../EventWatcher.as | 37 ++++++ .../MainTimeline.as | 67 ++++++++++ .../output.txt | 116 ++++++++++++++++++ .../test.fla | Bin 0 -> 5024 bytes .../test.swf | Bin 0 -> 1914 bytes .../EventWatcher.as | 37 ++++++ .../MainTimeline.as | 62 ++++++++++ .../output.txt | 84 +++++++++++++ .../test.fla | Bin 0 -> 5024 bytes .../test.swf | Bin 0 -> 1864 bytes 16 files changed, 621 insertions(+) create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/test.swf create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/test.swf create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframegoto/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframegoto/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframegoto/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframegoto/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframegoto/test.swf diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 9f5297daf..244f6bdda 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -373,9 +373,12 @@ swf_tests! { (as3_movieclip_dispatchevent_selfadd, "avm2/movieclip_dispatchevent_selfadd", 1), (as3_movieclip_dispatchevent_target, "avm2/movieclip_dispatchevent_target", 1), (as3_movieclip_dispatchevent, "avm2/movieclip_dispatchevent", 1), + (as3_movieclip_displayevents_constructframegoto, "avm2/movieclip_displayevents_constructframegoto", 12), (as3_movieclip_displayevents_constructframeplay, "avm2/movieclip_displayevents_constructframeplay", 6), (as3_movieclip_displayevents_dblhandler, "avm2/movieclip_displayevents_dblhandler", 4), + (as3_movieclip_displayevents_enterframegoto, "avm2/movieclip_displayevents_enterframegoto", 12), (as3_movieclip_displayevents_enterframeplay, "avm2/movieclip_displayevents_enterframeplay", 6), + (as3_movieclip_displayevents_exitframegoto, "avm2/movieclip_displayevents_exitframegoto", 12), (as3_movieclip_displayevents_exitframeplay, "avm2/movieclip_displayevents_exitframeplay", 6), (as3_movieclip_displayevents_looping, "avm2/movieclip_displayevents_looping", 5), (as3_movieclip_displayevents_timeline, "avm2/movieclip_displayevents_timeline", 7), diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/EventWatcher.as new file mode 100644 index 000000000..ebd28f313 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/EventWatcher.as @@ -0,0 +1,37 @@ +package { + import flash.display.MovieClip; + import flash.events.Event; + + public class EventWatcher extends MovieClip { + public function EventWatcher() { + super(); + this.setup(); + } + + function trace_event(event: Event) { + trace(this.name + " (frame " + this.currentFrame + "):" + event); + } + + public function setup() { + this.addEventListener(Event.ENTER_FRAME, this.trace_event); + this.addEventListener(Event.EXIT_FRAME, this.trace_event); + this.addEventListener(Event.ADDED, this.trace_event); + this.addEventListener(Event.ADDED_TO_STAGE, this.trace_event); + this.addEventListener(Event.FRAME_CONSTRUCTED, this.trace_event); + this.addEventListener(Event.REMOVED, this.trace_event); + this.addEventListener(Event.REMOVED_FROM_STAGE, this.trace_event); + this.addEventListener(Event.RENDER, this.trace_event); + } + + public function destroy() { + this.removeEventListener(Event.ENTER_FRAME, this.trace_event); + this.removeEventListener(Event.EXIT_FRAME, this.trace_event); + this.removeEventListener(Event.ADDED, this.trace_event); + this.removeEventListener(Event.ADDED_TO_STAGE, this.trace_event); + this.removeEventListener(Event.FRAME_CONSTRUCTED, this.trace_event); + this.removeEventListener(Event.REMOVED, this.trace_event); + this.removeEventListener(Event.REMOVED_FROM_STAGE, this.trace_event); + this.removeEventListener(Event.RENDER, this.trace_event); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/MainTimeline.as new file mode 100644 index 000000000..565f77f87 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/MainTimeline.as @@ -0,0 +1,68 @@ +package { + import flash.display.MovieClip; + import flash.events.Event; + + public class MainTimeline extends EventWatcher { + var invocation = 0; + + var destroy_me = false; + + public function MainTimeline() { + super(); + this.addEventListener(Event.FRAME_CONSTRUCTED, this.construct_frame_controller); + this.addEventListener(Event.EXIT_FRAME, this.exit_frame_controller); + } + + function inspect() { + var children = "", child; + + for (var i = 0; i < this.numChildren; i += 1) { + child = this.getChildAt(i); + if (child) { + children += child.name + " "; + } + } + + trace("///Children:", children); + } + + function construct_frame_controller(evt: Event) { + this.invocation++; + + switch (this.invocation) { + default: + break; + case 3: + trace("/// (gotoAndStop(3) in frameConstructed...)"); + this.gotoAndStop(3); + break; + case 5: + trace("/// (gotoAndPlay(1) in frameConstructed...)"); + this.gotoAndPlay(1); + break; + case 9: + trace("/// (gotoAndPlay(3) in frameConstructed...)"); + this.gotoAndPlay(3); + break; + case 13: + trace("/// (gotoAndStop(2) in frameConstructed...)"); + this.gotoAndStop(2); + this.destroy_me = true; + break; + } + + this.inspect(); + } + + function exit_frame_controller(evt: Event) { + this.inspect(); + + if (this.destroy_me) { + this.stop(); + this.destroy(); + this.removeEventListener(Event.FRAME_CONSTRUCTED, this.construct_frame_controller); + this.removeEventListener(Event.EXIT_FRAME, this.exit_frame_controller); + } + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/output.txt new file mode 100644 index 000000000..304705a4e --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/output.txt @@ -0,0 +1,110 @@ +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a +//MainTimeline frame 1 +// symbol_a frame 1 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +//MainTimeline frame 2 +// symbol_b frame 1 +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +/// (gotoAndStop(3) in frameConstructed...) +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +//MainTimeline frame 3 +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +///Children: symbol_b +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +/// (gotoAndPlay(1) in frameConstructed...) +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a +//MainTimeline frame 1 +// symbol_a frame 1 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a +///Children: symbol_a +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +//MainTimeline frame 2 +// symbol_b frame 1 +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +//MainTimeline frame 3 +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +/// (gotoAndPlay(3) in frameConstructed...) +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +//MainTimeline frame 3 +// symbol_b frame 1 +// symbol_a frame 1 +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +///Children: symbol_b +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a +//MainTimeline frame 1 +// symbol_a frame 1 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +//MainTimeline frame 2 +// symbol_b frame 1 +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +/// (gotoAndStop(2) in frameConstructed...) +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +//MainTimeline frame 2 +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +///Children: symbol_b +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..61a1961ede65583ee47b74e3397209e4fcd16770 GIT binary patch literal 5024 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 Re?pA?y~Z-^_W2P5{twtJI;;Qy literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..8aa230ece052cc3335f1f60f6bc5b6ac22fef903 GIT binary patch literal 1922 zcmV-|2YvWMS5qrl4gdgnoUK<+Qya+@@1D_gk2I1P{RIRVfd>o*YXoGyvAk=8C1JB! zJPu&5lfX(s8ZFug2}=WOA5!J=VNa>8$`?p+$|>hm?aALDHHO6g7#>c!MR`3V32A}N zWmPjh{d@2Ad#``}x;66>2|0uYju9H-Q6?ZFgwkBA)f$%%hm{58+lI2cReJc~<)e+= zy7sKJQq-$^Pybj~(c6dwwis;|^_m`EK&Ta7umw9}F1+>~+6nIb>qP@$3_{exVb;PG z_{8|)hd)U_p8Pl#UORmV61NO04hDWt2!;n*2K<(Upq<8`i2XVAchr2fzgw^73g~V4 zk&i`zpNtZqMktRa4ZUgP%GE+@)3#g5EvQ{lxl!2H7p8vBq$?WE9_cmXtAbJ7(;I3p z@Pb`)FQGG0Q?NBdea1$kP}Fm_KG>&d>c-(gxKC7qz>WH=;q^kLwpH2JtCgCr_JVMq zrc!Gj=tbj3pRic3fs?}`%z#ZW2N---t9oOy&rW|?xo8sVGjSNYM7DT|Y)S0U=I+ww zbI2)Gng`XwEBAW+sG_HJ(b!~y;v|R z^_r(WBDb&8Hea!;DT-Xmij&)-^H>t>tTOLk5U*sPJVR4jpY^t!C(ug;6=u9Z9rLpN7&5tb*{UNEPqb6vXZ`FvA1>f8BW z*x}u~z3ZMRGzHsKjL$e6dW(mR1_*2#x!IJIeY}<3$gOUytY>AQ*B|;N$9O=AVDndRjMVJw_ta0#q*7Bq*-^x2>irWNlxq;#z9I|3#Iz5 zo+#G$)s@X9bupQ|t?nLHsz#+Y*tZ>1-R&6empe71^b0Squkn7P3uQU-GfqZ(PtMd& z>K(_W+Tnh>J%6vNs-1p{*N==j5X5H~X)CqTrcpnbS(=SkYH^#(bcb2Jlt?6Ir5>}s zaZezXnT7v5j+tE?cXhmrxh-C4>uQ2Ns`j1n@%FLNch+|fmdkAyFSA{|+;-_Q+oecU zhz6pep~zq$iiZXV@z97cB0Lly#YSR-v9;J2vERhLjIGBW^O*QOM3lU4pMO9O1Vdq! zVnVqf<-=5nQZh)zAxefRiBU2_$tWdbRJ=yTaVo~CI6=ipDn_Yzor(%2QUqL3x$(Ny;x!a+{K0Q*wur6eV{l`HYg!DY-|<%793@XE*`nkb zCBF+fZvgDipGQug-7aV`eGNVK8sqNKc;J?p*87^ZK4#;Gd%%8;ux)sb7hQFmG|7VNDAmAGx-t!3Q3lCC(JVYT9g3yuqNJi zjstAgzV^Ii2K?a1%ey4+F8Gnn&M1gNpp^J1xvvBM`~QL8Sj; z2sOq^VgroMaekjb?C4+4qQ zsMY!bsJLxveq?I}QtXtdy<$%q;tY)8O%QQ%fN0o~en*y5C(pD4gZ) z+5va~t_C=$0omU8zd!qfh1n$8u9nZ`+h;rH^1!+L>$BXsJP6h3S%PYOU#*1djCP-vy6ko@GXge;x_v*8~xkze_rFxr`awTurIg& I0lqIr8-^^wv;Y7A literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/EventWatcher.as new file mode 100644 index 000000000..ebd28f313 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/EventWatcher.as @@ -0,0 +1,37 @@ +package { + import flash.display.MovieClip; + import flash.events.Event; + + public class EventWatcher extends MovieClip { + public function EventWatcher() { + super(); + this.setup(); + } + + function trace_event(event: Event) { + trace(this.name + " (frame " + this.currentFrame + "):" + event); + } + + public function setup() { + this.addEventListener(Event.ENTER_FRAME, this.trace_event); + this.addEventListener(Event.EXIT_FRAME, this.trace_event); + this.addEventListener(Event.ADDED, this.trace_event); + this.addEventListener(Event.ADDED_TO_STAGE, this.trace_event); + this.addEventListener(Event.FRAME_CONSTRUCTED, this.trace_event); + this.addEventListener(Event.REMOVED, this.trace_event); + this.addEventListener(Event.REMOVED_FROM_STAGE, this.trace_event); + this.addEventListener(Event.RENDER, this.trace_event); + } + + public function destroy() { + this.removeEventListener(Event.ENTER_FRAME, this.trace_event); + this.removeEventListener(Event.EXIT_FRAME, this.trace_event); + this.removeEventListener(Event.ADDED, this.trace_event); + this.removeEventListener(Event.ADDED_TO_STAGE, this.trace_event); + this.removeEventListener(Event.FRAME_CONSTRUCTED, this.trace_event); + this.removeEventListener(Event.REMOVED, this.trace_event); + this.removeEventListener(Event.REMOVED_FROM_STAGE, this.trace_event); + this.removeEventListener(Event.RENDER, this.trace_event); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/MainTimeline.as new file mode 100644 index 000000000..a9a5c829d --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/MainTimeline.as @@ -0,0 +1,67 @@ +package { + import flash.display.MovieClip; + import flash.events.Event; + + public class MainTimeline extends EventWatcher { + var invocation = 0; + + var destroy_me = false; + + public function MainTimeline() { + super(); + this.addEventListener(Event.ENTER_FRAME, this.enter_frame_controller); + this.addEventListener(Event.EXIT_FRAME, this.exit_frame_controller); + } + + function inspect() { + var children = "", child; + + for (var i = 0; i < this.numChildren; i += 1) { + child = this.getChildAt(i); + if (child) { + children += child.name + " "; + } + } + + trace("///Children:", children); + } + + function enter_frame_controller(evt: Event) { + switch (this.invocation) { + default: + break; + case 2: + trace("/// (gotoAndStop(3) in enterFrame...)"); + this.gotoAndStop(3); + break; + case 4: + trace("/// (gotoAndPlay(1) in enterFrame...)"); + this.gotoAndPlay(1); + break; + case 7: + trace("/// (gotoAndPlay(3) in enterFrame...)"); + this.gotoAndPlay(3); + break; + case 10: + trace("/// (gotoAndStop(2) in enterFrame...)"); + this.gotoAndStop(2); + this.destroy_me = true; + break; + } + + this.invocation++; + this.inspect(); + } + + function exit_frame_controller(evt: Event) { + this.inspect(); + + if (this.destroy_me) { + this.stop(); + this.destroy(); + this.removeEventListener(Event.ENTER_FRAME, this.enter_frame_controller); + this.removeEventListener(Event.EXIT_FRAME, this.exit_frame_controller); + } + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/output.txt new file mode 100644 index 000000000..da2d24042 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/output.txt @@ -0,0 +1,116 @@ +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +// symbol_a frame 1 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +// symbol_b frame 1 +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (gotoAndStop(3) in enterFrame...) +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +// symbol_b frame 1 +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +///Children: symbol_b +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (gotoAndPlay(1) in enterFrame...) +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +// symbol_a frame 1 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a +///Children: symbol_a +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +// symbol_b frame 1 +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (gotoAndPlay(3) in enterFrame...) +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +// symbol_b frame 1 +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +///Children: symbol_b +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +// symbol_a frame 1 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +// symbol_b frame 1 +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (gotoAndStop(2) in enterFrame...) +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +///Children: symbol_b +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..61a1961ede65583ee47b74e3397209e4fcd16770 GIT binary patch literal 5024 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 Re?pA?y~Z-^_W2P5{twtJI;;Qy literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..d5fe40f78451a2202b2c4654936cac5dbcd8b6af GIT binary patch literal 1914 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 Re?pA?y~Z-^_W2P5{twtJI;;Qy literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframegoto/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_exitframegoto/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..936b589ed00cd77c00c0a946a42c96d2b152d172 GIT binary patch literal 1864 zcmV-O2eQQ`<-u@0P4?*%ny-1Pla21c8KD0&mESGdl@`O_pSc zXEBq>?!XvhM z<}@y;)xY0+-S4BH+O3yJC?FI#MQE5unV^UeTH%__=7fASqAVznkChiMGEdhZ{dwu7 zcK20kx487#alUS<=ylW&x)|k4dR0#>Ak>U3IK;MCh^)Op+oA3MJg*~+fkaIlVJ%$2 zJLaPw{^I}X?5FX_+WA9ZyfTP582CLQ7#`>W;MXJ!?Fix z3G^EKNu5y*!I2F2D4X?SNiR6^P>-OYn@5L{9%>H^*K4mv){91U(>Ty8Mpak4L8M1w zR2zqS$(-sT^_K=X&tfZ-YE_u7Qqk+-9u+t8KHOp-E+w|p;q9bjzzurOXdG6Gue|HE zV?$r57>A*&nIo<-sXI=8S55>c4YU=x)NNmEFK)ZD>ocmywNlYEYE@rrMBzZEtvp2g zhVDAB=sr?{W13Udc-z%v$JKPJBs^7Usnbs^3>NqHR#`V+svC#qc)wwn!RB`V1darp zU^9>%H{OAanEi zczrG2Ba2O$ei2OGX`b#sMvm(AeMbQNuK-!u=?s#@Hu?dr)=?Lb}5r_@DFTT*wA zjEZSghk9PJbmt|D^zv?zD7|F=f|}@6x>ARuzc9&I_db{YS%Kq(zj}1A(u!YFRkhtu z^ZK!=0FjtwNn5V&<;~jRY-%oHR1++pPI)Ag$vJn2)zLC@~n-Yxp;F80%1?5~^Zr<;n#gqR!)4M&FL7#@xd;o-Ot7qa4N zJRXn5AI5(dUyDDAKaPLSV>0L?qF?e33%*rOehzme3%MRN@7$TqGXto5lZ5e zj8Za2#c?WLqv8Y=6I6^+agvHtlw7A|hLTxIZc==U^7E9xP5C6{RZ4zC$r2@ZDfx(! zk10u0a*vWvDETcVpHgz)8^e@jyfYjnPbk@-WRsGwLhc_j`!D8^+h?~2T1>x#9y?Wd zyCgoi{Y)w`=>Xh=a0gr|&+(!Mao7WLf%j4*@Nh056eB8PBzgs}7x}$DX3NhSi4Eh~ zBtG9DMp6Ky0U4vgAVz@@hEoDK;zK--IhfIl1#l~fy&lYk;Beyg@s1-<3Sj+G;0lQM=$1VtRSoG$wfIw%5yNyElbnUPE6Yw(sqWm zoe^y(uI-F!J3L&^(75~C=PopR7>0N*4GS3Nj$AC*#L{dE7HrYVQDl2TMtIKWS3u^s zwD))s`E6-C%sfk-TII3R`8%g?PIF;w4}dOZK0XKC0L&v>JGeY$1s4Yj$r`T!LXO*U9~hYEo|TTQ0{R%_X6ngFwDmi?&jW4v0qAEJg|M> zx_>)rb8KN{1y(<(a8@~#ixS8^tclbLCBUL)>6UnpU)qJCknYKox9{;XlHcRcFf=P% zXdc`0$$#yTf==Ga)8Hzk`h0a3pS-mrXCWw9JNo9VJU737ddk$!6?}T~?%XQhjGi}} z_6QVV?oBSt*>SKmz$~3|U}}t2!53%@a(VM@S^Dwa*?CbCd6AQ!GZT~YzuDtDjQ%~V z3dK_R+%0TR%l~5h4dC;PpS2X60}toqzcc<8@Lw{1p6LUBTmGK$D)3JkuUQJm=2@_2 ziUandybmYuJqQ8PA-$CeLJE>U1w5tjXK@CxtOA@-1Q&900^m(WbRjPX0VWm6g&vt> zGl<;i{bthx_iD5GO|yC2Z2kbLxMSr8k$u-H4}?Zw)JInCHnKmqaw4+Roh5;K_yiI) z$iZsL&MW-v;tw`vzO(l;aLNDi;_FLZzT~$qwlDc0)Riv