From fe8dbf61173cbbaa84ba15b16bbb7a6353538df4 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 15 Dec 2021 20:31:12 -0500 Subject: [PATCH 01/47] tests: Add a test for the order of events surrounding `gotoAndStop` --- tests/tests/regression_tests.rs | 1 + .../EventWatcher.as | 37 ++++++ .../SymbolA.as | 9 ++ .../SymbolB.as | 9 ++ .../SymbolC.as | 7 ++ .../output.txt | 113 ++++++++++++++++++ .../movieclip_displayevents_stopped/test.fla | Bin 0 -> 7055 bytes .../movieclip_displayevents_stopped/test.swf | Bin 0 -> 2340 bytes 8 files changed, 176 insertions(+) create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_stopped/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_stopped/SymbolA.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_stopped/SymbolB.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_stopped/SymbolC.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_stopped/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_stopped/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_stopped/test.swf diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 6c2661193928..d270fb98cebf 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -376,6 +376,7 @@ swf_tests! { (as3_movieclip_displayevents_dblhandler, "avm2/movieclip_displayevents_dblhandler", 4), (as3_movieclip_displayevents_looping, "avm2/movieclip_displayevents_looping", 5), (as3_movieclip_displayevents_timeline, "avm2/movieclip_displayevents_timeline", 5), + (as3_movieclip_displayevents_stopped, "avm2/movieclip_displayevents_stopped", 10), (as3_movieclip_displayevents, "avm2/movieclip_displayevents", 9), (as3_movieclip_drawrect, "avm2/movieclip_drawrect", 1), (as3_movieclip_goto_during_frame_script, "avm2/movieclip_goto_during_frame_script", 1), diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_stopped/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/EventWatcher.as new file mode 100644 index 000000000000..79e05fbf6ab2 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/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_stopped/SymbolA.as b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/SymbolA.as new file mode 100644 index 000000000000..fa54d3a3ce9f --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/SymbolA.as @@ -0,0 +1,9 @@ +package { + public class SymbolA extends EventWatcher { + public function SymbolA() { + super(); + + this.name = "SymbolA"; + } + } +} diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_stopped/SymbolB.as b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/SymbolB.as new file mode 100644 index 000000000000..5fb584375e01 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/SymbolB.as @@ -0,0 +1,9 @@ +package { + public class SymbolB extends EventWatcher { + public function SymbolB() { + super(); + + this.name = "SymbolB"; + } + } +} diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_stopped/SymbolC.as b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/SymbolC.as new file mode 100644 index 000000000000..eafc4806d168 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/SymbolC.as @@ -0,0 +1,7 @@ +package { + public class SymbolC extends EventWatcher { + public function SymbolC() { + super(); + } + } +} diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_stopped/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/output.txt new file mode 100644 index 000000000000..6a37675d5e1a --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/output.txt @@ -0,0 +1,113 @@ +//this.addChild(new SymbolA()); +SymbolA(frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//this.getChildAt(0).stop(); +SymbolA(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//this.addChild(new SymbolB()); +SymbolB(frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +SymbolB(frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//this.getChildAt(1).gotoAndStop(3); +SymbolB(frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +symbol_c(frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +symbol_c(frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 4):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 4):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 4):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 5):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 5):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 5):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 6):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +SymbolA(frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +SymbolB(frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +symbol_c(frame 6):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///name +root1 +///currentFrame +10 +///isPlaying +false +///children: 2 +///name +SymbolA +///currentFrame +10 +///isPlaying +false +///children: 1 +///name +instance2 +///end children +///name +SymbolB +///currentFrame +10 +///isPlaying +false +///children: 2 +///name +instance4 +///name +symbol_c +///currentFrame +10 +///isPlaying +false +///children: 1 +///name +instance5 +///end children +///end children +///end children diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_stopped/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..ff961bdbe397121c266b1523ddb250a257939ef3 GIT binary patch literal 7055 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 S0RTYAj~4PygdqO|0R9hu8P-q$ literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_stopped/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_stopped/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..7aeeb742c97c43ee787fccf31ca166f28ec063e1 GIT binary patch literal 2340 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 K#{U6W!6Xk2kCe3l literal 0 HcmV?d00001 From 65fd3aee1211d7dfb48635b18d0cdb7de7ce1b32 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 15 Dec 2021 23:48:36 -0500 Subject: [PATCH 02/47] tests: Log `this.currentFrame` on every event watcher we can. --- .../movieclip_displayevents/EventWatcher.as | 2 +- .../avm2/movieclip_displayevents/output.txt | 124 +++++++++--------- .../avm2/movieclip_displayevents/test.swf | Bin 1902 -> 1926 bytes .../EventWatcher.as | 2 +- .../output.txt | 78 +++++------ .../movieclip_displayevents_looping/test.swf | Bin 2288 -> 2310 bytes .../EventWatcher.as | 2 +- .../output.txt | 90 ++++++------- .../movieclip_displayevents_timeline/test.swf | Bin 1852 -> 1871 bytes 9 files changed, 149 insertions(+), 149 deletions(-) diff --git a/tests/tests/swfs/avm2/movieclip_displayevents/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents/EventWatcher.as index 71a88a4854e1..79c18a2765e2 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents/EventWatcher.as +++ b/tests/tests/swfs/avm2/movieclip_displayevents/EventWatcher.as @@ -10,7 +10,7 @@ } function trace_event(event: Event) { - trace(this.name + ":" + event); + trace(this.name + " (frame " + this.currentFrame + "):" + event); } public function setup() { diff --git a/tests/tests/swfs/avm2/movieclip_displayevents/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents/output.txt index 7ac7062a3f1a..8289117b92ac 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents/output.txt +++ b/tests/tests/swfs/avm2/movieclip_displayevents/output.txt @@ -1,20 +1,20 @@ //MainTimeline frame 1 //var ew = new EventWatcher('ew'); //this.addChild(ew); -ew:[Event type="added" bubbles=true cancelable=false eventPhase=2] -ew:[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +ew (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] //End MainTimeline frame 1 -ew:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -ew:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -ew:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 2 -ew:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -ew:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -ew:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 3 //this.removeChild(ew); -ew:[Event type="removed" bubbles=true cancelable=false eventPhase=2] -ew:[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +ew (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] //ew.destroy(); //System.gc(); //End MainTimeline frame 3 @@ -22,73 +22,73 @@ ew:[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] //ew = new EventWatcher('parent'); //var ew2 = new EventWatcher('child'); //ew.addChild(ew2); -child:[Event type="added" bubbles=true cancelable=false eventPhase=2] -parent:[Event type="added" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=3] //End MainTimeline frame 4 -parent:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -child:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -parent:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -child:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -parent:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] -child:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 5 -parent:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -child:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -parent:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -child:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -parent:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] -child:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 6 //this.addChild(ew); -parent:[Event type="added" bubbles=true cancelable=false eventPhase=2] -parent:[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] -child:[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] //End MainTimeline frame 6 -parent:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -child:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -parent:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -child:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -parent:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] -child:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 7 //ew.removeChild(ew2); -child:[Event type="removed" bubbles=true cancelable=false eventPhase=2] -parent:[Event type="removed" bubbles=true cancelable=false eventPhase=3] -child:[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] //End MainTimeline frame 7 -parent:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -child:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -parent:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -child:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -parent:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] -child:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 8 //ew.addChild(ew2); -child:[Event type="added" bubbles=true cancelable=false eventPhase=2] -parent:[Event type="added" bubbles=true cancelable=false eventPhase=3] -child:[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] //End MainTimeline frame 8 -parent:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -child:[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -parent:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -child:[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -parent:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] -child:[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 9 //this.removeChild(ew); -parent:[Event type="removed" bubbles=true cancelable=false eventPhase=2] -parent:[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] -child:[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] //this.addChild(ew); -parent:[Event type="added" bubbles=true cancelable=false eventPhase=2] -parent:[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] -child:[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] //this.addChild(ew2); -child:[Event type="removed" bubbles=true cancelable=false eventPhase=2] -parent:[Event type="removed" bubbles=true cancelable=false eventPhase=3] -child:[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] -child:[Event type="added" bubbles=true cancelable=false eventPhase=2] -child:[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] //this.addChild(ew2); //ew.destroy(); //ew2.destroy(); diff --git a/tests/tests/swfs/avm2/movieclip_displayevents/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents/test.swf index 8d903fa8313f2da8cf3b2343144141e7d38e8bbc..75d19a2c8090e76df4aceeb33958e7131152d4fb 100644 GIT binary patch literal 1926 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 literal 2288 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 J?camxMP*#+ub=<` literal 1852 zcmV-C2gCS7S5qtK4gdgnoUK<+Y#Uh_e{W{qJpYaV|4AGtZsT;*Cb1nS>9z?=liF@K zyG>o3v`u#%*{(g_7#us;lRy!N6`1qn*KObDSAcXoC*?K~cj zE=3a$qI<8WRvzs&YV}8{`kmBn?z(*K*n0gxpx=P$MJXLKl}@N|8HpS>D1>xHhui?9{24(piSi) z&UYecf8)&T1R@R?z9Whl2DE{C^gP;6yy5-j0ier2r~>_0Hh|v!)2E;QWO3#1Mee(M z=#$nTlYe@OKKcMHma~hepMH`%<=*)Kt^9V)zI+G0_O?bZ^yv8>eFV+~RlfJK@Uztj zqdx=s_crH$^y@#Ld^GdntKkoSfzHfVAWDSf)U|}IeI~jAyUGFO#9y7i2i~_@lGM;x zMF*TOVOTQx-e>luzP}Ir`MXk>Nk0>KLo;i^k^23r`K9E{*qhW*4_CZWyP@AZp;83vK zDwU;z>UR%0+LC;Hsqt+^om78vYlO^cj%B)P0*>#i6AEBV?F+ zvaM3%Eh$xNmFtooJ3fRN4O6cyHe*@r+K;c)+DG-$6Z3ZSq$Z{6wIkoiA_}aLEQ4gl zrYc}F>WEq*+K|+SWo=l|hEO?S$z+L1i-95SONW*>i9 zD$5SF1JclSS`*mQS_5ic*H%N8;7ZH26G=n-L;h5=Ap@t>5_gVTHCf7Rt>shAij;31 zSF3d?Uv9RfJWHmXZ-1@Y&X-OOlleo|+GS|%g5K=f4PTJ;%<}jDA1v$Z#@>#V+Cl^B zV~doV4QPSmvMg1Ix&*ITGk140xx%g7=61#jl~fnrskLQzv9&Cjy{%o%M>f;xOnOW` z7k0CSo!!mb8JFrRq_TH+c60YryO}i2Wwx^qGHJIy!s6_<7A)p6chi}irzJu9(vVId zZg}?e?xa{O<{qHEJ7`pBa%5=IZ-fT(VBGllGEjI7a8E8cgc*$S_|S9BkhIr`_jo3T zL8E2!oBck2AUN*F0bg(?fPK26U9@t)i?F0~_Nb|A71ZQl0 z8)oo^M|Oi}3=W6-#vfoVINS!?1BX|e6OK0tNTdSO5t)byn9Ue*7TB^_F%oRB{jl?9 zip;_oqjq9sabaY2V`L+ClNq@<4@M3zMox#_WI;X*rkC1HRy5A0L6+?pXa*3Wm=iFv zV>|4M+?WW6^J9mA_z4UN2qA>A*}^M{+mITEEmo(J*!L}5>CSg>)`vSB;M@RT=q?U$ zp5ZrCJl2hCI1fgGO$4PXRL8Pz)DZz%Vh{x=in4y(F$1*BAPdk41NxQj>VTdw{JM%? z?Y^wjD^-zkGIlnSz6w>c0i+UN?-7euAh@C=lr6L$?5=lk6e(3x6f0G8lvApfD6mpnD*LCQ+fq`ytp!-Jm&4KRtkZ%4zbSHYci|6PHeO;>S-teT=2dIb!?;|h`?-h8; q8ea|&J#s$-f3Vn}FZR&93QsIF^{vh;8ywPh!m5+~1N%2z_Bke;+><8& From d8114a1424a4deae464f34ff4529eff66a65bd25 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 28 Dec 2021 22:14:36 -0500 Subject: [PATCH 03/47] tests: `as3_movieclip_displayevents_timeline` now explicitly winds a clip back and forth to better demonstrate a bug I ran into with frame numbering --- tests/tests/regression_tests.rs | 2 +- .../output.txt | 18 ++++++++++++++++++ .../movieclip_displayevents_timeline/test.fla | Bin 6753 -> 8157 bytes .../movieclip_displayevents_timeline/test.swf | Bin 1871 -> 2513 bytes 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index d270fb98cebf..63b7dfd0092e 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -375,7 +375,7 @@ swf_tests! { (as3_movieclip_dispatchevent, "avm2/movieclip_dispatchevent", 1), (as3_movieclip_displayevents_dblhandler, "avm2/movieclip_displayevents_dblhandler", 4), (as3_movieclip_displayevents_looping, "avm2/movieclip_displayevents_looping", 5), - (as3_movieclip_displayevents_timeline, "avm2/movieclip_displayevents_timeline", 5), + (as3_movieclip_displayevents_timeline, "avm2/movieclip_displayevents_timeline", 7), (as3_movieclip_displayevents_stopped, "avm2/movieclip_displayevents_stopped", 10), (as3_movieclip_displayevents, "avm2/movieclip_displayevents", 9), (as3_movieclip_drawrect, "avm2/movieclip_drawrect", 1), diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_timeline/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_timeline/output.txt index 1095209180b3..e7cd881d7894 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_timeline/output.txt +++ b/tests/tests/swfs/avm2/movieclip_displayevents_timeline/output.txt @@ -63,3 +63,21 @@ orange (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false e green (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 5 //End MainTimeline frame 5 +//MainTimeline Frame 6 +purple constructed +purple (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +purple (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +purple (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline Frame 7 +//this.purple.gotoAndPlay(5) +purple (frame 5):[Event type="added" bubbles=true cancelable=false eventPhase=3] +purple (frame 5):[Event type="added" bubbles=true cancelable=false eventPhase=3] +purple (frame 5):[Event type="added" bubbles=true cancelable=false eventPhase=3] +purple (frame 5):[Event type="added" bubbles=true cancelable=false eventPhase=3] +purple (frame 5):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +purple (frame 5):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +//this.purple.gotoAndPlay(3) +purple (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +purple (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +purple (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +purple (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_timeline/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_timeline/test.fla index 880ce2ff788f84c3c680559dc1e6623bebe742af..8ed648cf40833a8e3529a44df9f1845c09aab5d1 100644 GIT binary patch delta 2984 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 delta 1550 zcmV+p2J!jbKjAcxxqqWt_8|HM0087C000jF002Z!O+;^Fb!}yCbS`*pZ0%ZIZ{j!< zeXrF2;LW~t9w4#vJp+}XDKkjzv=ZIjS&c@kkQnOO#6gak!v6ZTlklBT+DJRy7Wx9Q z?>U!y@3|MtZFx7>UJ^`WOgWgv5l!FEQqorLIiI{&)rW_N=6{3UOxRdOng-P`*H?q! z9>;!z(3JZ$z)Ehlw4iCz50fEo21%^WMv=60R0RZ6#stS5iE%_IZYxk&j-uZ&OG!f8 z3TnEJCblu`^Mv*3C}}Gl2?RQn#6A~9lgQ_zgvD*;4?@G_AyvSS+&tet@PFVC4Cf0A zP;3JTHZ?Gul7A=!y6w2S0%HGr!dBeEmu&g-G#+BsR*GH8@H-B8I-vgKPT-IHC>3r{ zJmZ4^Q``^57a}7fEl}p({AR)hVtOmyUM0z7X|uI<>yL3-wb)~Rj5|U0dAVmqBFyI# z{PDNG*H%1F^So}i*D$-6y@p|SQN!&aqtVed!|_nZvVW~!Zj$H%6u!3LTn2G04lO9YE~8!fJ=R3$!{x$q@82t z;R(OLr2a6H+?-9ZvVoYxW?R$Ug(c~g+)yxP@BfmFNtB4n{Z-R?;3knKCkas#$J(o!J5|a*cG+68K!a(X=gn9)hGk z&wq`UNHI<2-0)>yZWBVEQZZ{lndvk9uIE5Y-O2Q!m3VMjWgM9q6_NC#NUNJ^Y@eO(~b=SpJ}FhB)Oc znV-G;knOBqu0lz8(xIXJiGHT-f^4pCV1HcF5L9^lD!Ws<`NQ$ptt#x^YPZU*4=Awp zbK0WBlI+<}D-{E}d8w=)01pN_R?3TETGOraYN!AC@W(I)CPC z9bw0V&S7?Mwg2SS$C0)N=vY!ed8D<}y?1vRNOosfa`C8^+&pFmivh5@A>FwVEv8ty zx<$QZL>Bb`b57`ZZDBGUMkKxeM8wQt^G&wfd`(IT6#E9`A1pf@5_MTTlKw32Zjmc* zb&CZL52xdzeXEBf!*XOtw$~cS(0>vdDo2KHO`l-}vT5mckx>P*f$BxWb?tIwqjsFl zDrBvu&yH)AAe)YE=vGZ+z07A*GmW){=ONo=$cAe{y>2u#vlQ91jk?i5W%X>h$U<5@ zWZN$58vL~?UPI;UWf<{ebt0EfEsf&!tGl(?Xsf(;vAnP?VXz67g$s=%~ZPu)3 z-PX#Hp;gmo-71eWgvKLrZmB!-F`L1Qf9pH{7qdMEs0a!3oW&_t00011lkN^6MF9W- z01^Nd04e}8000030000C07r6VWo}b>ZDMb101E&@Y;|Q*d2M2EYyb@aPjX>yXJtca za${^|0KTmN0096100FaV55fnt;2UZI3Zq)~Ao>IV0OTi=R2@wM(gl;F9YFyFljR*i z0X&l?9wi&|oW&_t000110000J0000000000000000BnDb6d2nS=O9ci10000D01W_N0{{Rb7XSbN0O(E4 A%K!iX diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_timeline/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_timeline/test.swf index b4d448e871fb4fc862e6894d7fbf55964fed4d69..540e866f03c77b374acb96b803a2eb0c332a0312 100644 GIT binary patch literal 2513 zcmV;?2`=_SS5qst6952soUK@UY+F|u|IW3~J$@zeD~_F~)3{yIB(@Xh(WY!onz(Jc zCQg&|L6~PFPkOee_VtW;AC3;~-ZyY+;#BJ3@jb!q9dM)4h`t0S!ctsvcL1!}`(!|R zv+b4P%k$E&+oaLUPC_6WxU)v=IJSl#OZPLb&t90a9{BQ4|N4v1`maa+{gWBzO5f%X z#!sM+0I}H%m-dB!39+#G!o!+Z0T}|(H8sQKz5X-XNYlkY=-YvJZ`$6y>H6-SPp_nf zKW`KM6utAC<8OKTZI}ARaMuUPZDbP?AHYxzL>8y4jlE-$#3OHP>E*Q1i=d|cR_5A! zceSIBzy8p^RX;}5&Q_}X3L&!5=2{mK5PVDu?)nrzSScWd_|?FfcyA@ah} zcWh(+$fcv_ouRv&7A}_1zPRbVo5p{AJ$ZD~J{V~xv9sMj_>h`z+FPFc=9Wiah5dhk z=b!96<`zCd$`FQ8h@H65{@B7t5L-06&YJ!v=ZZB@m%w!EIlt!Ct}DMcTs>#o1(OHg zI&g?s{Muc&rfyd*owGdzZCmeL{UKyvO}`DpM5O(iC=#3?=;u8FORe-YSR19M#oJMO z6y320a03SM%3$j8i=*L_d>zVjD&=|gCK zx&D(Eb=MD%3158&2GU3XO6(_#2-7~dl_E24DI1i`|8`b$5(~(m!a#ezOul6*mq8$H{|K{d3rZq zjS#uetNl^8o71l${j&qD-}}|w)2}pL+go?-XIP=F=w-r!$gxHqdqcD$)*~Qg^#|tP zA@A{oB*hh0u>!AK2!_-?`~E-S*ushgH|(!f@a2zxX7KW62{xysWNIe5FxNLS7mH8E z7Nvz)T=EsrXkubNhj&inET+?Q9^eR*}?msihydG)sb4=*+93Z9nYsl#)r@Vu1p zsSOjlCg;5phmuqtah5oz5_4f`Mjp483?!x0%Cfx#ilBC4>8xcJ&fdh?#bZkgK4m`s z3+b#>A;qqB4_^@_p;c-~)whKbbMfQSU@Q?{kaE7R5=?E_##R!`3neLZyGk&%q01N1 zq%LBaQmRNSxx6rURzI?IIwlP+#Fi`9ExDF2VMFoO#3eZ$lR7JLSr#>^wMFGtl%`W@ z0!q`RG~G(mqcpuH^%PKfOBq#lGO8w!%5%nY(?sPFhtH=@+bxs2JL>W`*2*f1zi>+_}NV@WTsrdPf>Z!Z1jmK`-EgG;HUfp}yL=cd`;vcssdt9`y; zJmOwYef^}mHcYB({h;m*gSzjXMEB?UcFSLHr9-%Pl!aP0q--N))G{1TNw^wQvD1=* zI7-F`m*OeploH~^aw3+Jb`SSW4K78bsl-Y&x*$#QJd(L<@=P>2HFtWkb83Pk2zMW`I2b2lp!ZVIm?5(vnp z6k7U>!O_X!_{{F{fsvpYODyy4k0n!h4onz=M}{YrF*-0b6dWp-uQQXOnTg4PJwb~+ zG&2|)otPXyI5-&`V&lP)(4pXvHP>QrXhd-q$AhCo!Eswc!n=}6bgF!+2XX!};PrZ~ zMKr(t*K_S$*R|83hKhZsPyH-cQP@;)Ud~y9sSKB|3_XS=h}*(4C!&4`H!)l5^%Xg#A1jJg?ZWONgwO-%GK zaWfOQF!2EiCYSNT;bRMSL%yi9+b}-t<=pIJ*GP;kEhnZ$S z(~L09DAR-(9cT0qqemG1BBMtceT2~|MyDBll+hVRXBnN-w-S8=(YF(QBhfdJM&&>y z$j5hn*5-#}ewO7YQhu1^M@Pkn>T#W@mrx9;b%h&eyu9ZhF`nNuEeiHWmnzF)=%vqQy z8Sl?Z$glYdr&pCeGG{LKs5 zv5XT#48{2}YEZc`dmtmG{g~=7WOV6JCGhH|qn@^j)qI6b8o^-npra}6|AV)-(b^el;PNk{FW2ZW538_hYx#*LPoVduuyoKeY* z)|}zsMqAFP;zoPUaB{<&Gh8TKo)@k`;o5?*Psr32gwd!k2&2(Z5JtmY5Jsc1AdJSQ zf-o9Q1z|KiC|toO!I$=a;R}9aA%4YSSI-r)9y<5uq-h8qKYd%3^Ac zVrs{;^TpJvG)iiUcq}I#suScx(lDvtulS_*YMam?l)bz=L^=Cf<>+Dh(cLI|>NZ0xMmt5RCWRIedWw-x+uxVPrfC(*Z}KlwBI;IC-r$;3b3H+*vc4)^Bo(YpLS z+Z!RYzjkJ{0TBlbKNLj_16o5}dLHe^UUB{E0MMl$mx2DZHK2F=?8z5DT}b>b&;4i@ zeb)Fx{Etu2#~-4FVrJp=i_f-Cxi>yUiQlYPmu{h#UsvgcE6X-N<;vB<%2uIL%T^AhYNaMcduX{) zIFuHjD=Pk6QA^Jim3XeG<+=Y6rAPhg6RFm^UuYE%q()S4SRk}{5Rn+vB#Os35Zr1M zic(JTI|dw0sdaqh8h}cm-KamdUx$kCJU)C-uSV4x{udH=>yZA`af98(fu&wOq?nB&|m$ox5mhJQ{5sRGJZ1tB7)O5iR|h+10>+v)-z&*GhMw@-wm7RkO|> zi$>G6QfQd^@T3ywCY2bzX!+bl%R;kNKYDg1%OizSX@gC7ijB%qYw8(fdP~ea__kDR zjVc|Gg054Wz?xDUQ1#k3Yb^=xbgObAsfcI5pRCtfz$rDvoufvjC2ef3>?P|ZX|Hiy zE?1>JmPb=NH@{PE?iEfB<9mm!w~Nr*Ij!5(Uwp2mrM7qP|3b66s_*Vdp()g$LY7dm zUV|n$F1Dl+QI;4&Gin_z#p6Z;0Hu`N?20*kJDc9lZEUY^rEO4Rh3{6S*@8D-!<63L z%&I=Jo=T-tBg#3K&E$5n>o?MN#g$8DZtrBb?S(D6of52fx;EE0)0`e^s3H7qnfG&JtfL;blgs(-HOD4aUDE9V=)bcR1V z@W9h0?b732p0PntZ&^G>kK5z*`90X{_Dy-QFW{T@1vyNj6q_jLp}dchF-iiIj8hV% z;sg~ZsTiW-1u9;oWQvk7CDYV!iINv6nW2UWYM7*CmXbInU!i1$lCM(y66L=}`D>J4 zqx?E0DN1fq@-ih~r{oqTTa?_UBtyv^O1?qKHYGd8DQpa2<1{t~aX@{UbISIF?JU?n zg6$FzqDb|z!vJS&ejR2OIIKF)2pprzZlI6Z;c)0|Cmb$yPB`8mAdw18M`R)fU^ZgJ znP59(#z?Th*2KyiDKZKpjM|2g$&QiPfsut+4Mt?=oEVL|FtUwW4JPEqV7jQ)U`Bp6 z^|5S6K+}r|#hieV6Xa<<49i zXWY2W0nYXD`OZQg=NW!Y!6Tihit}K^*hG-aLU|O6Nt5UM`D_ld-dr^i-&v@gjxzYL{3v1HolECU2sBUuU(A!$>Y0 z!dNaF!<<|;g@Mf+1}aO&XHq072i2I9V-m{yWBIXIJ`l@~$MV5gej=9V;k%21>gRy# zTyOheiJ@OVBM*8PI?1*u#~`0g)HcW&yONY#o}5pgb`vx4oXH%9K#LsvJKjK+wp9(e zaVnQXr}LYqzg1#KAlA%CA3-cssBM??xO_n_+cFoqwu2c{n&D(dSTkJAnAQw8GcIX{ zhZ!$uhL;&Ln&D%{tY-K@*wPgafbe)v_%hcH_JqNh=m~={*%JmM)Ds5dLQfcsi#=g5 zrh39)ghANKZbDR!fi&5ld)AG>-5X(rI3AXbV8~a!5u+S7ThxxqcJB5&%EoYyg5T@h z?{*aH8v(p_0^UHkU3S%Wak6%CWqg7{;DFRjklOzI@U*P(-Q|Ma)QHw2&VFjHern(B zywXq2&8w-Y;;(Ar86T&3Jzd>}b9DKh?x?2g?d$sbx_h1dzOH{j_gnv=JJ!{WoTDrB zbg8C$&6!f3qay0RnZVS&Vc=n_e@#I2&@B)A2V?)w*t7ErJh;%r585xSaY)@PD^B(& J?camxMP*#+ub=<` From 78700e774b4e63160934535122467d01f4631ea4 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 4 Jan 2022 18:40:21 -0500 Subject: [PATCH 04/47] tests: Fix the test output for `as3_movieclip_displayevents_dblhandler`. The test output for this test is sensitive to where we cut off each frame, because it doesn't stop all of it's handlers at the end of the test. Flash Player will just print lines forever so the end of the test is entirely arbitrary. --- .../output.txt | 5 ++++- .../test.swf | Bin 1100 -> 791 bytes 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_dblhandler/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_dblhandler/output.txt index 24ae1bac383c..26a337b11700 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_dblhandler/output.txt +++ b/tests/tests/swfs/avm2/movieclip_displayevents_dblhandler/output.txt @@ -15,4 +15,7 @@ root exitframe root exitframe 2 root enterframe root enterframe 2 -mc enterframe \ No newline at end of file +mc enterframe +mc exitframe +root exitframe +root exitframe 2 \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_dblhandler/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_dblhandler/test.swf index 2e530d1702aa3ef998a4d1df955c642f12ed1642..6c98d83bb12ca577ce467f05c42c322e39e86bd4 100644 GIT binary patch literal 791 zcmV+y1L*uiS5prt1pokeoQ0H4PZL2H$Df&fnYP=dEiVO8q)71~1{V@9cn||cYCw!& zz@((R?9PTY+m>vXstE^Aeg&_76Fz{^^y0yI@a9n=e1Q7wPHCz^olIu(|Nmy5d3k2{ z6)07J%zFSrU?rCTfMwe0bSAS$SBmq+a=GXqJ#)64C(qo~`p(+i_VXR5cIS}+CnFk; zC9q}lIxoxvbcW|+ga4SC`7u@C=Y`Mbg*HaT(jmi9i#2!m-N)l^`}(~n-k0M~U%x{q znMFi#;#*ZE*ufI&6II9dCP6U%VLAsj8%~DTakqI}qxk7_qV;*C_DegD9!J3bF8EKl-M zp5>Ec+9-n|Mku2)lM+l$F_LDg&PbM#F-ER1GS0|VMy@e(ozY1q7nnT7wA@cJ0OTxlO7__8 z+$JLkXb(^X6v3bXQV&Q7Bm_eO$UUGSP!J3Yp!9%>Kt(VjfZ78L0Yi`%fJs!-{kE}l z>$CBbi~>Y^GZQ9tlS^bX74N9+DzTbPb?A}KB3 zHri#_OP@`gk|MNSbu&#*DbggxJDY7A98BFX2MjY~m|4Tj8Rnp2%2;<{LX-pPtav(x VQ|=Fqi%h_!&p7@O{Q|u}EQLad0phHP&%f-mI-JWe5&CP%%Y#Ycs5}vsB0DB&lM~2Ya|4b+g zhsVUwg-3OHO}rjCrG?w{*Hk1$E=x*TZuI1aD%I3#y)4yLNt%j{m{DjK`$$JVx+Pet ztF`KM@D=VP+}6q9?2UpinZlZQt&(qC+iv&n>YAn)vps(g5AJ4ry)y@kd)Tv&T@6$E z%4B!CU3JIud}L{Or`@E63L&~$ZES8;t6P$?xmxXP$#T73Z?xN6ja6y2Ufb%_!$hx! z#%gU_J2tW9Pt^4Ppf(j6tL?hvIidY=i)yW^JgOMar%YsD@(!TPpqo8c}v z$n|hgsrBW!R6&`-`l{q+nf`qVH$r1I{cRGu5gM!6|EEmeOdLxG?;EPF?`_T4Eu!R0}4daQ|;#9Nmn zP7cAQ09x#LJU(B@(gTtK`x>^eAOkR-mqP=7_3*=24+Z>Mc==iw(W8`(F*6_B=~b-# z_{)nw4)dQsA-}!&_4hx)I9;GFmInU7^9+4}4T{hCJiUL!P{-2GD@9;x;C%isHqfV| z04l-beZZaAM9+l@RPafVcd`>aQa<+l18UE85wUv2#0If&J|gPGa}0Er?%F2=w+!Me z#B6n%&6*lNaFL1Sr0*gP&$_nl3sfAtp*e4AQ>b{&D=4|ZKO}w#XCikD3s<3_aDgG) z`MTHHJJ{aa>~;!B*TYo4BA!nx>}EPocY2X;hWfUHxczW{_}#;AvF6W)^fpZn`Pvb7 z^X(|l$XnbAmWDK+HeO^YUGcYU`njT6yZpZ65+B17Q%aPQCAgTrp9FJ|VIj-G1P{3s zWHOM?LM8_pYM+P90%S^%xeu8|$i4%)CCI%Cx%VLVAQS8o!?1VU!o80Nli*TGkYedK zmjkpJAT_0_kpUUXPG=G$=`l62Y&M&E20zX3LWW{C#xoI4#CSHsT#O45PR6(xVLrz9 zA`BC3Hvi>F`sS0DQa{ya2k8xFH^Ytw$#Bln`NW*KFlRTo*qq%+UQT&BrIM)xlgSoF z(r5=f%Y6Vw1AaFb*wZXc>*JAxK|e3`XQckD)GtW=qSU`9^*MSy1rMTel%Vu4=9WP8 S3d9{-neN!|&G{P<^L0i`eJaoZ From d524f99c0a912300fa499ae43be8e7d3affdbd53 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sun, 23 Jan 2022 19:11:28 -0500 Subject: [PATCH 05/47] tests: Add tests for playing and pausing a movie clip in `enterFrame`, `frameConstructed`, and `exitFrame` --- tests/tests/regression_tests.rs | 3 + .../EventWatcher.as | 37 +++++++ .../MainTimeline.as | 48 +++++++++ .../output.txt | 38 +++++++ .../test.fla | Bin 0 -> 5024 bytes .../test.swf | Bin 0 -> 1651 bytes .../EventWatcher.as | 37 +++++++ .../MainTimeline.as | 47 +++++++++ .../output.txt | 37 +++++++ .../test.fla | Bin 0 -> 5024 bytes .../test.swf | Bin 0 -> 1637 bytes .../EventWatcher.as | 37 +++++++ .../MainTimeline.as | 44 ++++++++ .../output.txt | 32 ++++++ .../test.fla | Bin 0 -> 5024 bytes .../test.swf | Bin 0 -> 1598 bytes .../EventWatcher.as | 38 +++++++ .../movieclip_displayevents_swap/output.txt | 96 ++++++++++++++++++ .../movieclip_displayevents_swap/test.fla | Bin 0 -> 4346 bytes .../movieclip_displayevents_swap/test.swf | Bin 0 -> 1926 bytes 20 files changed, 494 insertions(+) create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/test.swf create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/test.swf create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/test.swf create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_swap/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_swap/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_swap/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_swap/test.swf diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 63b7dfd0092e..9f5297daf026 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -373,7 +373,10 @@ 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_constructframeplay, "avm2/movieclip_displayevents_constructframeplay", 6), (as3_movieclip_displayevents_dblhandler, "avm2/movieclip_displayevents_dblhandler", 4), + (as3_movieclip_displayevents_enterframeplay, "avm2/movieclip_displayevents_enterframeplay", 6), + (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), (as3_movieclip_displayevents_stopped, "avm2/movieclip_displayevents_stopped", 10), diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/EventWatcher.as new file mode 100644 index 000000000000..ebd28f313556 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/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_constructframeplay/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/MainTimeline.as new file mode 100644 index 000000000000..3ee408233f49 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/MainTimeline.as @@ -0,0 +1,48 @@ +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 construct_frame_controller(evt: Event) { + switch (this.invocation) { + case 0: + default: + trace("/// (Stopping root clip in frameConstructed...)"); + this.stop(); + break; + case 1: + case 3: + case 4: + trace("/// (Playing root clip in frameConstructed...)"); + this.play(); + break; + case 5: + trace("/// (Stopping root clip in frameConstructed and flagging event handler for removal...)"); + this.stop(); + this.destroy_me = true; + break; + } + + this.invocation++; + } + + function exit_frame_controller(evt: Event) { + 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_constructframeplay/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/output.txt new file mode 100644 index 000000000000..72e856da4928 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/output.txt @@ -0,0 +1,38 @@ +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] +/// (Stopping root clip in frameConstructed...) +//MainTimeline frame 1 +// symbol_a frame 1 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +/// (Playing root clip in frameConstructed...) +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +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] +/// (Stopping root clip in frameConstructed...) +//MainTimeline frame 2 +// symbol_b frame 1 +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +/// (Playing root clip in frameConstructed...) +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +/// (Playing root clip in frameConstructed...) +//MainTimeline frame 3 +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +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] +/// (Stopping root clip in frameConstructed and flagging event handler for removal...) +//MainTimeline frame 1 +// symbol_a frame 1 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/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_constructframeplay/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..b17ac3f5c4eead808e34ffc7dec32249fd99013e GIT binary patch literal 1651 zcmV-(28{VbS5qrh3;+OloUK+(bJIo`-j%Ff$+BblGmeuGC766bYCB1xZ73xnHo=r& zCNUp}WNc$g;NsZ9RswXUGxX9^r!&3uoKsKy0Z#b~Ds<>S=(WnJNB3RHcI+W^+8H#` zO3(Yg`+hvTtKH{FC?MoJL@3Imv|mIBt#R#kdqUYCi7&*T+==Jc4;JocS9h})cdzM{ z%2r-aKg}l4QCJ3BjJC>JT~ikjYKInV!H!r6WuKv)z|QYan+RhNqBah(7Hjh3k%7fNN<*QwS{y4X3`UlWDc~tald4gA8XBIKk$HE>v2M3 zqLyH5q65Z8vsBg!wmvYRXlcg&UT8p6fxykii;;~|wVto;YPD)zOZJ1A0ZqA42mAdp zB+F_k0EX_hn%0~eu+yGb-!};km^fsdB3nE~wj_2Ll6nkz9Udyx)?TgjLfU8?RJFBQ zbuaKfnZya^=`UUGqe-xtp&c?j{qe=_cy~V@x~uhrM!95E8+CW5M`2fseVCf?scbko zEjq6y!On(DCS%>~6TR%0I}^uMhnCvk>cUW|Qn}7Px5~}xo-uw}x0CvF55LjMhR?1) z4TL!qc+(Ddj@F;88yaL`R1Y*q5*g61LFzyZWWKf6tQy*#?DFQ*0MMvct=l`^P&`Y6-TfsLnbZddmCF zCJ1aAxw&OIb332eEL`7Q-N-0Fuig7rwPnC>rRmN*$mSiLu$oS1(nEGz$ma@M`PKD| z-&PgYa<{kgn|IgpnKa$ZY~=1`(t*w!I_EYVW3rjKoz83qn;KN34aE8QB=pZ_Ac5Bo zj3iv@?3U5k+pE?esm(^iP?EQEF#Rg!+ZuRdc%S;%T;vr`s-_X1nB$ z2oWU`h=zuh2#!XEaWuwZa-L#BIX~rtR0vZNq2e$lQA$QAiBU32$ru&Ksd$Ep6I4{G z7^dPR6{jdUOUX1Pvy^$bK>2yfe?s{L<&%_rO35WkKBMGwO1_|EnUc$td`Za_O1`4x zsuaPLtWlB)IJ*(shSFc*NmS#tAc3N~Sg=9a@|Y9}}!KR#z+QxDD0_UPQ9x*$J}DmJUsQ>~Q|#;cthzAhx_< zOIeOj!PW<;#9{RPan95OxiA6lVN5)o9EVud z-cDUU28O_ohjYoEKQTB`*g&l!McIJ-Br62d=^7iMu$h}hRz!IPVk-vHG?R{+xjAHw zDZeo38IWFQ(h1vEHK$8nYf||Zj(GI>dU;OvT!Ct5oN8yRSyT50ror=^o%?w+CnD=Yk24ss`5tEg65wQr1MU@j z!L1+PurRBfttQ`zJbQfeM6R63zdpWoBKN~Aa4*3uSh0i;tv~_p2i$mfCP-k*X2R9r xwEf@W(EFztcB=0C`@)f&gCEcl34`JiJCu+8y7Ko++&z{*1Os+z{|A{GnH0(dCC>l= literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/EventWatcher.as new file mode 100644 index 000000000000..ebd28f313556 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/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_enterframeplay/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/MainTimeline.as new file mode 100644 index 000000000000..c4aac38f4ac1 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/MainTimeline.as @@ -0,0 +1,47 @@ +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 enter_frame_controller(evt: Event) { + switch (this.invocation) { + case 0: + default: + trace("/// (Stopping root clip in enterFrame...)"); + this.stop(); + break; + case 1: + case 3: + trace("/// (Playing root clip in enterFrame...)"); + this.play(); + break; + case 4: + trace("/// (Stopping root clip in enterFrame and flagging event handler for removal...)"); + this.stop(); + this.destroy_me = true; + break; + } + + this.invocation++; + } + + function exit_frame_controller(evt: Event) { + 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_enterframeplay/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/output.txt new file mode 100644 index 000000000000..6aa6850d48f2 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/output.txt @@ -0,0 +1,37 @@ +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] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Stopping root clip in enterFrame...) +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] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Playing root clip in enterFrame...) +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Stopping root clip in enterFrame...) +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] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Playing root clip in enterFrame...) +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Stopping root clip in enterFrame and flagging event handler for removal...) +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] diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/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_enterframeplay/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..ddc01d195f258d08d2fa87e867ca9e30f3fedc6a GIT binary patch literal 1637 zcmV-r2AcUpS5qq;3;+OloUK;PbJIo?-<7Og$&wTKGtL(gi3tgW*iH(CP)gF+Kp??P z5=uIgjH5U*G2_@lRswXUGaNcSbvo^}r<{7~KfsB9K?R2X8C6a_x^E@hu?N%kfJa{G z_ukw0@p~)nK1V_xq26PJ;ylU(MTF2ISFhJc)WiNnID~E(lfLb+IsiYL>Pk*)p3N4a0M@0cYpd$ ze)Zxl4D0Y9(jnS~z-IMD|B7C!te5tUa;ah@+re0e24)&&-mN2F zs8(QVxonuDoi@)))(0lx4ik@vF0z>}vRSdoj?`i&;Bl~9svVT|7t%`gsAMdbO9!D3 zi6mYyrM+yqjUvHig*J##+T)AOUN;|h{H4lKwV+$2YQ^7}k>59B-D!z-Wx~s6#=Ff5 zZYEqZInc~}x|R7{W5M_;FjDtfOZVuzySLcmTEQ$GSi{|>oz|Y)d14f-UbprPkmZ#h z$auVY+Taq)UN2asBg2!#I`oT>I*7}l zIXQcOJ-eE}wYsp9Re@G__HwCa!DqzuXE&DCJ)N+S$z(GmaB)4Gp{v=I+}GJmsBwqMxfRcttY+_Lva4a!fJ%&xIG>h)_SFjn@WzofnM@|N zi8ZTwa8Rl|*34?v(wHZ$RMFh&E*;a;)04g$7)`k555U`hS+j@_{+Dx2uk32DMjt1;zvA>Iq)c90TK&h z$%nZR?7EVlw^OjaLNvb|wNqQ+sl>@S2iwKS)cIVPcQ{aTJSby!%3eZS(UVCBCy-tA z<)WOcJ?G_ZidcjP4P z5If~ih~S8Jjv_|_9pO2@oB*9{r~bk-NOqL1Fw1QA*e(toPhCF#<2V<_P5^8v%ke4L z_JSYP-p0jYyGU|pI48)!NCSiz&>A4jz}W_fFfiHxQ3l2uAjUwV0s0s?*8r>*u^D&( z0uQzVk8{pYD=>iJR$u^UT7dzKv;qUrT7dzaZ3PA}+6oL{3<67x_oSVI(8AXFk8zKi z+zVjG!!$o5+~Z!RSXSmw<{dwzE^kF0jx|Q3BjUPn1SoJ*?_Lqpn^C zdccpu`DEoC21hDu)B;k~706F=BCwpkVjYUwxe4UN)L%jD^n*0Rqyu(t5;=qF_e?qr z(pyY=#$Mt}tse5pM+eHYvSXACSp#*v}KoCkG^%^MH6IPR;?n_`#!KoU+c!KvJ zuLc1QC43(AsT`Xka)Z0|y01{L!|hx5`ng_r#_S94i^?y5zIm%FA}?}I0*VXpoUGh{ z+Qz-w#+~zaF%TLDw-aurlXgx-&V?33(4LDeh5%dwCp{c6t-7z*?UOqWW_7Z6r}tF8 zbaMApuAa*8oh+ZqgV1yTEcATd5kB_532<$2!_B@+V9WY`Gd%8or8xBAsf3-5+rG7M jwC3P*^O{6KafKbOhkl#?`z3B3uXn(JoxcA8OSpoUJA*c( literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/EventWatcher.as new file mode 100644 index 000000000000..ebd28f313556 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/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_exitframeplay/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/MainTimeline.as new file mode 100644 index 000000000000..7616b725aa86 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/MainTimeline.as @@ -0,0 +1,44 @@ +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.EXIT_FRAME, this.exit_frame_controller); + } + + function exit_frame_controller(evt: Event) { + switch (this.invocation) { + case 0: + default: + trace("/// (Stopping root clip in frameConstructed...)"); + this.stop(); + break; + case 1: + case 3: + case 4: + trace("/// (Playing root clip in frameConstructed...)"); + this.play(); + break; + case 5: + trace("/// (Stopping root clip in frameConstructed and removing event handlers...)"); + this.stop(); + this.destroy_me = true; + break; + } + + this.invocation++; + + if (this.destroy_me) { + this.stop(); + this.destroy(); + this.removeEventListener(Event.EXIT_FRAME, this.exit_frame_controller); + } + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt new file mode 100644 index 000000000000..1fd85462061a --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt @@ -0,0 +1,32 @@ +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] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +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] +//MainTimeline frame 2 +// symbol_b frame 1 +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +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] +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] +//MainTimeline frame 1 +// symbol_a frame 1 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/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_exitframeplay/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..fbfd101c07425fe88ea51bf09102e8acced3a225 GIT binary patch literal 1598 zcmV-E2EqA5S5qsy3jhFkoUK+{bJ|7}-j&dJ_PMgF5;y9^8 zYDkk#%>V{b(_(Nyb}loWX6@?TJsPWm${p8817N`PTPI_*p} z(rUl+owMhr%RWUy4k70;LIEBnTp~g!&b8a^Dd{j6UJA!AhVPe3h0@K{%d4x^^(*P; z%MUj`z4&<)o%rmai&46$)D(FMp|*F)5M;%ick>C#y0d>gZXk?7h}zi8MmSxo>Ybmy zvA=xvGUVNSy#W%d1QZ8`-xGr2hHd~pAs!g#Fc9NEdS0OBv;EzAHCI3<-rsD@3mg)P z0FBUHG_5L4HCL_{*3yRFdTuG&6O|i zu2`>uWwoj_JOe6bl0#(6Lu4yrH*;$*^AR(@Ql)uNEj+Vs)sHGlyjnSMzg;9^I&<`= zWbaE~Ffyi{BpvsaLW72nX5O~=dTZACC#a?$8`H^fLU z#I;V>Ej1XaF_)J{3#HO6Hcb~Bl>;?2%k_ zp;nF*Q{o@s;}AMz50R%28WmN!yScU#ua}ga#$mZ!Rd!ee&Cb|-Qf}@Pj`o*#_F3(V zQ2Sh`8|FioV>K~SVX~bs-rrhRulBbxQfLZ>mMG7gm2(si8x0T`#p4#%?8$qXL0TGusd1nPh@) zC%00cB@^z>9gI_3rZU-1-b*C6Jq-mCQ3m|H*ZljRQOKWHj?^d|@_bsY9~@L_U&@Vo zU6t8Fa-}94me5>yTn~$?Qi?<(3zjCRMhv6-u;zcWVczfl4@YvLR+5ckFjXTLc@Jdp zax~e3{^-DGMD9HK-hN^C-59RBJWO|axbDg@-4&Z(@H_pkfM?9<#{u6M4g@(&7APi^ zlPK?|f|n8>75$WqQ4*jeNXa-Q6I7g}Vu*@osOY8Q6cuGk&QcPlWR8+~iWewt>NH9c$%@$WidVmT_>y~X?a|p)XF3k;&c}SXF9;mz*Gl# z7?3-_%fQ(V@G&sm0e%K%I$(@}a0jql#IECUa6Hj-Jj>~mJ;wk-J;wmf^c(}2>Ny4= z_Z$N_+j9(Hy5|_c3^=y3x<|DbxE8W=@2WlS)?NTT9?Wd4;AZXZ6x$sut!ugsLbqqV zI>#F83`6&&FsGGWDKCNALr)x?R7P3WtlSRXVt4$&fvuDE<~njpTM&{}_rMc$gEhsg zrOqMUC%pi%9t7!4CLPyO^GKhNeqquONE1wY#?YP8<_aUaEIo()))7L`#j@j#?h2z< z;{>5Fl5PXRW>~rgv_FhZf|H^E$HKe`c}WHs2wO~Ok>It|C&PjX1&L!Th}^`3c3a4_ z+i?53dw$n$>oeN9bmS#2th+=8P!MX(pS`DjlaLe-OcYVD6qZpKM!bOQ;%W?LjV8( literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_swap/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_swap/EventWatcher.as new file mode 100644 index 000000000000..79c18a2765e2 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_swap/EventWatcher.as @@ -0,0 +1,38 @@ +package { + import flash.display.MovieClip; + import flash.events.Event; + + public class EventWatcher extends MovieClip { + public function EventWatcher(name: String) { + super(); + this.name = name; + 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_swap/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_swap/output.txt new file mode 100644 index 000000000000..8289117b92ac --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_swap/output.txt @@ -0,0 +1,96 @@ +//MainTimeline frame 1 +//var ew = new EventWatcher('ew'); +//this.addChild(ew); +ew (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +ew (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//End MainTimeline frame 1 +ew (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +ew (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +//this.removeChild(ew); +ew (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +ew (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +//ew.destroy(); +//System.gc(); +//End MainTimeline frame 3 +//MainTimeline frame 4 +//ew = new EventWatcher('parent'); +//var ew2 = new EventWatcher('child'); +//ew.addChild(ew2); +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=3] +//End MainTimeline frame 4 +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 5 +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 6 +//this.addChild(ew); +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//End MainTimeline frame 6 +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 7 +//ew.removeChild(ew2); +child (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +//End MainTimeline frame 7 +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 8 +//ew.addChild(ew2); +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//End MainTimeline frame 8 +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 9 +//this.removeChild(ew); +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(ew); +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(ew2); +child (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(ew2); +//ew.destroy(); +//ew2.destroy(); +//System.gc(); +//End MainTimeline frame 9 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_swap/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_swap/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..fbeda00a94a6be2dfb63aa2df4fa9cb76ea62378 GIT binary patch literal 4346 zcmbtYcT`j9(+*NYlPVz10HS~aAs}6Z1QewAqSOS41_(&+UD}T>Qlj)CEr5UsEGW{e z2vS6PqCy0uDOJ9(uDb47_n&X>nRD-b-+AVpbI+VP&vSLJlajFj08{|LW|fFOHyxZ5 z2mk<%owx*WN8E82^|nXp>g$-AfuROcy1#@IBYxO%xTd;_zOufV*zco`6Kkm&DudOv z)&3)lkr;;dutg#7IJzU8&?p;XA%BIRprZP-)B}zP5iK$RV4n*BI7tkL>1e@R>^z(h z&cuqHP}61>E(4^$tsIS(~n?Y4u!*xtf4{~16uK*s@A{< zG(v16xdXo?ztWK6ttn^8)!TMiYnClk=*s6!ewGjg zR_2kV`+7!ld$BuBw@ZR`RV}*D)|XSu&SDvVC5LS{x6eCI06i&LlnV}6&sWD3GMT2% z7w&i8Oa!uH#~5?mNU1zoEO zW7g`1Mo&^%oWX&fa3k?QNXEVMWV!)W`Yp7fpIHWf|5tydQ7U15BAM44tkQ zk?pWhd0cC=59{Wpgxg+^8;q`vFl{?kxzv)Y?R#I|kRx^|2+y&2<{kLROfT}l$V9i0 zBv6izlO>Jm8Fh<*QsgoRrH@R`drrB#?Fdk6|3BrWSo(<_p| zv%|s&fsYD4x5o!U?2H92L+;Hn8%H;mC6mf~EW9gzYoyhJE*5>zzOTg8=KJ(*{SY8G z-%w_Cyz%LDz5~KJfhS*fyI->SVb!}@2%*li?T@k9?MZbdh~PG}{VRr#fm05jJ1H6* zWFoZ|`zIu|)3r9aha@)py(M+huM%4QdjqFtns2L7wt2qZ9BUXqI5juCKloufP<9lB zGq`4ksr`x-$rWk!mNpD#@zM{C1)HHC8J#=iL6@F7n|uO89-%e^y0Uo${khU1G-tBVQVRT@B;oqj+&%d?byWX=qwPSs9}go zxeinln8W!J6%*G^%hz!+i*J#%y8#ro7m1Qi%FUG;g>B1C5 z_*3GrVkSa#zs)uSgu6S^+2PJHpu_CQWkHVV=8_!h)Y`)ap^M4qsk$_V!Hxr@*q~eM8n8;WI3bmgss(LzMrmfk&`*D9NsxIm1bE-CCw#?^F!C^8=9sA-kqZ zSqMGdik!b=9;B8o4Dvi8W=_V9zJ@M?|GkRpndyikzxFeg@#$eK%3keU1+}dF-Kc0+ z%w~!|WPD0*uF20v=Q(y_CIJcoEqvBYMSPBwfvA31;W(jZu@I%Q<)jY4J(O|d+pC{@ zg37(rano~|>cknZj-)U;G?cx^$rWc!iIN52S{gk2RP$AGGFm3*1$~pVw-52PKGT2@_(}%vg)4RLRIHd>lQ3$!(t!BEjV2OBjm4#e~Kk!mfvwGr=Xat2WUIRerwB+z1flx#i7Cab|1rX&-ID{y`l*w z$B?a&mu^j%iaFjaM&@#Xt;rQ3SEE?wLv|rulShYRUaY;3x}W)OfSTN#tS&v060LDN z3eLo}>02GSi1^w*qDKtq_`jdLv7K#T$wg z484#|o$1!TLsoHzi)KlpjGV6kV;F8pgTTp$v!8wSj#>r0wHg*{(4&rvS_{?K8IsbV z3Zlt8G=P?dfC4ofw>06r!E@1w6>GsLq^7jp>At%AG8NG{v(TANnVYfqQqAm^BVgWS zgXj6lizC-QQ45w-q#W9PLV9Mu@X6?4^b>r1u`eCe^e$I4P7QpcCF!?RVJkoYp1*tdGy)xRp27osO(~6 zefLXkel-c_(U5lmRWtT1iuvR%-mDf%wvDB0%HVb2LZ8BU97~zW#cl8wS-HF}s3e~G zV94jXRu8~usMeIT(R9ZG?Gqhu zyzWvg5sBaMhnjJvM$p;s-G4JF9srV1xMWSE?6@`~Vb*cu8ql&>OyC^a*#*}UB1b92 zCYd2J6;m|fb{Wb@P|#sC#pY?D;vIORyP(}V;o+JP`X>i0M=FT7&p2Nb9<+P50mF^8 zfTp>Nq?sd`V{H37)5VZnDE3g3VMWp=NYTmsxi3K~cZ}X|TN#5&cg}4am|h7i4d+cl zHC(KmDZi<@r(IwyBpj^*xXxnS2Pjuwt(Jxq%*f)OB}D|s-)M;uo?khDb=gHsp0J!r zar1_aUxss4I<4vtEO-D1xs@qf5~mO8>wO|3jFZsxa8c<@vDY;>`+W(I#hCE&ovrgL zUnf`>^QA3cK1q!DL{8X;JzvIQZcq-?k0U)muH^YcDKcJpc}_#K^HXi?>yAPq8;RxZ z88sm_`}GNkHL;!p6L~B)sV0VP%kO^k(b+4Bq>khYx>b1|{l=+oyYmJHouhEe3)s_t4?M21|=%!p!R{ZqDfE>mO@1>jas(R%Dd94 zy=<9(-Ya<$QqOt7!#2BJG1Ra#j==kp2h6>oSCjPf%l6`>Cbv|aZ#dnrmmG8k^+o6$ zm+_5F?Tz~#)jlv8Ozed+ikQoC(3`g_uW>CJ&Ny#=c?x~9mKs*()mRwhT1v6ayjHw9 zH*wY6=}uf;Z@Yi$k=0p0Ux zy8m(5v1I*b$1s1Q|BHbAcIxjW>|c1|t&HgZ5VYUV{v8Yb2|i2yw~~M5q`#j3PgeRf zg()$`zi`z5s^NPheM^!+_wU{M>u3LGzy2(sm5BeB?)_fC_x~0D?9rbIuG9bQSl#R7 T6vsQ%#4GUx01!jm0|5RH!Hp1g literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_swap/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_swap/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..75d19a2c8090e76df4aceeb33958e7131152d4fb GIT binary patch literal 1926 zcmV;12YL8IS5qqu5dZ*qoTXOzUgO9S?v`z}@7uC5Fc|P~ER1E$4Vm2`;34b|;{>xi zvl|E&whY?wwUU5gHpgu4j~}J<;hz{iRz*cUD_4ZALqVz?OI5KV)kMCdEz3exTzZgI z=0R4=53*W$kk#sgtkxc6wf-QhjR#q6F8mLxUM-tfWvO;ClD!sd>MKDlUWzi`3*6wL zT&6@_rPz#_Sf8;f3q|qFm=E?%D584R2=}Q*6FZ8hfQ~HdajkmSQ>BVm+GC}GK+VL=dT4hA>JgOCTei)4LCO|-ptN#hk0JTl$4ZED(zlMmC~Ge zGrw(bqd3oJYo)}X$b%Eg3{5CA*lBsF({j{IQ5LK9Yq6W9t4HDEdGRJ??%3S?Hj_+G zUaD$ii|2(>{aj2H>s5XyzszUS={5fRN~)+*%|)lKRH>qbXaNYtqNpg+xm1zV+jdci z${V%bXcwa_*JZ_Pg14$D*My2`Sq55BR-6=Fi1n&Tdr_&M3l-^|pi1?ci|VRkNfI3N zz9y=k&Rwb`S55u~^amt*(SdacAMMg&UmcqI>R_j}p-yY} zC$Tn|Z+$4=I%h1jzpsa`b$xJ{jiF&S?&sSW%(pp|Z!_}oGZV7*>x;?sJcI5JyJ=P6 zf#L=K=Q_?8WvQV~-xIU%ACp$U@4pJ()7Kk;k2;AP+<+`?)~5$sC%g5Mcp_hw%N6lN z&qFb<%1v205w5G5ld9hEMQHdlvmt5kogDr@-rL)~eUK6qYYq0pW=z@>b9A@d#Vc9w zA!DzY`7KxW<#G1t?D^5oVb%|OXi&V6pvPfN&g|=hV>)Ns+1tzRd5!DYaqcXCytAJT z7*l7vxtIClqc3-lvwP$ydzkwwyB9P^aLyf4WA-TfaxZ%nq7~W~XP(2HmkV)`STq`n zO-HdUYFo9haqHX$x5;gB+uYB%r`)I9XWTPxhx<9V%k6Pl?m4&5{enB-KIgvRUc{sE z!}!a1F8<5-ui{6R83%S+SeM)5wfY!;AQ%cqxM*x7J~}r3Xd*Fbo0?8Oo|&D)c!^*) zVSL0ACRUE%7{McijT3g1uw#TBC+s7_P7pRh*h#`p5j;)oNrE2}JVWp-!HWbhJ7zE$ zJtp`|$0BwtV}ct5e@C!F7?oJBi1nISZ;16R!QT`7dxGDC#Sb8V1o;!lpF#ct@>h_* zf&3lhAJ{R?1nFBg17ZQOg4jS<5CWpV!aG2mAoLYo7x;SK! zrBfIjh=8pfEFBnGoETYM7}?wyu^xC^DyTx-6Gb79=H0Qf||v1+IO#n|V5d}(X4pj^i-CFAMXDGi;#bJYdg_46JiVW_& z!Ci>uMo`lY_$wWIfYYky{L0{b)q36K{JN9#H{G0nO=&@SqAOX0`qZF?SX!CQ#j!#E zn>M|zyOgt5p}Q1T*Dn})p>^I3yU<-qgf69M!~_?jyF4*mN-eSLQl>66{wQ_2Xgk@v zPM0mI>vY=d6sJz#ww)Zh)4#Cc^`=!Bw$UG-VwG-(&KsedVQ4&Ujjw$?e)D*Ops4AJ zkZu8rNc+4vdR{TWbsfjG+!$((LWa%|WcaC;)(+6=cuQ{LB+|+xiM6sl$!KLq(xR1} zNm!pN2`h9bS*`3zLOpnscCGBojR%cGa4}H3a0ntQJW3ZP(uG92Fqtk)r3=&Pf)#$R z(K!8FT3WZw7`V8*)$U;!r)#41uE}cYf8*~F3;S?@ns)7{%Vg7`<$}m4X0HXzl3?c6 z&3=pAP0wjqD<>C!cc+yf-!1;(?x#C_abB?X>BaaR*h0lL16qM8&uHa9ZkA~Vbuedw zkPhZe5Z1vbCWz=@!33NR7EKV Date: Sun, 23 Jan 2022 22:04:30 -0500 Subject: [PATCH 06/47] tests: Oops, forgot to recompile the exitframe play test. --- .../MainTimeline.as | 6 +++--- .../output.txt | 6 ++++++ .../test.swf | Bin 1598 -> 1590 bytes 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/MainTimeline.as index 7616b725aa86..fd13169850f5 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/MainTimeline.as +++ b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/MainTimeline.as @@ -16,17 +16,17 @@ switch (this.invocation) { case 0: default: - trace("/// (Stopping root clip in frameConstructed...)"); + trace("/// (Stopping root clip in exitFrame...)"); this.stop(); break; case 1: case 3: case 4: - trace("/// (Playing root clip in frameConstructed...)"); + trace("/// (Playing root clip in exitFrame...)"); this.play(); break; case 5: - trace("/// (Stopping root clip in frameConstructed and removing event handlers...)"); + trace("/// (Stopping root clip in exitFrame and removing event handlers...)"); this.stop(); this.destroy_me = true; break; diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt index 1fd85462061a..c001523eb1bf 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt +++ b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt @@ -4,9 +4,11 @@ root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false ev //MainTimeline frame 1 // symbol_a frame 1 root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Stopping root clip in exitFrame...) root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Playing root clip in exitFrame...) 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] @@ -15,13 +17,16 @@ root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false ev //MainTimeline frame 2 // symbol_b frame 1 root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Stopping root clip in exitFrame...) root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Playing root clip in exitFrame...) root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] 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] +/// (Playing root clip in exitFrame...) 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] @@ -30,3 +35,4 @@ root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false ev //MainTimeline frame 1 // symbol_a frame 1 root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Stopping root clip in exitFrame and removing event handlers...) diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/test.swf index fbfd101c07425fe88ea51bf09102e8acced3a225..5dab084d546fc223b01074dc7e6b9101d6278f6b 100644 GIT binary patch literal 1590 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 From 4d6164331dfea5bd2192cc6a0fcd2593a4e338de Mon Sep 17 00:00:00 2001 From: David Wendt Date: Mon, 24 Jan 2022 20:45:28 -0500 Subject: [PATCH 07/47] tests: `as3_movieclip_displayevents_xyzframeplay` tests should also list what children are on the timeline --- .../MainTimeline.as | 16 ++++++++++++++++ .../output.txt | 12 ++++++++++++ .../test.swf | Bin 1651 -> 1920 bytes .../MainTimeline.as | 16 ++++++++++++++++ .../output.txt | 11 +++++++++++ .../test.swf | Bin 1637 -> 1909 bytes .../MainTimeline.as | 15 +++++++++++++++ .../output.txt | 6 ++++++ .../test.swf | Bin 1590 -> 1855 bytes 9 files changed, 76 insertions(+) diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/MainTimeline.as index 3ee408233f49..d6f13e3b7221 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/MainTimeline.as +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/MainTimeline.as @@ -12,6 +12,19 @@ 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) { switch (this.invocation) { @@ -34,9 +47,12 @@ } this.invocation++; + this.inspect(); } function exit_frame_controller(evt: Event) { + this.inspect(); + if (this.destroy_me) { this.stop(); this.destroy(); diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/output.txt index 72e856da4928..a3879e440950 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/output.txt +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/output.txt @@ -2,37 +2,49 @@ 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] /// (Stopping root clip in frameConstructed...) +///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="enterFrame" bubbles=false cancelable=false eventPhase=2] root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] /// (Playing root clip in frameConstructed...) +///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] /// (Stopping root clip in frameConstructed...) +///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 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] /// (Playing root clip in frameConstructed...) +///Children: symbol_b 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] /// (Playing root clip in frameConstructed...) +///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] /// (Stopping root clip in frameConstructed and flagging event handler for removal...) +///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 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_constructframeplay/test.swf index b17ac3f5c4eead808e34ffc7dec32249fd99013e..f2dc8273730d70f23a29a4f303e14fc5e4166bf1 100644 GIT binary patch literal 1920 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 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/MainTimeline.as index c4aac38f4ac1..6520c05a3698 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/MainTimeline.as +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/MainTimeline.as @@ -12,6 +12,19 @@ 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) { @@ -33,9 +46,12 @@ } this.invocation++; + this.inspect(); } function exit_frame_controller(evt: Event) { + this.inspect(); + if (this.destroy_me) { this.stop(); this.destroy(); diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/output.txt index 6aa6850d48f2..e4215d89f0e1 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/output.txt +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/output.txt @@ -4,34 +4,45 @@ root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false ev //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] /// (Stopping root clip in enterFrame...) +///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 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] /// (Playing root clip in enterFrame...) +///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 root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] /// (Stopping root clip in enterFrame...) +///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 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] /// (Playing root clip in enterFrame...) +///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] /// (Stopping root clip in enterFrame and flagging event handler for removal...) +///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 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_enterframeplay/test.swf index ddc01d195f258d08d2fa87e867ca9e30f3fedc6a..844cb4076ce592e9648b287caea31d7cf9f3cf4b 100644 GIT binary patch literal 1909 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 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/MainTimeline.as index fd13169850f5..429f2f78d8d7 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/MainTimeline.as +++ b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/MainTimeline.as @@ -12,7 +12,22 @@ 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 exit_frame_controller(evt: Event) { + this.inspect(); + switch (this.invocation) { case 0: default: diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt index c001523eb1bf..368d79003de7 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt +++ b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/output.txt @@ -4,10 +4,12 @@ root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false ev //MainTimeline frame 1 // symbol_a frame 1 root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a /// (Stopping root clip in exitFrame...) root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] 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 /// (Playing root clip in exitFrame...) root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] @@ -17,15 +19,18 @@ root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false ev //MainTimeline frame 2 // symbol_b frame 1 root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b /// (Stopping root clip in exitFrame...) root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] 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 /// (Playing root clip in exitFrame...) root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] 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 /// (Playing root clip in exitFrame...) root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] @@ -35,4 +40,5 @@ root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false ev //MainTimeline frame 1 // symbol_a frame 1 root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_a /// (Stopping root clip in exitFrame and removing event handlers...) diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_exitframeplay/test.swf index 5dab084d546fc223b01074dc7e6b9101d6278f6b..b20ca22f6a09e135c21df581456767e662ecd6a2 100644 GIT binary patch literal 1855 zcmV-F2f+A4S5qs34FCXmoUK=1SKCGwpOLH?$u_q97cdY65d;!q8)(w4v)hK+CM6BH zi=98ag=377i@L^kY(blzv*&bq*rz=`XJ7W2r+w-d=u^Ie0=vn_h=b zgC`pgzkITueN?&=M=v8Du*E1})@quvj8HqgYzub9VtC^#v>V+0&+{h27=);e!>olX zaL0J~-CsRFoc}Nt-ne)G5=jOX2Lu032!;o`5BMbsK|7B@5&K8zd(?Vyv|q0lOXy|z zxtFoPPeyT2Bea8N4XtGqE7ejeZ`-XEmlHivrCB=Cmgj!Wq$e8Bo@h1WX~`%bYRyDH z@Pb|IFs?CCORzO#1I9+PRMv{NJ~*IgX~uCQJRmv%;%5ED_-0A374##ms@JqcKL`(K z^jfQ-m5tc}q4u>7&a>Ex<$4XKt5&sUXu!mYe28pih-_8trbFtbW5fyiKyNjwr5Dm> z{Y2N&RlN~>H*>@x^Y+K->C1^=r-61N_xAIP-No&8_T75zq+Tu=dcEfEj3^#yw3CO( z(9j(RR-DJGU{iC6M6By-yyt4FQxdKkwAAh^%f8aV!8+^a%T2vuObr`$6>M(*OK`+* z2b+QHIPs2ToJ2X=z(&o`zzah^(Hu#1K%WNJAq(JnzR}bT?bD6aPP%@e?KF=om8!PG zJZN>=)>oC*PU+-mW#@>kK^fMd*jW{)B8x01b|_4?^Z9Q#*S&lFOBye=1lvkf7M#p^ z%g4iz!cbtB~C;u5YhxW@SjKJ^GQ}GGLo%y0gzV3XV=#%Ve?{pWPMrrJ5Ly#+jNY{c6KY1-3~Q12t*s;`Ay^RuT_X& zEFbFC0|;5LJ6Lyrp&4n`T{8kdvsIHbhlbHeB@(5B`o0z~*N+lw`PIZqGI=+#f2>yx zy*4`VlBIetS$I(H6p1=099~e}p^(b_mKL$Y6J9v6-TYflXHFy!r#1ZFh4RZo4wfc4fHj>M+~YNK}Z*(coBkRF2}Y z=qMhG2{9onuE%1rXzW4klh{V=VeHe`BOVi&Qfxnl6guND7i`TEy^!Z{x;>~luuCd z9wm1vd7qNsQSt#LDN629@_S1DK*@)cd?ZCNB^ha+qhyPcZAuD3=g*h@@AAm$v)ctN zrr$!3ogkz>jT>$c(|Vb91a2SPen-o5yy!w4c7a~tC5i+d&H#jBL`955NsuJuk=%^S z!x}Fe#ZXZToKSm=mM!o<>{vd`E0XX7DJdZh;QNjYa6~K}Ub3r(WNN(Ot!ifXe z+@6S;+zly@})=57#p^<@^r0%cM01LtIzH0*1N6m&+D0lNJRAOEhy7SrX_7 z&$&G+=saffEnYz$%exz5o~@plmC3WEJ7=%Xav^MufGuS{J_lPr%p;q7xH4r{NbVYE z1sIs_fFJ`(2ZR`y>3}c;vmFp&;Ccr{8BjZ5l!3VpV6li@;usK5^oZvJrsMq ztC#mJH@NQEjaVF8SXqVD52&133FaaMat~|b?S$fIQL}V=d6&n#4?`i{GpDcL;x#0{ z#UEp6(p+!}Tk`3Dt)Pld-^g>|Dx~^ieF2}ow!-H@C|E1<>b$bJw0U;M%q~=XcKYVR ztlW%TwAade-*G@S$*SNpGzq!P`H;K`^Gen%82^zK!F4lt3t6iC zJ)>IyX`V?J&D;{QZp!~+(j|~SX42cXZQPtMjaUi!8#p$ffKL#g_qC;{=sZRcQjz=# zC|D26AA)*L#g2lL69DH`-hsTV0KB2P9O#k*0B@;+0|l95Gl<;8<91spwA=9bOZWO4 zM7v_%d|mPW^Ue81$t&_AXT4`uMuOuo#~s_tyJk*A*89B$fYtv1(&FP_?PU9feRBEK z!YnNIHu|sR&o2LTC6}+{f4=YHo^ey%N|L~qRnkYHd3)F6 t(7OjiQ1tKg@cqKU2KJIfKyjCS!A$=9{*T|{?l;Un7_d*Ap8(O8{9@0-m}me1 literal 1590 zcmV-62FdwDS5qsd3jhFkoUK+(bJ|82-j&d<_%h^Wmq* zUo@+C;^;K!1YL}>Wu>af3kbCW3#K4176R)}P~MmS{c#;(3_{ex0XD+ry`tUu@f+uh zmoK7$^;fq+VwZs8VB&X#V7Q^1fKQ1Z#%T=1$PfPKsBwI-Q`;|;&}raj2lE0y3B`d% z=q{Sjl!jKQ?3b3arrt_nA<-38>ZJo^Vd~#hx}r$BsZ_PkOImqPsV91Y3-lU$afOK* zg2{yYl(l-PtQ1V%*GDuI?dUMjC)x$a_1bY{qoh`I>VdMaR+U6AnCN4arz*tB(kPT` zRhYTIuhjj0DpryMWQzl2OJXN;dpC2pmEW$~INUEC+c#=WRaxCv4}EVIiCE5Dy(u|+ z(ihB(X*)?*uYa-A$Iio!L#;Mz<&vh>s*d)I!hsSTn6l+~(Yh@Orb{l780mxApg`v{!?k)D1E!WjUEjno0d6Jo(he}!Vm`SFfDpsEElvN;$^{!Vn1)|W@ zreaA#ef%nf4%tKG*~7Z3DRaJ|&&2-GL%3^#Bx*o72=|x-_(<>ws{TUB>_}bR7d2?>Yt`cO3(`*mVqG zqU#vIBsjLSx+nA`xEAu$|5SV2sl5PtJWO-2f?KtBQtWgson1E^5V|uTFgVs&PYk** z#W=m<%>)S49(v+xr!vH{X61JAHmB=*4(57TZ*Cxuv;iU64L`g=H(65xdS(V0LFqY& zjR;6TX3`NoGmDH-=@%xAf;7dX7fju8eY)f}Wa(=-S~U@ZE>>Kx4Q~v+93cqBkhBH_ zd&1InphGci5uB6&I2_|G$V)Q7aLi^wn*__!7>fxO6eNyW5V_I&t(K5$wcz%sbA8)t z8I$^@*A>@Kf4qEEa*4di8B==2?TdhoX*0?hJtHDxwp$SB#w93-n}b?P<^oEe-7+vs zi>;2KbNTJFwR5@WT)uvG=Ugs9R~<{x)$4}vPb*4*>j4+-bk+{Ktg|=#)8^NQLvNle ofav{z!Wox?kI5+s0&$g{a>stX`PVbtIp^+x0y_r(4eLx Date: Mon, 24 Jan 2022 20:46:56 -0500 Subject: [PATCH 08/47] tests: `as3_movieclip_displayevents_looping` should have a `RemoveObject` in it --- .../EventWatcher.as | 5 +++ .../output.txt | 34 +++++++++++------- .../movieclip_displayevents_looping/test.fla | Bin 6744 -> 6821 bytes .../movieclip_displayevents_looping/test.swf | Bin 2310 -> 2475 bytes 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_looping/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_looping/EventWatcher.as index 4f8c11190771..12e7a50710e9 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_looping/EventWatcher.as +++ b/tests/tests/swfs/avm2/movieclip_displayevents_looping/EventWatcher.as @@ -25,6 +25,11 @@ } public function destroy() { + this.addEventListener(Event.EXIT_FRAME, this.delayed_destroy); + } + + public function delayed_destroy(evt: Event) { + this.removeEventListener(Event.EXIT_FRAME, this.delayed_destroy); this.removeEventListener(Event.ENTER_FRAME, this.trace_event); this.removeEventListener(Event.EXIT_FRAME, this.trace_event); this.removeEventListener(Event.ADDED, this.trace_event); diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_looping/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_looping/output.txt index 279360d30f3e..307cd61606cb 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_looping/output.txt +++ b/tests/tests/swfs/avm2/movieclip_displayevents_looping/output.txt @@ -20,36 +20,44 @@ blue (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eve green (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] blue (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] green (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -blue (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +blue (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] orange constructed orange (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] orange (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] green (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] -blue (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +blue (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 3 -//BlueSymbol frame 1... +//BlueSymbol frame 3... //OrangeCircle frame 1... green (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -blue (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +blue (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -green (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -blue (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +blue (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +blue (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +blue (frame 4):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -green (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] -blue (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +blue (frame 4):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 4 -//BlueSymbol frame 2... -green (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -blue (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +//BlueSymbol frame 4... +blue (frame 4):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] -green (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] blue (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] -green (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +blue (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +blue (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +green constructed +green (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +blue (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +green (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] blue (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +green (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 5 //End MainTimeline frame 5 //BlueSymbol frame 1... +//GreenSymbol frame 1... +blue (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +orange (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +green (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_looping/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_looping/test.fla index 511c3c87d69ccfec0bc79587fef857ff255c7b18..633c609303cd3d57fce6101285f19a7316ac61a2 100644 GIT binary patch delta 2375 zcmV-N3ApyyG^I6=xqp^kHW=ju002`b000jF002Z!O+;^Fb!}yCbS`*pZ0%ZIZ`(E$ zeGicTz-cetgDsN!?(6_|6t@PFCV;c8Ls1N}Ogro(%An}R-mf1i$zQST*b%U%tDHR8 zyu9aJ-Fpu&9H!;p-uOv4iwP589!D&FJ5Om_dk|v!R@WaNAAg&VMl<0P9Ycupk2lwY z@PWiZgR)cvEF@a)wenzTGZ-a9(hQSWpN}Ku=js{=XPirpdm597GSb$N^c+XO6Q0t9 zwKd%IT)7l-5{QKN**Ixy9R&nBjK+bGMAIk`Di556x44}OiJ0EWx7SHBUHLq*-31ep?lbmy5R*=reO~Pu(};-0 zl)U?`@3%GIhrZwK_8M0As@E{BE^c@|Y&JRuG+iHeY=6h@;4<}XVFQILw8WTbL5l2O>E0c}gARzF1WjuXQ6GmPMpA=qU=*ucm@_F;xw z9rQ}J-cf?=e%1)mXZ3o(bywx+v=73sCwP%vii|5A)el*rEg8N!}?ts*FB z08IxZlI?$hc!OlD;@%g+b}-o^0x3;0Z);Eke}9vOOs|a0bFh1mWdocF-z6l2vl9}63R~Lm<^!J^#yTP3!tU%RQlLXJi4tij!c)QD;T|E z1>^szf`ObGg7B=B4F6*xt*ymBbD7mzueDyn@j|WRSFClT)_Se=A3^K6_Yn=X`7LMJ zQc1S<&057oUfwF3U!RT!sypRXP6gu?Pk#loo(lC;_z|?8dsmwZJ57}x*H4?uJ67Nu zan<7ke19$VAB_+56^{=~j*s)R^E2^4(`K%c=7^+%CyO`AlC7%)dC%%Z{V99PR#;P! zOxJr0Tp6Tk`2bgJ1ok{cJp)g9)iW>$`pyol+`FEE2Y~99`o=S`rGFp1 zD$78!E4q?BD;}XAEC# zv)$!3B_&Yo8_<7-%0~ZScu(HYx5C^&^pyWA7p(1feH?DKU@g8IoSIdUyIpxS^MYbHXYBq3LKbs!5F|2qZIc4XD zL^j-NN@lRg+4v)~1V2n0~kNz9XJ4kLf&2LS*902lxg00#g%000030000D z08esZZf9jfX>wz1WdIBSM{;FlZc}+}VsC5!3jjiFb!Ag|ZDMb10KTmN0000000961 z00IC20000008mQ<1QY-Q2nYaCm@rahOS8lP0{{Rh4gdfa0000?NkURVQduuTY;|Q* zd2N4UZ)`4jZEWpVTW{Jh6n?MN|B!kw-2=H0%B2gHD3_^H*(T9xovLaIi2 zv>(3{2NEDjFO$kPX?Z~Se8=bV`S^?C^ga$pQ8;G7mBgX83Ii(6SAw+BOv?GWVJw$R zeQE2APmQW+TE^}0dgRS;=vD|7(xo0o$*zBN2Nk;OvoY2^78ES};D`;bcsRykxonGo!^kyWqRX8o+*Xe7vIO1>}fl@IY^4-Ova;`m6@97%sd z43V)~!5V10S(^$P^A?;#i~(0jH4YwO-otY_>r;0e#JN>B>u?ZId5CnKq_~ca>-g&b zHyeVpfI($%27{()cG6@Ueux<10DCf@Lq(m$HHjTtl1mk<5$fYr8<|LZz!4AyiCc|o z6YXt)Eger1Muo@8T;@=~*NAg+*X@6GZaR08yBsRcGB_j(eaU-5ur~x##9%Q%}-#WfY#Fp9hsJE0cdL(;UF_yONa+_zPMr8}OMs&$FM@LxP}an*s*_j${;U zUAz)ka2~OM_}#eolmXjrwSa-*L5gWj6O@cvd36r&1`?JB*JWrZder0`_^;d|j2JD(WJ<7N%}s|NHVTW*U4 z$nC{1v%nEc1__p4HW=ju002{y6c|ndy#$!ZE0;~ba`-PP)h{{000004FC-QUjqODW)}be000n+K8*kX delta 2281 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 From b70f25a9309b08ebeaf25a14688db50f291b9085 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Mon, 24 Jan 2022 20:47:43 -0500 Subject: [PATCH 09/47] tests: `as3_movieclip_displayevents_timeline` should log events on the root movie clip too --- .../MainTimeline.as | 10 ++++ .../output.txt | 45 ++++++++++++++++++ .../movieclip_displayevents_timeline/test.fla | Bin 8157 -> 8178 bytes .../movieclip_displayevents_timeline/test.swf | Bin 2513 -> 2479 bytes 4 files changed, 55 insertions(+) create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_timeline/MainTimeline.as diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_timeline/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_timeline/MainTimeline.as new file mode 100644 index 000000000000..9720ba852a4b --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_timeline/MainTimeline.as @@ -0,0 +1,10 @@ +package { + import flash.display.MovieClip; + import flash.events.Event; + + public class MainTimeline extends EventWatcher { + public function MainTimeline() { + super(); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_timeline/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_timeline/output.txt index e7cd881d7894..81bee8d748e8 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_timeline/output.txt +++ b/tests/tests/swfs/avm2/movieclip_displayevents_timeline/output.txt @@ -1,83 +1,128 @@ blue constructed blue (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] blue (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +root1 constructed +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] blue (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 1 //BlueSymbol frame 1... blue (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] blue (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] blue (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] green constructed green (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] blue (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] green (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] blue (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] green (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 2 //BlueSymbol frame 2... //GreenSymbol frame 2... blue (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] green (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] blue (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] green (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] orange constructed orange (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] orange (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] blue (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] green (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 3 //this.blue.green.destroy(); //this.blue.gotoAndPlay(0); blue (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] blue (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //BlueSymbol frame 1... //OrangeCircle frame 1... blue (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] //End MainTimeline frame 3 blue (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] blue (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 4):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] blue (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 4):[Event type="added" bubbles=true cancelable=false eventPhase=3] green constructed green (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] blue (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 4):[Event type="added" bubbles=true cancelable=false eventPhase=3] green (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] blue (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 4):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] green (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 4 //BlueSymbol frame 2... //GreenSymbol frame 2... blue (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 4):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] green (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] blue (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 5):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] green (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] blue (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 5):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] orange (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] green (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline frame 5 //End MainTimeline frame 5 +root1 (frame 5):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 5):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 5):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 6):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 6):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline Frame 6 +root1 (frame 6):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 7):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 7):[Event type="added" bubbles=true cancelable=false eventPhase=3] purple constructed purple (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 7):[Event type="added" bubbles=true cancelable=false eventPhase=3] purple (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +root1 (frame 7):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] purple (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] //MainTimeline Frame 7 //this.purple.gotoAndPlay(5) purple (frame 5):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 7):[Event type="added" bubbles=true cancelable=false eventPhase=3] purple (frame 5):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 7):[Event type="added" bubbles=true cancelable=false eventPhase=3] purple (frame 5):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 7):[Event type="added" bubbles=true cancelable=false eventPhase=3] purple (frame 5):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 7):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 7):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] purple (frame 5):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 7):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] purple (frame 5):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] //this.purple.gotoAndPlay(3) purple (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 7):[Event type="removed" bubbles=true cancelable=false eventPhase=3] purple (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 7):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 7):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] purple (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 7):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] purple (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_timeline/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_timeline/test.fla index 8ed648cf40833a8e3529a44df9f1845c09aab5d1..126630b91f5b8670e94262de1de26127072defad 100644 GIT binary patch delta 3762 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 delta 3777 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 Date: Tue, 25 Jan 2022 23:29:16 -0500 Subject: [PATCH 10/47] 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 9f5297daf026..244f6bdda59f 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 000000000000..ebd28f313556 --- /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 000000000000..565f77f87f5b --- /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 000000000000..304705a4ede4 --- /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 000000000000..ebd28f313556 --- /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 000000000000..a9a5c829ddf3 --- /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 000000000000..da2d240423c3 --- /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 zcmV-=2Zi`US5qr34gdgnoUK>SQyWJX?w-+fkA5=x2?#I(1`IaVjKKCfII*or!b{em zEFuZng$N;yj8a0v(m>+FR=GIjw3Vv-16!Q-wCAnL$^XID7iKfDu#&UrwN zs)d)%_4-LgOI0gJf$QoLJD8_e3wMuhf+ZDgtK;d7FLnx`)7f`bYA5w#L9f(nuJ(xh zp+?(UMFz_g9;k?&*OGl%7OadoMTvG+5bv&FrCm*q8no2v#}d9mskF+vxniSoq)!YQ zcBMgf|69m!$kHGUqS-Qd)3$!L)xXBFFBJ94iDomAK6?sM2XP?t+)<;VYtPnJc2f0{ zw$nH+m#f+i%b?kAo8Oh2JB5?OrJX~zHAUE(e0#I(V$NGqS!;P-*Xuhwzu{yLANKBb zywDUZH!(JEYv(B*HyS`#@^K3*?##wkW;4IKnOx6EAgeX{S*5AN8PjlOw%4|7n~+SW zGijgI=C`u>+*a~w#&4POsq98>Yx9fLRwhk1GwazeGwDG43WKxjwlmqxY@{=r!G;Da z(fZ>2wgU84F$f?Q4=U9XtXZ%+xZ--Q=_%Gt>i%E&%IegCt{<%^N}*KW*W$(cp_0rk zD@&?+U)evdRP{=2xbOB`>E3>!e%`JVxt|mvrmxSq+<053-qED@#e+>W)6gue5;b7&0qT^i)OG}w1}kneIhB1HU=;7EAbAHgHT z!+2y&7!#g~zmJYZhofuJ&!T^bK8vnLH+W2ZE+V=;POooB@&|$;gq!-nx*Ho41(k!J`auY{4$kI_&7BPocHpQYqNJdZh;)rkd2Fo2y7 z%mv|D$LZn?6&`9JqRSmN)ZNhH+~rLZ8|CogLN>&k92hwsj1faM*3fR`^0tX(WRxA* z2xnP&4yL(ns2bWER`*8Ky-{^9s_u=cd*kXJ58rJxVSf&|%O!IJhB&SQ3mE1OT`rr% zP)!OEOwq_vWIDk{c+TaP!R9v9_xLVyo1Wbe%k18nQJy$k{N34`vup^PUht(X#~0u` z1oKG79xmT7$|O68)VJ;@Pt-YIKx97>_r=|;1ckf0_j%}=8hTRXyoKX&DBLuXEJ@K^HHN;l!ZLdpW zzz6eqc!%4w5A#TdI(7Q?Jx(G2dz{A5WVqlWHvOmnF@rKXeJ9OA-XQhG>H3iS;GAO>F=NPl76QxCKN&v<{1=SBX~;Nx2b=TK-xz-j_^%j$oB0F3DE+|r zIPlwyR}7hB^QgvL!D}X@1GrO5kTFQ%c`FfwWF$QTJSB7IQ3kQ30GyQ_Hsqujzy+Dw zkeA?YH1EhR8#*M8%^-4Pk6SGV{8n47Z(6OBR_jMt`Ca4I+p_1Ucjp%ckI0LhdC$oD zka-_u@bR46lL8eU*eX0QKeB8Ojj}f|2O&N-vT-<}!c92cQ~V%TSGN01Oj}wxrt6iI>DD! zN)ZT6s)XKQX@Wo~D!oXkB1MoYy?2m~QZ1l> zbVKN%NH_3>pR2BWcK45OawhkE@11Avob%3o&dg}5;{mAw01yDMTX_}6L~4yk2mk=i z6?+TdW#j3^?`!L<4b!@9#HXMus{NZe*5ap}n`_*>0h5Or3H-a&xnoTwJ$b&Hx0L_G zi~?)s?rrJp;A!t=T1=C zJwBEyoA3CZw|-b`LtoBpdE^ngGoydICprd2$y*~LFvqJd6MPpoG6(L%U;@u(H|Q28 zSU~WlhLS;tfPSH=B|mP5%fh$)>n{6E7T%<&LYP|jd89bXjs~-sgK{iC?!@Fv+2KVb zqj@n8Baw7R0A%}iu}PJM9<3#EGz#aEBa7gWpK?Bth*oh14IAT&JAPTz2OPj`r-P{g zHQ5@VVo4o={Scrt5SWXvMP)(J@69@}Qg}nE#~`Ex)ey~VX$fE~VLR@zG`i&}(V=rF zoSqV;Jd)zUP?MoaxhEIUS4U91QZ_rBe}lJTyniq^twBa>qI{L_>H%LI{_qFE^7aNX z;Vhx1^cv=%tOt1DFbIjtvp+^Jo5lF2NV7=?X_U^6DW=dNbCx8QrV8u(%c+j(*cW3) zRA{Sr#+VTCUMJlmXXWA@@;EmdGOcRE+C z-fH?GHB`Q7rfT$mboe2(#^i?*^-g zRGH2}Zt9l zj3LjV%y!3PFFoCjFp0Vkq%VWpI)Pr6CE)(OJ~YoQs)sJ78%Y6c26I&-Wdp4{7v z8>p`%@UvRbABaP5D*KprToszVztPB)fRUDvo6W9Iv zX??qD6}#zu3AQC^iRpq#Qu-X}OiQbeG?TNj&PPRz)o4kR0q|s&!(%2cq@AmsHY@wI zkmN*IgVhAw`iN|6>i#TQrfBu1vDrAwbY^Zsq=JO)n0Lc^(+#n{qhu{&O zl~YjZ{`}q<xI{?2T=HeOy1u6Ca1fL^0Bw?zrcGYp0XB%QgHr=orcvshJD%c+%4=6B1fIKYFU zI4`tnE=u($`J5dy1`$_<Hyh&IpZh}^scyfdhA zXIEi}RUo9%2q+NIa{~rGeO;M9&uOOJF?slm|MYmcnUldT%$_mV0W?ak{9&Cw*C`^7 zHRf`K4d_|Fu(I@ad=_hS*a~=Yh}=b?mgKdFVmEmf+nQ|=nSyysv8pysXdryhDHz!< z$Vmv-;H?yh@s@ik5K{+l6^M!4`T9^92V`PV^x6=sg0XwB`$95v>oNjQp{x{~w4L`|5& z8k;vs?0sDJnMbrMd|v|uno}J7_x!T$v1>cq!N&UiO$&Nxgr<$#M@NO~m z^L&Z1RcOA+YDb#CLjfmGFnobsR6w6;C~N8xT@cQ-CI0y6IM_Pl$|p&Ci_Uy-Jq}+I zxr`O0CxrJzsOGMqq<`~XwrV!F9oUuNd536k6Xdf^0*HiF;-1w&pFcWO{e)Kqd2qVa_?t5Zgb2yX9P>wnZBo` zpK=&b?TeKdYrQxz9n)o3+ml*hxvrvNxF=o2AtN7G!*Wv9j&Oj5EyKryWUf-@^%7pmTMXq&0$@4B z@+mmMOPTUgBDJ~KMwR6>JOudarovX9t(tg9SF$|^z8ML=)2(o53`O^tfxjKBfP@yQ zfZKMl7MJ@W$sG{%Xp7}x8n=safyFQ(jc&mjA7U^~hL>zQsiGUr8pgin@A5j4X)I3> zT*3Y=`?F%cLg(sM?Cn~dvrxgFYX-wAX&nO5R~d4%79Go79)6&c(muQPS4|SyXj7(g%wUNblQ*y*nwq1g$0?OBj3)<7mxf zUiZC{#>d*R?{Re8vbwhmUCk_D zQ(ft({j;0zTUno(!<9|CuY5K-0iDOLI+YUQT-OmLOWxDcs-~SQyH`dsi(IF7?;b7- zDodHZT$8#I3Dp(T_Lr*c9fl5^4?b+0Bp{ADOakyXVHbF)cOF)FM1!LJ1)j~4qLWvr=-BmAy zaZKO~x52jRxjWilN-&p;M(3+ngU$Tv+*#PuJkvqurdNrSvx{1;er{$}CvMbP^tx#Q z85Ulla)1zr_okXPNY&N{tRJ*=RIO^AYL{NcAvSbxFQIuwCt-22RJhr?+H_ok7^f4e z)*E<@=_1C!%=MW`IueJns%GX78V}325q-TKP}_e~{_+k8@oIdDIk65yfIPipmMr`1lDGaD)Cz(8 zh~shA@uPtF-j@9=IIs)K^P0oW(!ts0ul2+49oI2IBZvoUcdq9Jhoyt7fUcj5qK&(a zt2MtB+{)g@4tsl<00;X|hjl3gpvSJxcOU@P(9+FW9?)Kf-D2fOC?LSK{O_)Rw0wV}&TE-uJx#YoLGreW+Otkyffm^P#4*0wb(S1ho|=+BC|pgyPAHPw zfQewT98fHaaNz>tf{VrdmWQ9jqkVS{w?$@XcagG=#=)AM51XeUDKGLTN+cgltb5;` zSx@;w+6xEgpjUO%`5feNIg>cqo>f|klH@dB5kS{INyeYzZA6ih14F4rLiDRBfJ5*6 zFLCW~=8A77nv+inL|K8LI`@p1ojdKbUaTxjv@Zg6CVD<$~G&aDPpAKk-x=8N+bo!ZKeZS%DsTVD+f zWoT7)N23r@>9OXuSLiW>6rqN40*}|Gs>%Ugq#>ZwX?Zs!VVtfgP};5qNVoyS%&~%w-!GuI#vJ^7$eaiyRmQ%2xE*f+K4Rz{IB8&f zbEL8e-8yP8#Fv<);eW%Ii&?x;HjHAk4UeXHc3;}4?)}EmLeTG-+JamNJ5RlHJ)a=B zIAF_YKX)6rySuZ472M0g%~ik$o3n6hH%puUO(K39K>R=8IJne+e;;^YL->pQ9Dk_) zj{1wq|DyiBC&yj{u=?YZ(Ebn9`5ffCoTK!y`m>MtFWC892W(`&PWvwe_`|_@Zk$im{+^}398_YD@kh#QtK(ld 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 Date: Mon, 31 Jan 2022 23:23:22 -0500 Subject: [PATCH 11/47] tests: Extend the goto tests with more non-looping jumps --- tests/tests/regression_tests.rs | 2 +- .../MainTimeline.as | 8 +++++ .../output.txt | 30 ++++++++++++++++ .../test.swf | Bin 1922 -> 1969 bytes .../MainTimeline.as | 8 +++++ .../output.txt | 33 ++++++++++++++++++ .../test.swf | Bin 1914 -> 1963 bytes .../MainTimeline.as | 8 +++++ .../output.txt | 22 ++++++++++++ .../test.fla | Bin 5024 -> 5024 bytes .../test.swf | Bin 1864 -> 1915 bytes 11 files changed, 110 insertions(+), 1 deletion(-) diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 244f6bdda59f..933a8b9e0f91 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -376,7 +376,7 @@ swf_tests! { (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_enterframegoto, "avm2/movieclip_displayevents_enterframegoto", 15), (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), diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/MainTimeline.as index 565f77f87f5b..ee14e7bf3e72 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/MainTimeline.as +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/MainTimeline.as @@ -47,6 +47,14 @@ case 13: trace("/// (gotoAndStop(2) in frameConstructed...)"); this.gotoAndStop(2); + break; + case 15: + trace("/// (gotoAndPlay(1) in frameConstructed...)"); + this.gotoAndPlay(1); + break; + case 17: + trace("/// (gotoAndPlay(3) in frameConstructed...)"); + this.gotoAndPlay(3); this.destroy_me = true; break; } diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/output.txt index 304705a4ede4..1d2130cb1f65 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/output.txt +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/output.txt @@ -108,3 +108,33 @@ root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhas ///Children: symbol_b root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] ///Children: symbol_b +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[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] +/// (gotoAndPlay(3) in frameConstructed...) +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b +//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="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: symbol_b diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_constructframegoto/test.swf index 8aa230ece052cc3335f1f60f6bc5b6ac22fef903..9d4fa1a34cc4f22ff0b2acc5e6b8db83b3b00cb6 100644 GIT binary patch literal 1969 zcmV;i2Tu4yS5qsk4gdgnoUK>SQya+@?w-+fkA9DS0s@S{0|tX70c-DCPHbdJusDn5 zAlAz!5J`xUnG{G`X~644s$3jWIc#lJ?m3W44ypVDdvaC&f-xj^RsIPNxg@7mUe8EE zT3~Zom8Lb{_g=sE`kObcnXi#hK*)Q7&>)X8J`o|5=31@Rm~=QK&&!X$lwaOg8!LzE z=8J>no&1Y>e&KmO_B?^!gq+}uQNFBHmFPS|t>C;#Y>S29>Pxik-~Pu}4TLd}sD*=U zgs<+b@*R zo8X_^EDL-j6azCtMKqx)O|4MbFD3J)U#c)4?^2aU=|GvE{4tjFLi zu+O4an{}nE-RdLDwJHQTEW--e0t zY;H@OUA0-?FTJv_)s9ppy|32&mlY;fGFPu2&K~UqQ!d(8$km%)>@-2=WXGXak80(T zrq-&C_Kd=TLfd*pu9qlur7Bi!3)at~U{=M&ItT=n=j#ns zQ=Y9Rx6-v;Wvg*msq8CTtb%5HY`&~Cw@OC`3tI>5@|5B76xtWeYU)B)E^|FEYFcfp z_!9?w@Syj)$4X7XbQPo1mWHnKVWR#4P@1oE1*KU13;>^Tib zc5`*ZvI(h7CY$k?V__p#$Zw=pvOd#PNavpBH`YH-Z)7ucJ-e2Bp3V5%zc4wsW;v7f z?9)tkJ+!r80_b*o{{^>tNUxL-|13Y4*y7yk=~s% z`GbDPQD^n=Al+WSD;|$`&Xc@yq|E{moo1q?s=IluR-ay+iK^A8sb#vOtg;)6#b%s6 zZhiBfK`GPo|92j9yFBmue3xrmxYpO!1baB%x5r1@+eY7B-`QBM_FcHjcj0Q^#jAW5 zLt!E83kL>61HLdG92mfZ!@{tzB7PbfjtoRrBTpi~hU+blKe=ujKOw zf^muo<@}TnQXx#q02K!*8KNXY$uK1&l#EjG1{KGs7^UJk6(^_|rs7R1%9Kn}GEK>C zO6DlOL-`oxD5Mhm<^`WQmfLeE?IkY@g;Rc}B?w zCC@4OGGILcus?quS?BDq!HDT=IAf17_8yA^4kxp^UbE57d^~V?&BqAShv#_FhB#~k zyTIEi5_otVArvDjVkFuHyB#?l4wli$1{a&gyIF9D2P2mkBe#T+$A^*EkC7C>$j3@@ zAfCq@M73i93iM;U4RZl_F0wm#Jpm6ukkR1`>51*&+|>Ck1M8L0+)OUW8ypxp9*ki< zp|7It@cFEPWu#YZxiDv1c@DzN>InrE2NK1>L~$rlj3kP~iQ-72$isINjar{Q?tH-* zgekU*!~%xc!Sh9f=m~>D21C?y6d87~5uS56Ww1H*#0UHlavHAfAgk=|iC!5!nfv(U z?MW_(4LA5wR^wOT>xDRyUc{9fdWGc1IK#(4v<>_WjJH96fr&NCWx2!LbYLli}+7WlpaIa$y46 z!!>cWYxJ^JyW8uM81O(G7jJXAb|8+VC&rK8eZXnt`+zeThAbDD!-ntppGH7N$M2;{ zs2ij{Tb{wk?~Kr?A3E3wzdfzop39w_Ft;-qpB%qG(<`%~vsTN9Ku7-aZ7#?e!;s0% zL8emc=C(hk=oO{w= z8UINq&i!_rq&`)08xN#!;8ycYHf<)q2e32VI|Gq`w`0w{EsnwcpwU%0~%~q=p z@;=ma9%MWMX+1pWbfrPrl%;IScx>7-dd2OZg1A{d7emIfo)eL=((MOm#!tKb0N@FP z@^a8ulDV1u>ipLRWlp(0T>Lu|4Q(x$H4~shJ?UykG<@T{AKAsuW{#fZwDOM+u;8Im+@b) DL1yGK 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 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/MainTimeline.as index a9a5c829ddf3..d0052922ad5c 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/MainTimeline.as +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/MainTimeline.as @@ -45,6 +45,14 @@ case 10: trace("/// (gotoAndStop(2) in enterFrame...)"); this.gotoAndStop(2); + break; + case 12: + trace("/// (gotoAndPlay(1) in enterFrame...)"); + this.gotoAndPlay(1); + break; + case 13: + trace("/// (gotoAndPlay(3) in enterFrame...)"); + this.gotoAndPlay(3); this.destroy_me = true; break; } diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/output.txt index da2d240423c3..d898b008cb0c 100644 --- a/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/output.txt +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/output.txt @@ -114,3 +114,36 @@ root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhas 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 +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +///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 +root1 (frame 2):[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] +/// (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 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_enterframegoto/test.swf index d5fe40f78451a2202b2c4654936cac5dbcd8b6af..1b85aca0c62d16034e2c14359b571abb907c27be 100644 GIT binary patch literal 1963 zcmV;c2UPe&S5qs24gdgnoUK>gQX9z??w-+fkN#lv3kWa*1`IaVjD+o7<6SRU5?*X$ zZ9wZK2}B4nT9gu!RvOrKs#4|RB9)7+ROJoGO)gS-fxU9oKEW6^c2!=&LvE6*RZh=H zLRz%GT9u~N-*--*)BW|C*336Z$RRX%iqJ5RQa%wOl;oPt=7e-KBFE)yP2M|v9Dj08 zIewT(=Chv`Za+z`{o%QaUWMG?i_vC5t7y?ULd{^@B6h@FaP4cf&mU^>nfJMLsFC!sR?)x6>xBcY zu5<$r_%#k<8lxJ5Wf|^q*6aC#mb2{s9z#RZk7~glY9A8Ut1m{@^QB6*bf}d}6;0^| z!5&Mg(x_<#eY%H)a9TZQEiPB6Rv=!vtktJ_eZDE_S6l);F19*-xI`arQEW@*>`3Od zh1oAPYUTV3=X&+Hq$SIxn*XZ0#7^ev*23MTn_x*rTk3ea^NZ~QXm|EprOI)&kk?Dq zimNpucc{^pR^k5gg!(FC&nsd7EDF|)I7NxHR}ky0V5wD2jtaEY>PO=P`ThM>*4-@B zOErDG->^#!GJC&=`3+hcq(C%V25-vN&$jy3*zEHKy>zVEOt{CMgsFo#F!Rk?y`*bT z*Os=E)qQQdepD=$wQV+oMyqXnU2JUUj}H^uhiq#Kur;~XX4%D@v!t@t@?}-8Zg2mB z!S3Jh-s@PtAy{r=bk5e!Q#h*Efw1J`=9k>*XW8^dZgpd2JuQK(*663Dh7M;;-Id;2 z%i1$wvBF zD!mb?Yp@cnC(kb{Kz9{`0Ak^wRNjX*3swi0TwiK>l66;f-%osHb@D*hYfFlf->>dz zu|oAwS=n4v5~_Mv**hwg^-^W1=k{Cb+P!-Syc`X%gq5CiJK8!Ddd~0mq0!$r(a$&0-*>T}?_ww{gni+_ zaA?RE#=}EHcz9G86&{J7Mn)q;k+sO<$dky^$a>@%kI8_Gh;EP5J1{8u{DGiCF`=BF z@TFeM|DL?{`hWQ>w=Dqf@F1QnxHoTTCu6~k1VrlL&A3?*}v+@NHE;#-uD zQC^|EO8Gb?cPaUhl6#aaQF5P>k0|+=k_VK0Ldh~EE6yQI$*OaXqvSJ6vXnfhFQLaCO`Kg87hG;;^}J-Qm-!69HE2B=SUx<*iw?wL2iOJPNs++A zBL<-uQ4u52DL9?T?Q*egd{#ZBjSNMm6KsU%Ty7a`ZbN;CZzH$q*$J|l-8nUivh-2x#74EMGh{T`+a`PT1tw#`5pOlQ-{h68YZY6ow|v1s1UBJNcIxkkQFoX$IyEQlGER zltLPEVQJxr|Rw-kux9o1yb&(~Lkx{_1rm$eE*%$;&~eGY(RX zvy#|A+)#Hcg{wQWv;^Cqi^X+!2SkXV*njGqPmbH-mcWSqH$%{l2mY}gIpzhL}L z<`4XW^l!$;fZt-gV#pkeqe|a1KGBY|*ot#o`Um6hw&Q%ziu0i{oA;Xcq;KKQ{xhr) zr1QLy2tqQFwgFGd+*yP{EUg2aksUVVqz3@!WokoSQUKnPT{d(`QGjvTV?#lLd)vGt zdu>Q0j>Q+b(Tg9O1g`)6*p!;hxn^^@+1zS2YoO*w#*H^c&tKo3o##CwFLLI`MrHt+ z4?x-ho^yMWpzN}(?6SFH*^)-l>z{>0DI*g@X4=Sz$XxBz0~F(L&mI literal 1914 zcmV-=2Zi`US5qr34gdgnoUK>SQyWJX?w-+fkA5=x2?#I(1`IaVjKKCfII*or!b{em zEFuZng$N;yj8a0v(m>+FR=GIjw3Vv-16!Q-wCAnL$^XID7iKfDu#&UrwN zs)d)%_4-LgOI0gJf$QoLJD8_e3wMuhf+ZDgtK;d7FLnx`)7f`bYA5w#L9f(nuJ(xh zp+?(UMFz_g9;k?&*OGl%7OadoMTvG+5bv&FrCm*q8no2v#}d9mskF+vxniSoq)!YQ zcBMgf|69m!$kHGUqS-Qd)3$!L)xXBFFBJ94iDomAK6?sM2XP?t+)<;VYtPnJc2f0{ zw$nH+m#f+i%b?kAo8Oh2JB5?OrJX~zHAUE(e0#I(V$NGqS!;P-*Xuhwzu{yLANKBb zywDUZH!(JEYv(B*HyS`#@^K3*?##wkW;4IKnOx6EAgeX{S*5AN8PjlOw%4|7n~+SW zGijgI=C`u>+*a~w#&4POsq98>Yx9fLRwhk1GwazeGwDG43WKxjwlmqxY@{=r!G;Da z(fZ>2wgU84F$f?Q4=U9XtXZ%+xZ--Q=_%Gt>i%E&%IegCt{<%^N}*KW*W$(cp_0rk zD@&?+U)evdRP{=2xbOB`>E3>!e%`JVxt|mvrmxSq+<053-qED@#e+>W)6gue5;b7&0qT^i)OG}w1}kneIhB1HU=;7EAbAHgHT z!+2y&7!#g~zmJYZhofuJ&!T^bK8vnLH+W2ZE+V=;POooB@&|$;gq!-nx*Ho41(k!J`auY{4$kI_&7BPocHpQYqNJdZh;)rkd2Fo2y7 z%mv|D$LZn?6&`9JqRSmN)ZNhH+~rLZ8|CogLN>&k92hwsj1faM*3fR`^0tX(WRxA* z2xnP&4yL(ns2bWER`*8Ky-{^9s_u=cd*kXJ58rJxVSf&|%O!IJhB&SQ3mE1OT`rr% zP)!OEOwq_vWIDk{c+TaP!R9v9_xLVyo1Wbe%k18nQJy$k{N34`vup^PUht(X#~0u` z1oKG79xmT7$|O68)VJ;@Pt-YIKx97>_r=|;1ckf0_j%}=8hTRXyoKX&DBLuXEJ@K^HHN;l!ZLdpW zzz6eqc!%4w5A#TdI(7Q?Jx(G2dz{A5WVqlWHvOmnF@rKXeJ9OA-XQhG>H3iS;GAO>F=NPl76QxCKN&v<{1=SBX~;Nx2b=TK-xz-j_^%j$oB0F3DE+|r zIPlwyR}7hB^QgvL!D}X@1GrO5kTFQ%c`FfwWF$QTJSB7IQ3kQ30GyQ_Hsqujzy+Dw zkeA?YH1EhR8#*M8%^-4Pk6SGV{8n47Z(6OBR_jMt`Ca4I+p_1Ucjp%ckI0LhdC$oD zka-_u@bR46lL8eU*eX0QKeB8Ojj}f|2O&N-vT-<}!c92cQ~V%TSGN01Oj}wxrt6iI>DD! z^nFn-{e*2WMB|y5MnT5klf74casGo{!C~W00#yPv;Y7A diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframegoto/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_exitframegoto/test.swf index 936b589ed00cd77c00c0a946a42c96d2b152d172..8d91240d1280d88f37839b81eb673ce3353a20f5 100644 GIT binary patch literal 1915 zcmV->2ZZ=TS5qte4FCXmoUK=1QybS6zjs%A?@C&v)n7n>5qQC1V`-6M9Lr4%kz|)7 zpcJq}8mJIrWz-RpA}u(6=uE~BojznT({Dgu`q1eY$dhOK3D(fsGyMvE@Y3l_`xN!u zT}enm&QmnntNZ(%bME${_W{N3-|-=BRy5nMfg1dLM#5eJ69Cj`R}S_b@*1Yn%SAc%Y$_$z8YKiaQV z@&)uV_%Dfhfsc%0AV%mnXj<2rdcIUCq&6+RmHcA7OO+ahBW-c!r&PMsX!b;_>Yo?% z;-S`v_W}v@nujrsQBA>;jPxn%jY3h&TXKJ&psDG{^b0S|iY>VrM>pOAO$WVy7I=ZaIeRqz}r? zdZqB(xmG(VYw1e4?!Q_&Vmp(1^K|#rM6k+0+nGzf{>9Gbb|(9-a`mKEEa>H0)z!Ah zA8E8*htR;(?En(?Pg1a4bMbhj6Kbp*YO385jw+1QnnxEsg@c2KY`R%&l=DTeeQjG*HiI$;h?s!#fr6~_{wH7 zo>0}L`2KOZqL-_~eK%REdy@tGdAmuJesXX_P4+8Y>BF&~SY*8SoJ;+v!Ew}GJw8ge z^OxfBcxRsCwG&+dB09&4wo*OV)NA#*mc#y$;IJIVBjI5@ z5)mRoR(u$VM8c6rkzYnuBOgaTiG0dq;&BntEjfogUfJgl1Y;Bv%K0cCphAd}FcpU> z8KGp9k_aVZl#Ekxf{NFuI7!7Q6+={DEZuP{~@#gVjkIZb~#|g z^c$G5rwV6}#08g|NhKy7g3AM!*Ou}eFFFv19UvEYCq)7e&jo~HL`955r{HuVx6{RZ zx!E8wGoCHta(OV4yciA17QgFja+~?IS_I@2*ZYItfJk}#k`3XWRx7a5NAnw4wkuPs2bV} zt9!%h-iW$4s_sS9y)ku4MPRyCIWf8!IcY`#yy;O8#7kK&5KA1wer(V2%i&v2R z7Jr0cNOS%LY|1bGVfq#H;*C55p+c$8AI{+yug&0@9~#ySy*ew+FRY!OGPQFBpT2l= zZj^3@&RZ>W6q+#iDi`3)2zVM|p8msut8vx^pP_N6<;~Y6>5p&D&I^*ri=6x?=3+{o zhW<9MgY~aiS15+U=WbzhMs_j&2JoAVpEDGkg9zv4e>1aNz&~dE0@DZnw){`V$AN#s zc-2riw$7sbH^wJB>%7-q=Z^dr#^3F%^L~4sd&X>G$V|!K!jt+RAY~|@^janeDM;P{ zJgx9&5eBim25?ppY{=?wCKQhi1=$C1N%7i{$Q)Z=q3>4qP zL5IlJv9Nvdg^5{y?4I{t^1r_L@{*S?`JId1OWp^)>PkYdE}O!;&Itj&+uTH_U!9=K z`t?Cz);e1`boG%G1igPL@aDw9G5L~&K(NH#oyPyX{NHbI=j~}96xhqv{{ij_9e6EP B%WD7t 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 Date: Wed, 2 Feb 2022 19:27:47 -0500 Subject: [PATCH 12/47] tests: Add tests for symbol instantiation in `enterFrame`, `exitFrame`, and `frameConstructed` --- tests/tests/regression_tests.rs | 3 + .../EventWatcher.as | 37 +++++ .../MainTimeline.as | 125 +++++++++++++++ .../output.txt | 144 +++++++++++++++++ .../test.fla | Bin 0 -> 4130 bytes .../test.swf | Bin 0 -> 2136 bytes .../EventWatcher.as | 37 +++++ .../MainTimeline.as | 125 +++++++++++++++ .../output.txt | 149 ++++++++++++++++++ .../test.fla | Bin 0 -> 4147 bytes .../test.swf | Bin 0 -> 2173 bytes .../EventWatcher.as | 37 +++++ .../MainTimeline.as | 119 ++++++++++++++ .../output.txt | 135 ++++++++++++++++ .../test.fla | Bin 0 -> 4130 bytes .../test.swf | Bin 0 -> 2086 bytes 16 files changed, 911 insertions(+) create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/test.swf create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/test.swf create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/test.swf diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 933a8b9e0f91..c71297c84c61 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -375,11 +375,14 @@ swf_tests! { (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_constructframesymbol, "avm2/movieclip_displayevents_constructframesymbol", 12), (as3_movieclip_displayevents_dblhandler, "avm2/movieclip_displayevents_dblhandler", 4), (as3_movieclip_displayevents_enterframegoto, "avm2/movieclip_displayevents_enterframegoto", 15), (as3_movieclip_displayevents_enterframeplay, "avm2/movieclip_displayevents_enterframeplay", 6), + (as3_movieclip_displayevents_enterframesymbol, "avm2/movieclip_displayevents_enterframesymbol", 15), (as3_movieclip_displayevents_exitframegoto, "avm2/movieclip_displayevents_exitframegoto", 12), (as3_movieclip_displayevents_exitframeplay, "avm2/movieclip_displayevents_exitframeplay", 6), + (as3_movieclip_displayevents_exitframesymbol, "avm2/movieclip_displayevents_exitframesymbol", 12), (as3_movieclip_displayevents_looping, "avm2/movieclip_displayevents_looping", 5), (as3_movieclip_displayevents_timeline, "avm2/movieclip_displayevents_timeline", 7), (as3_movieclip_displayevents_stopped, "avm2/movieclip_displayevents_stopped", 10), diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/EventWatcher.as new file mode 100644 index 000000000000..ebd28f313556 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/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_constructframesymbol/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/MainTimeline.as new file mode 100644 index 000000000000..c6ed9fe50ff2 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/MainTimeline.as @@ -0,0 +1,125 @@ +package { + import flash.display.MovieClip; + import flash.events.Event; + import flash.system.System; + + public class MainTimeline extends EventWatcher { + var invocation = 0; + + var destroy_me = false; + + var ew: EventWatcher = null; + + var ew2: EventWatcher = null; + + 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 1: + trace("//this.ew = new EventWatcher();"); + this.ew = new EventWatcher(); + trace("//this.ew.name = \"ew\";"); + this.ew.name = "ew"; + + trace("//this.addChild(this.ew);"); + this.addChild(this.ew); + break; + case 3: + trace("//this.removeChild(this.ew);"); + this.removeChild(this.ew); + + trace("//this.ew.destroy();"); + this.ew.destroy(); + + trace("//System.gc();"); + System.gc(); + break; + case 4: + trace("//this.ew = new EventWatcher();"); + this.ew = new EventWatcher(); + trace("//this.ew.name = 'parent';"); + this.ew.name = "parent"; + + trace("//this.ew2 = new EventWatcher();"); + this.ew2 = new EventWatcher(); + trace("//this.ew2.name = 'child';"); + this.ew2.name = "child"; + + trace("//this.ew.addChild(this.ew2);"); + this.ew.addChild(this.ew2); + break; + case 6: + trace("//this.addChild(this.ew);"); + this.addChild(this.ew); + break; + case 7: + trace("//this.ew.removeChild(this.ew2);"); + this.ew.removeChild(this.ew2); + break; + case 8: + trace("//this.ew.addChild(this.ew2);"); + this.ew.addChild(this.ew2); + break; + case 9: + trace("//this.removeChild(this.ew);"); + this.removeChild(this.ew); + + trace("//this.addChild(this.ew);"); + this.addChild(this.ew); + + trace("//this.addChild(this.ew2);"); + this.addChild(this.ew2); + + trace("//this.addChild(this.ew2);"); + this.addChild(this.ew2); + + trace("//this.ew.destroy();"); + this.ew.destroy(); + + trace("//this.ew2.destroy();"); + this.ew2.destroy(); + + trace("//System.gc();"); + System.gc(); + + 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); + } + } + } +} diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/output.txt new file mode 100644 index 000000000000..5c05fc445dfe --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/output.txt @@ -0,0 +1,144 @@ +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] +//this.ew = new EventWatcher(); +//this.ew.name = "ew"; +//this.addChild(this.ew); +ew (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +ew (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +///Children: ew +//MainTimeline frame 1 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: ew +ew (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: ew +ew (frame 0):[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: ew +ew (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//this.removeChild(this.ew); +ew (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +ew (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +//this.ew.destroy(); +//System.gc(); +///Children: +//MainTimeline frame 3 +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +root1 (frame 4):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 4):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//this.ew = new EventWatcher(); +//this.ew.name = 'parent'; +//this.ew2 = new EventWatcher(); +//this.ew2.name = 'child'; +//this.ew.addChild(this.ew2); +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=3] +///Children: +//MainTimeline frame 4 +root1 (frame 4):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 5):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 5):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///Children: +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 5 +root1 (frame 5):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 6):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 6):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew); +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 6):[Event type="added" bubbles=true cancelable=false eventPhase=3] +parent (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 6 +root1 (frame 6):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 7):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 7):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//this.ew.removeChild(this.ew2); +child (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 7):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 7 +root1 (frame 7):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 8):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 8):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//this.ew.addChild(this.ew2); +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 8):[Event type="added" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 8 +root1 (frame 8):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 9):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 9):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//this.removeChild(this.ew); +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +root1 (frame 9):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +parent (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew); +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 9):[Event type="added" bubbles=true cancelable=false eventPhase=3] +parent (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew2); +child (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 9):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 9):[Event type="added" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew2); +//this.ew.destroy(); +//this.ew2.destroy(); +//System.gc(); +///Children: parent child +//MainTimeline frame 9 +root1 (frame 9):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: parent child diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..be7fd5f1b6adba2572cc2577f39916db7b43d2cf GIT binary patch literal 4130 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 Xb}R%;vwv@gf%3#r0YDjL4*>oL2`a7c literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_constructframesymbol/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..2a3de85b11d91b995dc482722bd2ac1e9cddecf0 GIT binary patch literal 2136 zcmV-e2&eZ$S5qqq5dZ*qoV8XQbme&g8nW` zsZu|XipqEwS*%vT$zf5+$+g11lmiSt%VnuH)}@n9N?%I+U6Q7C+JZ}1a5EO%tOYk` z!OdH6H!ZjY3vSWVS;8KDJ9bO;gL2{2nW-L?q-42t;O^K4zFB!{6x-A3(p9P)Rf`3s zRIRuSdv0GM(lI9;C#X^H@P99Hz_O}#y^#8p(5D%Fn$@Q{eVW&&oBFh%Pm4QiOIyk6 zuC!GHbc&yu935v#COz z*9+4ulC1(dM`WU@k9dlQwHnw~86uNQ?)1aW^m=Y}eI=6?3cI^aM-NJM1zw+;EB$7Um3wJ#)09hQA8u@}KS^$;Q*=F@$v#b|e8vomvl(4%Ur#?w zrPuv62~v}~;@Go0Kfp%xHOUmDYixc>&s?{9*D8tx2`Qx`NoRsx_9W~NY(03}IH;8r z>HksY&fbDD_d>y%h1@9CN(YLgxK}FgLUsA(4KBG}NlKF4t|;EmmWuJwJw-WKip2`M z)g5W7Sly4UY|O+G@%Vgf=de^(N|k}G=3i`o)}FI z^x0P7h`VyQpEUCK#A315{Sqe~DI>9%vRA54Nym{}kqTTp`*mV+IoP&Ov2F#?m~=e0 zJZR8R=BB#|Lo~VUXi=98iQZM8soWiGzZt?f2_SB7EVgk9J-9#hstC|H{Oe81u3N~f zV)%=v8$T$pmuP(1uHQu3iiCB7ri(<|N3%)BmxoR7pXZsFTsA#hrI;{1TdWOq1T}NE z)s^Z26uh$`Bl_Vm-SvI6w4|SN*4l)XHes!uvC__1YiF&rv)0-_y) zrM+pbU9i$FSZf!pw2S^A7sSC}C@_FSL;MiG=C~go3J1d9g&%}7;fLXD_)&11!=#rI z-r=;n+@7A^KEXRjv5k@dl<*!g)r2JLN zU!(juUmXbM2<|(;J$pR&dlq^xQOv%^I0H)*?#kVPU zhjMo*w?esZC`nQBtusa_S*PSVB`>M(Hb_|1;d#VNj&AY_MN+PG)ue z%&u;x@xbVT(F>!m`Fjl^FAN_HKa75TEg_uKhA?Nti0~M3c8s79PCKFk^NKkqTwN{~ zC_Nr`^XkFK(Swn*7b906Ms5Kkj~AmJA4a`?jQaX95&{@`gBbY+Fbig9zKIQjVrs)U zfG~EtI5mC`0$}WN_n${KyBgQ1x`s4|n&pw^1RLRq%PoSsEDx!&EqjS*UIvB@;A7yj0sIV%7@(hlhyel& zj2a-wz?cCB7`S495Cpch0*4{+P&=?lv`g*40EXLv0bFhe1~AeN3?R}D3}Cb!7{FLN zFn}u%m?u!hm>P%B{PxxSwRnC!o}Y;4C*%3+@%)W=o`e7AXjuR35zuk4%+3m~*Pi;Z z+p~L~)N8gK)rg2xxlhEZEQmyvy&5NSs_YYOs_YkeRqoepqFt2(B30#}=+J-~$VPoo zZ`e1lkw;Iv&X9X=v(6C9!P(rN9f%cBajU5?aOEcO zstRfxs!}@tLBp&v1bC0hzdkRUe2>ZRpI1!2*W|0`2PWTV@;{!}OkObg`nh8AUXwpO zKQeir$seDen7rTQPtSjA^8Ij#xn|%HOKNrrSs!8q{-5LF)SRGja literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/EventWatcher.as new file mode 100644 index 000000000000..ebd28f313556 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/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_enterframesymbol/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/MainTimeline.as new file mode 100644 index 000000000000..65e8c9f32527 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/MainTimeline.as @@ -0,0 +1,125 @@ +package { + import flash.display.MovieClip; + import flash.events.Event; + import flash.system.System; + + public class MainTimeline extends EventWatcher { + var invocation = 0; + + var destroy_me = false; + + var ew: EventWatcher = null; + + var ew2: EventWatcher = null; + + 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) { + this.invocation++; + + switch (this.invocation) { + default: + break; + case 1: + trace("//this.ew = new EventWatcher();"); + this.ew = new EventWatcher(); + trace("//this.ew.name = \"ew\";"); + this.ew.name = "ew"; + + trace("//this.addChild(this.ew);"); + this.addChild(this.ew); + break; + case 3: + trace("//this.removeChild(this.ew);"); + this.removeChild(this.ew); + + trace("//this.ew.destroy();"); + this.ew.destroy(); + + trace("//System.gc();"); + System.gc(); + break; + case 4: + trace("//this.ew = new EventWatcher();"); + this.ew = new EventWatcher(); + trace("//this.ew.name = 'parent';"); + this.ew.name = "parent"; + + trace("//this.ew2 = new EventWatcher();"); + this.ew2 = new EventWatcher(); + trace("//this.ew2.name = 'child';"); + this.ew2.name = "child"; + + trace("//this.ew.addChild(this.ew2);"); + this.ew.addChild(this.ew2); + break; + case 6: + trace("//this.addChild(this.ew);"); + this.addChild(this.ew); + break; + case 7: + trace("//this.ew.removeChild(this.ew2);"); + this.ew.removeChild(this.ew2); + break; + case 8: + trace("//this.ew.addChild(this.ew2);"); + this.ew.addChild(this.ew2); + break; + case 9: + trace("//this.removeChild(this.ew);"); + this.removeChild(this.ew); + + trace("//this.addChild(this.ew);"); + this.addChild(this.ew); + + trace("//this.addChild(this.ew2);"); + this.addChild(this.ew2); + + trace("//this.addChild(this.ew2);"); + this.addChild(this.ew2); + + trace("//this.ew.destroy();"); + this.ew.destroy(); + + trace("//this.ew2.destroy();"); + this.ew2.destroy(); + + trace("//System.gc();"); + System.gc(); + + 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.ENTER_FRAME, this.enter_frame_controller); + this.removeEventListener(Event.EXIT_FRAME, this.exit_frame_controller); + } + } + } +} diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/output.txt new file mode 100644 index 000000000000..5c4a2369d481 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/output.txt @@ -0,0 +1,149 @@ +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 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +//this.ew = new EventWatcher(); +//this.ew.name = "ew"; +//this.addChild(this.ew); +ew (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +ew (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +///Children: ew +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[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: ew +ew (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +///Children: ew +ew (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[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: ew +ew (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 4):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +//this.removeChild(this.ew); +ew (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +root1 (frame 4):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +ew (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +//this.ew.destroy(); +//System.gc(); +///Children: +root1 (frame 4):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 4 +root1 (frame 4):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +root1 (frame 5):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +//this.ew = new EventWatcher(); +//this.ew.name = 'parent'; +//this.ew2 = new EventWatcher(); +//this.ew2.name = 'child'; +//this.ew.addChild(this.ew2); +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=3] +///Children: +root1 (frame 5):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 5 +root1 (frame 5):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 6):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 6):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 6 +root1 (frame 6):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 7):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew); +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 7):[Event type="added" bubbles=true cancelable=false eventPhase=3] +parent (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 7):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 7 +root1 (frame 7):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 8):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +//this.ew.removeChild(this.ew2); +child (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 8):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 8):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 8 +root1 (frame 8):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 9):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +//this.ew.addChild(this.ew2); +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 9):[Event type="added" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 9):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 9 +root1 (frame 9):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 10):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +//this.removeChild(this.ew); +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +root1 (frame 10):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +parent (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew); +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 10):[Event type="added" bubbles=true cancelable=false eventPhase=3] +parent (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew2); +child (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 10):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 10):[Event type="added" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew2); +//this.ew.destroy(); +//this.ew2.destroy(); +//System.gc(); +///Children: parent child +root1 (frame 10):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 10 +root1 (frame 10):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: parent child diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..4efdfaf4cace8dcf897005df38e0a67e89814110 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_enterframesymbol/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..ef8470666ab7ea145022fe55a74e8548e15098ff GIT binary patch literal 2173 zcmV-@2!i)RS5qr+5dZ*qoUK+%R~yL{uBuk6^a5HS2@qgp+%{liB*YuW4=l+Tk3nO= zkC}lHLUbFAg`|-hFqu3i{s-A+k;68BB6Cj8$u5hwePW+1@(Z$XYnRQS-0E(rCA&{n z0jjFM?|yY})ven_ze0Qlp{{d;`aCG^Lw3U;JQe+CDp9B9E7y&;5nnVP~-=Y50iBwdcWtH5aREf3% zpIpdR4<{u?Re9ag*Ctjf*_@Qo?cHsLs-zs318vlSR8=aav;OsLzPOz~k_!2v6m128 zHcP%(ElWA&N*f98q)JAvWRIjwu2ckng@RNWY1h2UE1yYv+9bMl%7%;EaML#2j14zy z!_C=n^ETXq4YwGuS#!+Sn$r&Bd=B!}av^)>UN4>Gr9>fL_O_f0uO9_9v+ry5>B$#Q zO1Z3(FBLteJ#!=x>6DXBog}BuWR;PUTpZ3(}4Pi>sP_^;E9zWKWLbJ4bB0IoNK-On_0R8GXUJr|Q|!eyOm$ z+?un=Y?U_>qbJEx1f44~rt2fV+;OD>w)+f`@g;9+V>`8(xxcxxo)WSL2fCw2`Kki% zQ^k{dzP4@H_?2WbmF(2}%yv4nwY{>M^6REdBE7M-z4;`uol4Tp)Oz}9D%ow0Fgd+$ zh@G3Mjbv)Gry{|&q_#ND^#1p75M4T%gsqx~pEP!DSp92k*V&wsKamV3)Mih>8Ntzm zx2;!GFLi^u53+59jgaKu|YK1!JT_eG=8#`6*DKRSQ6P34x4Ok(}TL9vAMx$G2P=800FLD6Q{{&T? zavB!$A{YK_b))4hdx1umoyJ3?sfgQe&~g!P`p}DHba}|~{^>sB`Y`7d3M!h_*Zcs;xk zPKUn=KMrq(G8`tIl<+RM)8qAZban~;If@;WgeccX`F={mlnhWZNckbkU!wdlv^Om!MpdlKYfAbWagVwki3Bk{#N;M@g2F??c818-X74 zKf#j|8bt=n8v7n}Gppw()_a-82dx8IC$uj8YY!nmv~FlU&;rnc#(Y9Jw*z6$ff3;` z;+z;kKHN@3^)F4#xuN%XJfQUXyn64$$kl<7yAvZ%7e-zIBcC6mj&6)Pdobz>U?c=F z@`o_$?!~C553_(y=ASqqFs2TSLkMHHhf`y#5Cmh7H&C0@oN7#?>Kf8qYMMuy8*GFl z93*zrfR^LH&kvyO0zZPfhvh+4cBF@h z=4arN3Az~=HbD;q5fcO$xNL$T10yB~F>u8My$pyZ=!3wHM&K|69%u%>O0>adU;snS zzyK~a0|OXt1_lsm1_p4s85qDwGcbTF5SS;B#i$yC(ERSTz0ug-SZr@Rws$?YcO$kp z5!>V7?>QPWehvxfIGE;S2{&?2gV^hPSxXr?+r6m~5vg*Qh*en-i7NXwPUKX%TXd*$ zkI1WXKy!#rRSt?&l|!OS1FBbZif&czOWzDY+Tr;8W(qo*>4p?^>gk4%F3#cg?L)|* z8oT`Z{YSitLLc!14BZ;(o4{J=^*^*e5xxE(T!q@!`qg*$C-Lj|TKH`@RJJzo=B*r^ z*g8LFvUegrfBoT|D#wEF>UC{+w}0Zvn{+>95hA$>MEX4sp+;EsJVhhg74`ai+4YAH zZ{KBIF3v@Szd$8xqrzhX!#K=-#;WPMx=S7sl=WygfO^iT303w?3}?gIBrsnyCaMCJ zp2Av8=wY+tVEC39rgcLcYqP-YGG>kuPNXdW@f{-;_omY`NLv#A$-;lph#p0!3=404y^nu;Vv_6Hr#Dl?zV-i%=EOe+h>j4e%%Q0O(Vb#Fo%rURn5tn2D8^- z_8U3MnK_bx$TLD_3Lp*}Ny{5ad#PT_y0wDvC%D-D2=#DPm0j-zxEDnvyaYTZ;t zZ!JCucbsP$?zoiZl#u-$N8s-{9%|fk6toVQdZ)*4{+De1WI%Uqei8aFl>1S0q&YgF literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/EventWatcher.as new file mode 100644 index 000000000000..ebd28f313556 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/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_exitframesymbol/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/MainTimeline.as new file mode 100644 index 000000000000..605c79ad3987 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/MainTimeline.as @@ -0,0 +1,119 @@ +package { + import flash.display.MovieClip; + import flash.events.Event; + import flash.system.System; + + public class MainTimeline extends EventWatcher { + var invocation = 0; + + var destroy_me = false; + + var ew: EventWatcher = null; + + var ew2: EventWatcher = null; + + public function MainTimeline() { + super(); + 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 exit_frame_controller(evt: Event) { + this.invocation++; + + switch (this.invocation) { + default: + break; + case 1: + trace("//this.ew = new EventWatcher();"); + this.ew = new EventWatcher(); + trace("//this.ew.name = \"ew\";"); + this.ew.name = "ew"; + + trace("//this.addChild(this.ew);"); + this.addChild(this.ew); + break; + case 3: + trace("//this.removeChild(this.ew);"); + this.removeChild(this.ew); + + trace("//this.ew.destroy();"); + this.ew.destroy(); + + trace("//System.gc();"); + System.gc(); + break; + case 4: + trace("//this.ew = new EventWatcher();"); + this.ew = new EventWatcher(); + trace("//this.ew.name = 'parent';"); + this.ew.name = "parent"; + + trace("//this.ew2 = new EventWatcher();"); + this.ew2 = new EventWatcher(); + trace("//this.ew2.name = 'child';"); + this.ew2.name = "child"; + + trace("//this.ew.addChild(this.ew2);"); + this.ew.addChild(this.ew2); + break; + case 6: + trace("//this.addChild(this.ew);"); + this.addChild(this.ew); + break; + case 7: + trace("//this.ew.removeChild(this.ew2);"); + this.ew.removeChild(this.ew2); + break; + case 8: + trace("//this.ew.addChild(this.ew2);"); + this.ew.addChild(this.ew2); + break; + case 9: + trace("//this.removeChild(this.ew);"); + this.removeChild(this.ew); + + trace("//this.addChild(this.ew);"); + this.addChild(this.ew); + + trace("//this.addChild(this.ew2);"); + this.addChild(this.ew2); + + trace("//this.addChild(this.ew2);"); + this.addChild(this.ew2); + + trace("//this.ew.destroy();"); + this.ew.destroy(); + + trace("//this.ew2.destroy();"); + this.ew2.destroy(); + + trace("//System.gc();"); + System.gc(); + + this.destroy_me = true; + break; + } + + this.inspect(); + + if (this.destroy_me) { + this.stop(); + this.destroy(); + this.removeEventListener(Event.EXIT_FRAME, this.exit_frame_controller); + } + } + } +} diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/output.txt new file mode 100644 index 000000000000..1ebd1c784a20 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/output.txt @@ -0,0 +1,135 @@ +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 +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +//this.ew = new EventWatcher(); +//this.ew.name = "ew"; +//this.addChild(this.ew); +ew (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +ew (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +///Children: ew +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[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: ew +ew (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +ew (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +//this.removeChild(this.ew); +ew (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +ew (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +//this.ew.destroy(); +//System.gc(); +///Children: +root1 (frame 4):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 4):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 4 +root1 (frame 4):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +//this.ew = new EventWatcher(); +//this.ew.name = 'parent'; +//this.ew2 = new EventWatcher(); +//this.ew2.name = 'child'; +//this.ew.addChild(this.ew2); +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=3] +///Children: +root1 (frame 5):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 5):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 5 +root1 (frame 5):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///Children: +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 6):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 6):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 6 +root1 (frame 6):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew); +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 6):[Event type="added" bubbles=true cancelable=false eventPhase=3] +parent (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 7):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 7):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 7 +root1 (frame 7):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +//this.ew.removeChild(this.ew2); +child (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 7):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 8):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 8):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 8 +root1 (frame 8):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +//this.ew.addChild(this.ew2); +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 8):[Event type="added" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +///Children: parent +parent (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 9):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 9):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +parent (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 9 +root1 (frame 9):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +//this.removeChild(this.ew); +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +root1 (frame 9):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +parent (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew); +parent (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 9):[Event type="added" bubbles=true cancelable=false eventPhase=3] +parent (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew2); +child (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +parent (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 9):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +child (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 9):[Event type="added" bubbles=true cancelable=false eventPhase=3] +child (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +//this.addChild(this.ew2); +//this.ew.destroy(); +//this.ew2.destroy(); +//System.gc(); +///Children: parent child diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..be7fd5f1b6adba2572cc2577f39916db7b43d2cf GIT binary patch literal 4130 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 Xb}R%;vwv@gf%3#r0YDjL4*>oL2`a7c literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_exitframesymbol/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..23b3355f3c38129fb7b9c791c68b233c6ddb010b GIT binary patch literal 2086 zcmV+>2-){TS5qr_5C8ypoUK+%Q`=Y;zW2)V^$RRNco_(WC;<|Jjd?>S9b!9a(jo3( z^5_KG7$bobV>`BhFsrHjgW1lai>g`8pO~(is^0ZNNotas#r%fIo2l6}o^vhPvJ=&; z#`e|K_nq&aqjPk0tv86zAmlwqsNabaJ_kZ5PU`jgh;Te0&WOphxb}xfReAAw>E-iR zPxkISpH1z>V@osWmmW80F-qs8q7(Mk{T*VZlFdn(hTY#`s7lIlIoLt%OI4*(Ivd!?=8IeTBdL%tN|AOD z?6BmE)v}aR#yUvpO}ao4SY2(e$#k~L>xnmtU@L;o5uRx1 z!=Bu6r2@9Q43Wtdck2z#$z@VYb4R;fUXmZuj zq=pQM-cVnt+-+>o3}HOv5Vt!LNuNRc9ZetP02=#swL#f+3pvPzzPh^ca+WDem9nCaPKZBJWJGiO^>DV3q%?F|{$_l22` zzmSy`eRs3g#;mk4YwfI+cGg-uXQiF9*3MgL=dHC1R@wz??V^=-(OSD?rCqYtE?a4r z1HD`??(OLh_Tl~zAL8#hz6*sy!O(i>e(3wqgV09kVebnLlWt0QhtuwId%C*4f^Uvu z8zn)?^-{i%l731CC<#%1kn%&6AEx{z%8yV!O!-mDk5T?IMT1D6aCWMISqJq&~m(96K60s0siGeAECwlxEXAn;%- z@MWS6wE_beZUqK#sTCN&NGmXaa4Rr?(Nz_jcIu4fES;6(%(*SmRp4Qg%n(bWIh=^3VTg0mD6^SYf z8Ygn9>=SLO>=$`e4rn&fuF64?s&bF$(17YqUH3!1;l4HN+|{TvxOZ?iw`ULB2i554 z+mD}d9QAz02@HoM>6^k@&)a`!eIk1MNw@-CtM#iN?oQ#iAGLw^e&|{)^zOZUV=8ri z&SW1%eE#;+2UVW#`B1NGmv;K59=%KTLHQt(lSTRq51~d`r);88DA%=*vg1#m-haqC z9Grs)e}it-t_qI`OcSs=%{pgN-68i0%DS{`Ky5MVx+=S-hO__}S#;yELhc4tyCq%8~oWZ_qvaldKBy$RG$jJn0* zW+3iuV0Ia^W{BL{9iXy|imS4FDgmM-Fnf%-3(J6Hmv>K4SdjJRb>DAZ_xHjJX4n8j zju{>rYv9UL!fj@H)O5FLx=RaJnCWpd+b7LzpEU#g*bMLjn0>}gbjczqD_aKa0}pfqFskJAp-D$NOi~yVSqn~4jtMB*c-Ji(Wyf!5Ejls27mp% zPGS7^d);+WPh8ahdQt!TMg3nF_5WPdwW6BxAg!#*PX7Qbf32owkycSzQq|T|0gvr5 z^s0-%Lno+FNcNz1s9}~c0p4x$`Pxg9_n7>vTEXPIO#Y}=H2H3mFV)H>?=|_?wTj6L zCSR>7Chs%(=LrxjtKmo;o;_%L_uqVrQZg8#@|=_ QpE$bx)fb`v0xQ}6lM-(xr~m)} literal 0 HcmV?d00001 From cf6b59902ed3fcb3c7488d963df1ae2ed0b1c5e1 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Fri, 29 Apr 2022 22:19:50 -0400 Subject: [PATCH 13/47] tests: Add timeline and stage manipulation tests at user event time. --- tests/tests/regression_tests.rs | 3 + .../EventWatcher.as | 37 + .../LeftButton.as | 22 + .../MainTimeline.as | 70 ++ .../RightButton.as | 22 + .../input.json | 112 +++ .../output.txt | 676 ++++++++++++++++++ .../test.fla | Bin 0 -> 6542 bytes .../test.swf | Bin 0 -> 2516 bytes .../EventWatcher.as | 37 + .../LeftButton.as | 22 + .../MainTimeline.as | 70 ++ .../RightButton.as | 22 + .../input.json | 112 +++ .../output.txt | 575 +++++++++++++++ .../test.fla | Bin 0 -> 6542 bytes .../test.swf | Bin 0 -> 2484 bytes .../EventWatcher.as | 37 + .../LeftButton.as | 25 + .../MainTimeline.as | 72 ++ .../RightButton.as | 23 + .../input.json | 128 ++++ .../output.txt | 562 +++++++++++++++ .../test.fla | Bin 0 -> 6542 bytes .../test.swf | Bin 0 -> 2523 bytes 25 files changed, 2627 insertions(+) create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/LeftButton.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/RightButton.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/input.json create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/test.swf create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickplay/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickplay/LeftButton.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickplay/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickplay/RightButton.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickplay/input.json create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickplay/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickplay/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickplay/test.swf create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/LeftButton.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/RightButton.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/input.json create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/test.swf diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index c71297c84c61..792ecba6dd8d 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -373,6 +373,9 @@ 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_clickgoto, "avm2/movieclip_displayevents_clickgoto", 32), + (as3_movieclip_displayevents_clickplay, "avm2/movieclip_displayevents_clickplay", 32), + (as3_movieclip_displayevents_clicksymbol, "avm2/movieclip_displayevents_clicksymbol", 32), (as3_movieclip_displayevents_constructframegoto, "avm2/movieclip_displayevents_constructframegoto", 12), (as3_movieclip_displayevents_constructframeplay, "avm2/movieclip_displayevents_constructframeplay", 6), (as3_movieclip_displayevents_constructframesymbol, "avm2/movieclip_displayevents_constructframesymbol", 12), diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/EventWatcher.as new file mode 100644 index 000000000000..ebd28f313556 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/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_clickgoto/LeftButton.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/LeftButton.as new file mode 100644 index 000000000000..1f334095f6c3 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/LeftButton.as @@ -0,0 +1,22 @@ +package { + import flash.events.MouseEvent; + import flash.events.Event; + + public class LeftButton extends EventWatcher { + public function LeftButton() { + super(); + + this.addEventListener(MouseEvent.CLICK, this.clicked); + this.stop(); + } + + public function clicked(event: Event) { + trace("///(LeftButton clicked...)"); + trace("///this.gotoAndStop(2);"); + this.gotoAndStop(2); + + trace("///this.parent.r_button.gotoAndStop(1);"); + this.parent.r_button.gotoAndStop(1); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/MainTimeline.as new file mode 100644 index 000000000000..87896dbb38e4 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/MainTimeline.as @@ -0,0 +1,70 @@ +package { + import flash.display.MovieClip; + import flash.display.DisplayObject; + import flash.display.DisplayObjectContainer; + import flash.display.Shape; + 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(from: DisplayObject) { + if (from instanceof DisplayObjectContainer) { + var child, num_children = 0; + + // We don't want to test null children, so lie about the child count. + for (var i = 0; i < from.numChildren; i += 1) { + if (from.getChildAt(i)) { + num_children += 1; + } + } + + trace("/// (Container:", from.name, "with", num_children, "children)"); + + for (var i = 0; i < from.numChildren; i += 1) { + child = from.getChildAt(i); + if (child) { + this.inspect(child); + } + } + } else if (from instanceof Shape) { + // Do nothing, since shapes will cause us to test the global instance count. + } else { + trace("/// (Unknown:", from.name, ")"); + } + } + + function enter_frame_controller(evt: Event) { + this.invocation++; + + if (this.invocation == 30) { + this.destroy_me = true; + } + + this.inspect(this); + } + + function exit_frame_controller(evt: Event) { + this.inspect(this); + + if (this.destroy_me) { + this.destroy(); + this.l_button.destroy(); + this.r_button.destroy(); + + this.removeEventListener(Event.ENTER_FRAME, this.enter_frame_controller); + this.removeEventListener(Event.EXIT_FRAME, this.exit_frame_controller); + + this.stop(); + } + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/RightButton.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/RightButton.as new file mode 100644 index 000000000000..1da3698f182f --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/RightButton.as @@ -0,0 +1,22 @@ +package { + import flash.events.MouseEvent; + import flash.events.Event; + + public class RightButton extends EventWatcher { + public function RightButton() { + super(); + + this.addEventListener(MouseEvent.CLICK, this.clicked); + this.stop(); + } + + public function clicked(event: Event) { + trace("///(RightButton clicked...)"); + trace("///this.gotoAndPlay(1);"); + this.gotoAndPlay(1); + + trace("///this.parent.l_button.gotoAndPlay(2);"); + this.parent.l_button.gotoAndPlay(2); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/input.json b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/input.json new file mode 100644 index 000000000000..198f40389a02 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/input.json @@ -0,0 +1,112 @@ +[ + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + } +] \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/output.txt new file mode 100644 index 000000000000..c07455a3a87c --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/output.txt @@ -0,0 +1,676 @@ +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +l_button (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +r_button (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 1 +///RightButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(LeftButton clicked...) +///this.gotoAndStop(2); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///this.parent.r_button.gotoAndStop(1); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(RightButton clicked...) +///this.gotoAndPlay(1); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///this.parent.l_button.gotoAndPlay(2); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 0 children) +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 2 +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 0 children) +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +///LeftButton Frame 2 +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(LeftButton clicked...) +///this.gotoAndStop(2); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///this.parent.r_button.gotoAndStop(1); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(RightButton clicked...) +///this.gotoAndPlay(1); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///this.parent.l_button.gotoAndPlay(2); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 0 children) +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +///LeftButton Frame 2 +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 0 children) +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 2 +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 0 children) +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +///LeftButton Frame 2 +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(LeftButton clicked...) +///this.gotoAndStop(2); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///this.parent.r_button.gotoAndStop(1); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..d9e4162c9887e02b6df1d4c5dd37f324b49d7752 GIT binary patch literal 6542 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 Z{^LQQp^S!p{S6M{V~CK{+SfD>_&<^t)SCbR literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..c16d2dbe50ed6fd14de242bde6ee53fdee576979 GIT binary patch literal 2516 zcmV;_2`lzPS5qrc6952soUK?(QybY8zPBIhzEbNgKoTzjvJJM39@yXkdkjXhVGM2$ z4;#;jk%Z_rvO!{`2G682RWq(is*|t;TY?D9WrYf6c z5pu3tj~3R<%0S=l@4U~s=d`Z)0`WP7+%FIcvMB8p5kia1>FMdP=O`3SMrS^bZv7;F z`^oOzC&^ozS1LQ3pWpd%Z6TRJ-}N{^7Nhl|QdS~KgiZs=IwAYVC+m-XgR*}q`M>!k z!Wf;Zr>8goyi@q|UakJ?@GIxYtG^BU{`vY^Q;q4Oc8Y#Xjf8;3g5u9@HVkgjJo=f9 z#Xy)xO{*Nr{=4w&k)NXM|MDBlX@&R}Z){l!-jdG*)d`Tz4e{dGf)@1oWj%vrU1 zFt%neTq_v99?W+(Kdk35NDMss^Y77qZs$nTD&;1Fg*=A7`O_cnS6hrg)k|v$KOQs* zb`kmlg)+xVS$kN}ihD{mZUvIMU#RU(DwI^?>zrVRuvRS;m0X?g>tNIr?dUMjLE2Sn zTD9_J&x)dIx9Z`<+mAjAwYXm@K2>(T7Lr;m94N_mD5=nDp;X=|9Vq*yvJ$rfry2Tg zsdl(u_|lm+@AA$QrKkluv`XdLArQwph!D3@&DEXcij^`1zQ3}P{C~5DA_&Y?* zxVz9&U1(E%Yo*6~%>*saek;9E9iNqEx_OtBlB_#GRx8IPWpTfB=&@bHV279S|Tqzc`5zQ}I+HF&*DID(!2fa$iS-&9-VA=%lY7R!f=^?Id<| z<051UHC3v^okGjBK82!II#x`<{vReX5=R!fJPyMq}`*jFn@H8UN4ab%SlV8xHc5Rgly}!bd^|NV=dj=lO_{?2-K@#xuyyDpC+2J>zX!xE z&g#)dl9o5@?5sJ`T?JF`3Z~xM+*w~9bnedJXp&Q_l>@%GSK8l|%0~ye`V%CDOZLZ# zwn))}<^axOgW-l8BIB*SpXHvFv^~;Po8Z^?3WtibF0@>CO}R&*BMIIo5jP9iJBw zb0Cr(pAF4Ib(c+blTCG(o$4k#_27Ng)$-PbGI}~;G}TZ0&qDmM2D}drXfru1_-q62 zpJ~9l4m2&~ZvEV9wx0F#%Tm%VqNy&TsexX$*V&7Mp*|cO3XTTP@ge@QI2jIws|35-i%Ljn^P_IEKt&(vQh?Om1NE zAtpC5na5-SlUtZ9Vv@!r#0qRiz_$hFj=(Gl%rXgcVfgh;N7CrR>u7`<$LO@mrD8IqNn44MY4x-dnvaM zuAoWfSdMTA`UI@N;hPoU04}n`h6I*iB-$||4vg#)O9bS!J82{?_{IYVYfxvsG$6YV zBbOf|cK{;~D0o4^*MpJY%@PsyQagP>4gxtuGm{_^j>jw<^c`3P=K(BnmiKjO~uVNzAb62}97Aks<1GFER-57?!a+qQG@X>9m_uuchnU7b;{MKL7?zzAU=0FRyk{^rR815+6W z==L`K;mKB;?tql-Q;_mUkn#uJQ)UzS*)2TSOj`t5nzqzV+bMwc`IAR9bclM+O#3=b z`$m+})eq%4o8h9lyY>7{bzWB&}r!JbyFt zyvV)9pCZ2zc$v?9>-#N2Z*dm)yv5rLET6GKxnMIf`8ynaC~`a8OZ86AKTc1Lq3xwu;ibA9+j$);%1gWvF>Q=d8zZKT=ieKn zuYB-kF~;;)@<-T+blUm*>8WP`xaVKy?|$op3H89V8xvqzp_Wy7i8U@ker|?yNHdV$ zWxBM}6iTm92A>jUCEaI!D>q=kx*Q2+P}aj literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/EventWatcher.as new file mode 100644 index 000000000000..ebd28f313556 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/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_clickplay/LeftButton.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/LeftButton.as new file mode 100644 index 000000000000..2ac66e6c6efb --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/LeftButton.as @@ -0,0 +1,22 @@ +package { + import flash.events.MouseEvent; + import flash.events.Event; + + public class LeftButton extends EventWatcher { + public function LeftButton() { + super(); + + this.addEventListener(MouseEvent.CLICK, this.clicked); + this.stop(); + } + + public function clicked(event: Event) { + trace("///(LeftButton clicked...)"); + trace("///this.stop();"); + this.stop(); + + trace("///this.parent.r_button.stop();"); + this.parent.r_button.stop(); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/MainTimeline.as new file mode 100644 index 000000000000..87896dbb38e4 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/MainTimeline.as @@ -0,0 +1,70 @@ +package { + import flash.display.MovieClip; + import flash.display.DisplayObject; + import flash.display.DisplayObjectContainer; + import flash.display.Shape; + 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(from: DisplayObject) { + if (from instanceof DisplayObjectContainer) { + var child, num_children = 0; + + // We don't want to test null children, so lie about the child count. + for (var i = 0; i < from.numChildren; i += 1) { + if (from.getChildAt(i)) { + num_children += 1; + } + } + + trace("/// (Container:", from.name, "with", num_children, "children)"); + + for (var i = 0; i < from.numChildren; i += 1) { + child = from.getChildAt(i); + if (child) { + this.inspect(child); + } + } + } else if (from instanceof Shape) { + // Do nothing, since shapes will cause us to test the global instance count. + } else { + trace("/// (Unknown:", from.name, ")"); + } + } + + function enter_frame_controller(evt: Event) { + this.invocation++; + + if (this.invocation == 30) { + this.destroy_me = true; + } + + this.inspect(this); + } + + function exit_frame_controller(evt: Event) { + this.inspect(this); + + if (this.destroy_me) { + this.destroy(); + this.l_button.destroy(); + this.r_button.destroy(); + + this.removeEventListener(Event.ENTER_FRAME, this.enter_frame_controller); + this.removeEventListener(Event.EXIT_FRAME, this.exit_frame_controller); + + this.stop(); + } + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/RightButton.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/RightButton.as new file mode 100644 index 000000000000..eec99ca3117c --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/RightButton.as @@ -0,0 +1,22 @@ +package { + import flash.events.MouseEvent; + import flash.events.Event; + + public class RightButton extends EventWatcher { + public function RightButton() { + super(); + + this.addEventListener(MouseEvent.CLICK, this.clicked); + this.stop(); + } + + public function clicked(event: Event) { + trace("///(RightButton clicked...)"); + trace("///this.play();"); + this.play(); + + trace("///this.parent.l_button.play();"); + this.parent.l_button.play(); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/input.json b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/input.json new file mode 100644 index 000000000000..198f40389a02 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/input.json @@ -0,0 +1,112 @@ +[ + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + } +] \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/output.txt new file mode 100644 index 000000000000..ae6ed80255c0 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/output.txt @@ -0,0 +1,575 @@ +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +l_button (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +r_button (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 1 +///RightButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(LeftButton clicked...) +///this.stop(); +///this.parent.r_button.stop(); +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(RightButton clicked...) +///this.play(); +///this.parent.l_button.play(); +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +///LeftButton Frame 2 +///RightButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 0 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 1 +///RightButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +///LeftButton Frame 2 +///RightButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 0 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +///LeftButton Frame 1 +///RightButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 2 +///RightButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(LeftButton clicked...) +///this.stop(); +///this.parent.r_button.stop(); +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(RightButton clicked...) +///this.play(); +///this.parent.l_button.play(); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 0 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 1 +///RightButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +///LeftButton Frame 2 +///RightButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 0 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +///LeftButton Frame 1 +///RightButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 2 +///RightButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 0 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +///LeftButton Frame 1 +///RightButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +///LeftButton Frame 2 +///RightButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(LeftButton clicked...) +///this.stop(); +///this.parent.r_button.stop(); +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..d9e4162c9887e02b6df1d4c5dd37f324b49d7752 GIT binary patch literal 6542 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 Z{^LQQp^S!p{S6M{V~CK{+SfD>_&<^t)SCbR literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_clickplay/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..95fe22bcde7d4022b12572644b1b6ec405921d24 GIT binary patch literal 2484 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 literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/EventWatcher.as new file mode 100644 index 000000000000..ebd28f313556 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/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_clicksymbol/LeftButton.as b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/LeftButton.as new file mode 100644 index 000000000000..6c37f25e947b --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/LeftButton.as @@ -0,0 +1,25 @@ +package { + import flash.events.MouseEvent; + import flash.events.Event; + + public class LeftButton extends EventWatcher { + public function LeftButton() { + super(); + + this.addEventListener(MouseEvent.CLICK, this.clicked); + this.stop(); + } + + public function clicked(event: Event) { + trace("///(LeftButton clicked...)"); + + if (this.parent.left_shark === null) { + var ew = new EventWatcher(); + ew.name = "left_shark"; + + this.parent.addChild(ew); + this.parent.left_shark = ew; + } + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/MainTimeline.as new file mode 100644 index 000000000000..1d4f680bdc57 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/MainTimeline.as @@ -0,0 +1,72 @@ +package { + import flash.display.MovieClip; + import flash.display.DisplayObject; + import flash.display.DisplayObjectContainer; + import flash.display.Shape; + 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(from: DisplayObject) { + if (from instanceof DisplayObjectContainer) { + var child, num_children = 0; + + // We don't want to test null children, so lie about the child count. + for (var i = 0; i < from.numChildren; i += 1) { + if (from.getChildAt(i)) { + num_children += 1; + } + } + + trace("/// (Container:", from.name, "with", num_children, "children)"); + + for (var i = 0; i < from.numChildren; i += 1) { + child = from.getChildAt(i); + if (child) { + this.inspect(child); + } + } + } else if (from instanceof Shape) { + // Do nothing, since shapes will cause us to test the global instance count. + } else { + trace("/// (Unknown:", from.name, ")"); + } + } + + var left_shark = null; + + function enter_frame_controller(evt: Event) { + this.invocation++; + + if (this.invocation == 30) { + this.destroy_me = true; + } + + this.inspect(this); + } + + function exit_frame_controller(evt: Event) { + this.inspect(this); + + if (this.destroy_me) { + this.destroy(); + this.l_button.destroy(); + this.r_button.destroy(); + + this.removeEventListener(Event.ENTER_FRAME, this.enter_frame_controller); + this.removeEventListener(Event.EXIT_FRAME, this.exit_frame_controller); + + this.stop(); + } + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/RightButton.as b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/RightButton.as new file mode 100644 index 000000000000..e71394b12742 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/RightButton.as @@ -0,0 +1,23 @@ +package { + import flash.events.MouseEvent; + import flash.events.Event; + + public class RightButton extends EventWatcher { + public function RightButton() { + super(); + + this.addEventListener(MouseEvent.CLICK, this.clicked); + this.stop(); + } + + public function clicked(event: Event) { + trace("///(RightButton clicked...)"); + + if (this.parent.left_shark) { + this.parent.removeChild(this.parent.left_shark); + this.parent.left_shark.destroy(); + this.parent.left_shark = null; + } + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/input.json b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/input.json new file mode 100644 index 000000000000..1075d9b5c3d9 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/input.json @@ -0,0 +1,128 @@ +[ + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + } +] \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/output.txt new file mode 100644 index 000000000000..1f858a66a9fb --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/output.txt @@ -0,0 +1,562 @@ +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +l_button (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +r_button (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 1 +///RightButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(LeftButton clicked...) +left_shark (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +left_shark (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +left_shark (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +left_shark (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +left_shark (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +left_shark (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///(RightButton clicked...) +left_shark (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +left_shark (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(LeftButton clicked...) +left_shark (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +left_shark (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +left_shark (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +left_shark (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///(RightButton clicked...) +left_shark (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +left_shark (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +///(LeftButton clicked...) +left_shark (frame 0):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +left_shark (frame 0):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +left_shark (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +left_shark (frame 0):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +/// (Container: left_shark with 0 children) +left_shark (frame 0):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +///(RightButton clicked...) +left_shark (frame 0):[Event type="removed" bubbles=true cancelable=false eventPhase=2] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +left_shark (frame 0):[Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 2 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 1 children) \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..d9e4162c9887e02b6df1d4c5dd37f324b49d7752 GIT binary patch literal 6542 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 Z{^LQQp^S!p{S6M{V~CK{+SfD>_&<^t)SCbR literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_clicksymbol/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..0950e1cb3f8ebbd8ad5bffbd45b58ff7f7b8c73d GIT binary patch literal 2523 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 literal 0 HcmV?d00001 From 1e4aec88525b0f6ab8f65005f842f8cf99c8bfcf Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sat, 30 Apr 2022 23:43:11 -0400 Subject: [PATCH 14/47] tests: Add a second, more thorough `clickgoto2` test --- tests/tests/regression_tests.rs | 1 + .../EventWatcher.as | 37 + .../LeftButton.as | 22 + .../MainTimeline.as | 71 + .../MiddleButton.as | 22 + .../RightButton.as | 22 + .../input.json | 314 +++ .../output.txt | 2001 +++++++++++++++++ .../test.fla | Bin 0 -> 8408 bytes .../test.swf | Bin 0 -> 2896 bytes 10 files changed, 2490 insertions(+) create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/EventWatcher.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/LeftButton.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/MainTimeline.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/MiddleButton.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/RightButton.as create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/input.json create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/test.swf diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 792ecba6dd8d..31da6eeac9e1 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -374,6 +374,7 @@ swf_tests! { (as3_movieclip_dispatchevent_target, "avm2/movieclip_dispatchevent_target", 1), (as3_movieclip_dispatchevent, "avm2/movieclip_dispatchevent", 1), (as3_movieclip_displayevents_clickgoto, "avm2/movieclip_displayevents_clickgoto", 32), + (as3_movieclip_displayevents_clickgoto2, "avm2/movieclip_displayevents_clickgoto2", 46), (as3_movieclip_displayevents_clickplay, "avm2/movieclip_displayevents_clickplay", 32), (as3_movieclip_displayevents_clicksymbol, "avm2/movieclip_displayevents_clicksymbol", 32), (as3_movieclip_displayevents_constructframegoto, "avm2/movieclip_displayevents_constructframegoto", 12), diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/EventWatcher.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/EventWatcher.as new file mode 100644 index 000000000000..ebd28f313556 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/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_clickgoto2/LeftButton.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/LeftButton.as new file mode 100644 index 000000000000..1f334095f6c3 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/LeftButton.as @@ -0,0 +1,22 @@ +package { + import flash.events.MouseEvent; + import flash.events.Event; + + public class LeftButton extends EventWatcher { + public function LeftButton() { + super(); + + this.addEventListener(MouseEvent.CLICK, this.clicked); + this.stop(); + } + + public function clicked(event: Event) { + trace("///(LeftButton clicked...)"); + trace("///this.gotoAndStop(2);"); + this.gotoAndStop(2); + + trace("///this.parent.r_button.gotoAndStop(1);"); + this.parent.r_button.gotoAndStop(1); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/MainTimeline.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/MainTimeline.as new file mode 100644 index 000000000000..98147e75f66c --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/MainTimeline.as @@ -0,0 +1,71 @@ +package { + import flash.display.MovieClip; + import flash.display.DisplayObject; + import flash.display.DisplayObjectContainer; + import flash.display.Shape; + 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(from: DisplayObject) { + if (from instanceof DisplayObjectContainer) { + var child, num_children = 0; + + // We don't want to test null children, so lie about the child count. + for (var i = 0; i < from.numChildren; i += 1) { + if (from.getChildAt(i)) { + num_children += 1; + } + } + + trace("/// (Container:", from.name, "with", num_children, "children)"); + + for (var i = 0; i < from.numChildren; i += 1) { + child = from.getChildAt(i); + if (child) { + this.inspect(child); + } + } + } else if (from instanceof Shape) { + // Do nothing, since shapes will cause us to test the global instance count. + } else { + trace("/// (Unknown:", from.name, ")"); + } + } + + function enter_frame_controller(evt: Event) { + this.invocation++; + + if (this.invocation == 45) { + this.destroy_me = true; + } + + this.inspect(this); + } + + function exit_frame_controller(evt: Event) { + this.inspect(this); + + if (this.destroy_me) { + this.destroy(); + this.l_button.destroy(); + this.m_button.destroy(); + this.r_button.destroy(); + + this.removeEventListener(Event.ENTER_FRAME, this.enter_frame_controller); + this.removeEventListener(Event.EXIT_FRAME, this.exit_frame_controller); + + this.stop(); + } + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/MiddleButton.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/MiddleButton.as new file mode 100644 index 000000000000..8634b0e36052 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/MiddleButton.as @@ -0,0 +1,22 @@ +package { + import flash.events.MouseEvent; + import flash.events.Event; + + public class MiddleButton extends EventWatcher { + public function MiddleButton() { + super(); + + this.addEventListener(MouseEvent.CLICK, this.clicked); + this.stop(); + } + + public function clicked(event: Event) { + trace("///(MiddleButton clicked...)"); + trace("///this.parent.r_button.gotoAndPlay(1);"); + this.parent.r_button.gotoAndPlay(1); + + trace("///this.parent.l_button.gotoAndPlay(2);"); + this.parent.l_button.gotoAndPlay(2); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/RightButton.as b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/RightButton.as new file mode 100644 index 000000000000..28f0a482ae8c --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/RightButton.as @@ -0,0 +1,22 @@ +package { + import flash.events.MouseEvent; + import flash.events.Event; + + public class RightButton extends EventWatcher { + public function RightButton() { + super(); + + this.addEventListener(MouseEvent.CLICK, this.clicked); + this.stop(); + } + + public function clicked(event: Event) { + trace("///(RightButton clicked...)"); + trace("///this.gotoAndStop(2);"); + this.gotoAndStop(2); + + trace("///this.parent.l_button.gotoAndStop(1);"); + this.parent.l_button.gotoAndStop(1); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/input.json b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/input.json new file mode 100644 index 000000000000..5e24c273258f --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/input.json @@ -0,0 +1,314 @@ +[ + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [270.0, 100.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [270.0, 100.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [270.0, 100.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [270.0, 100.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [270.0, 100.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [270.0, 100.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [420.0, 280.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [270.0, 100.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [270.0, 100.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseDown", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + }, + { + "type": "MouseUp", + "pos": [150.0, 275.0], + "btn": "Left" + }, + { + "type": "Wait" + } +] \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/output.txt b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/output.txt new file mode 100644 index 000000000000..107749636c45 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/output.txt @@ -0,0 +1,2001 @@ +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +l_button (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +r_button (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +m_button (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=2] +root1 (frame 1):[Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 1 +///RightButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///(LeftButton clicked...) +///this.gotoAndStop(2); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.r_button.gotoAndStop(1); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///(RightButton clicked...) +///this.gotoAndStop(2); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.l_button.gotoAndStop(1); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///(LeftButton clicked...) +///this.gotoAndStop(2); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.r_button.gotoAndStop(1); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///(RightButton clicked...) +///this.gotoAndStop(2); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.l_button.gotoAndStop(1); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///(LeftButton clicked...) +///this.gotoAndStop(2); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.r_button.gotoAndStop(1); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///(MiddleButton clicked...) +///this.parent.r_button.gotoAndPlay(1); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.l_button.gotoAndPlay(2); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +///LeftButton Frame 2 +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///(RightButton clicked...) +///this.gotoAndStop(2); +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.l_button.gotoAndStop(1); +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///(LeftButton clicked...) +///this.gotoAndStop(2); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.r_button.gotoAndStop(1); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///(MiddleButton clicked...) +///this.parent.r_button.gotoAndPlay(1); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.l_button.gotoAndPlay(2); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 2 +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///(RightButton clicked...) +///this.gotoAndStop(2); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.l_button.gotoAndStop(1); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///(LeftButton clicked...) +///this.gotoAndStop(2); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.r_button.gotoAndStop(1); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///(LeftButton clicked...) +///this.gotoAndStop(2); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.r_button.gotoAndStop(1); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///(RightButton clicked...) +///this.gotoAndStop(2); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.l_button.gotoAndStop(1); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///(MiddleButton clicked...) +///this.parent.r_button.gotoAndPlay(1); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.l_button.gotoAndPlay(2); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 2 +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///(LeftButton clicked...) +///this.gotoAndStop(2); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.r_button.gotoAndStop(1); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///(RightButton clicked...) +///this.gotoAndStop(2); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.l_button.gotoAndStop(1); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +///(MiddleButton clicked...) +///this.parent.r_button.gotoAndPlay(1); +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///RightButton Frame 1 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.l_button.gotoAndPlay(2); +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +///LeftButton Frame 2 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 3):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 0 children) +/// (Container: r_button with 1 children) +/// (Container: m_button with 1 children) +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +///LeftButton Frame 1 +///RightButton Frame 2 +l_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame1 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame2 with 0 children) +/// (Container: m_button with 1 children) +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +root1 (frame 1):[Event type="removed" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 1 children) +/// (Container: r_button with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +r_button (frame 1):[Event type="added" bubbles=true cancelable=false eventPhase=3] +root1 (frame 2):[Event type="added" bubbles=true cancelable=false eventPhase=3] +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 2 +///LeftButton Frame 2 +///RightButton Frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///(LeftButton clicked...) +///this.gotoAndStop(2); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +///this.parent.r_button.gotoAndStop(1); +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 3 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 3):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) +l_button (frame 2):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2] +//MainTimeline frame 1 +l_button (frame 2):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +r_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +m_button (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +root1 (frame 1):[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2] +/// (Container: root1 with 3 children) +/// (Container: l_button with 2 children) +/// (Container: l_frame2 with 0 children) +/// (Container: r_button with 2 children) +/// (Container: r_frame1 with 0 children) +/// (Container: m_button with 1 children) \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/test.fla b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..ff10bdf79e6bfc60d5770f05a62ae050caf49d32 GIT binary patch literal 8408 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 literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/test.swf b/tests/tests/swfs/avm2/movieclip_displayevents_clickgoto2/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..8227a49b848b49ab6b3add9b1e0c9b22faf9c7e8 GIT binary patch literal 2896 zcmV-W3$OG;S5qtE761TvoUK<)Y#YZFp4lJn4*&loQPdx0(Xu7cB1QQxQY>30X-A1A zI-+dJ2_2E5b}iZz$&i$6r*3zahHe?iZKTV2Sd)C-r!WQ zdN+9WUhI>L)r~W2@87<6|6Mt?3cvXXdfH_HTZ~dUsVD`e5IXQq)dlGX<)1(L45dFU zrGE2MgfWsqhrOUXfM3_Ciht*!?H|wo^o6_k#mpW$AWl#*F!5893BvXO8@qD z>c%fo`VV;z_ylJM@`1tG-^&ke!_WUb;Qrf-vmhaq00&;$PWTQ^4$yZxF*Ti#B#Z)N zSkI3|=&8vKl2HcYc-6P|D(iA3yDd$DH6t+S$0im-%%>*m|1<-BykCy*Vbm~->M|2i z`k&cf3_n2W|7BJd?$XSrjr6Mj{mDZsdH%;QJpXwS-)l@G9i|xx9iCRFU~W~dQm*DT%*q$5We|=Sgpjw?Xr%RAsR)S|3R2~W z(dJ&h_L_;uV4~&SK^E;Go9BU_o%gL$trVS|)mL;fTXh}6!PCQAwOV;5 z9L{c*Hl)d1X*)chnhr-Jk<;OgoqVB|FZLK(d8V~2UZXr!uH(7LlIvuLl81Y(<)cb`iLM6q(@p?rA*4$2|0=i2SF=I29 z#L`M)dHvGz{9?kH-Q27@x{|Nf;3HQtC)O5LG#x)5k0;{x`nbN5Tu-gcUrxB{s`XfM zDYdeEEw++~3(JYcS>1s_jH=tq8)Yz;^(|3WnE?7O=z?AMV zpPA8iR!76=>xOS|=jqQGy7La<;1nlUO51#HD__{O7I(JS>u@jcKf~S4*S1J=+8CeO%9bTt-RN5JPO)^iID^MnX}8uLHhh}`+Lo9ye21Eq z>TDbBWE<^lJKf24`VAIVcS6?-YsA55KkY%iRNsZ))nQj5DD5zd4j-OV=rjj9dG(EP z)O~M&lG6x-(|weoPWWvE4=3B)La=!HuXc0u=)c~&p6Fm2?O+-WbhF*IZtUyp!M=cR z)Hmjv;QRPf;%R@M|BU~v|1JNFf7bstAK+K~0e+O<@Q?Ci{9XSTKfyorPq=Mn3(H$M zo894bxjl9R!kFbLX6)WBc$m5ya)%LOjzW8n4@RN4X=8-=5N0?E9sWKT#r~#|-H17g z>;r=^lA)$wBg7nqI|Ake#xAgZ0@E+>0|GlJutNeH5ZGaXJtD9p0v{CkqXIiBu*U@U zxWJAH?6|;A2z*H3PYC>^z=s7sBJfiJ8x`1TGKk3>Cg(Ak$An`@43hy&;+P~bxrE7O zOy0p{0h4zzc@L8-nDns%yC~o#fk_I?Re^b*^m8P|lORuy^5mL{T<6IMPvSgT<;fgR zKHy23C*wQ`u%u5QDUk$4a#SQ!BH;*$i6ktNxJVKriHPK?ncNb|mPqDAa$Y2pA}N?j zNF*mjG9;2?A~`OSagkgR$*M^DEaaM%T(^-C8;RSbqYiS-Nv=D{h=ar(WYt0D9OMHBNju0f2blm%*N}FDpchHZ@6|7G^xCFLas9Rh z8nRcv2_aMGu!{!wXpz}2nz6YXBYO`< z4j)ENnB{_5?p};ME*5U9-58wpcvwP^pZ8PeeT@ixVA~J21GFAi$iElyJZ3p402U!d zFSc`-@nIK-*g@>!5H|$(Nn&P|$YltQvDxC?KdG9Oh$<)xNEMZ2KT-+k7?v?xf}pb~ zkyrQ}vZ&UZ1ByHty6{Aihn|EkK6&;eIe=9g*s?76`50^+;K!+C0`jmTA4!fds*8eP z1Gp(T+5jF3MjOCO!LbJDqTqM~bWP=r;^j0wj4ysoR-fh^4a8D zjA~YrGf1_-T#;cc)^jk|rmc-lwcnf#ttDr%>VTIU^u?(JndIA8b%WqTD)1=sIe9LK zsn82f2m=W?l?do>?ti3WYQuos+?KEJXWDWLP&Q8kgykFSQ($pdAd5!i(N;?*06gi%pH>q~Y-JxU>@+C#SoP39&O_h)r6!~2WT;RuU z;w{#f7#w+&$nfK@habNjew^c8;T-a)-e;NjzH)z#&?~%&yIx_5fk9?{bO@+jLG<{g z>Vq-IIpJ6#YVWfR?$QSI{*@%U@?$a6QGOX`U7Jb4wX0i&P492_|NK|A^^^Zr+E*r!fApfT{g zO+6QrORPEp{2UBtv7P~XC+HHF&d{@KgtFS5%bD>7GMLX z_-l+h-zq+Un3BAK)C9zEH5+9qRNns>8f8gq6n9%**{`QUztfg`n~jxKMG1Xl zV|}p3v>M9}wkDX`)o!eA7Q7Gd@3zk}*gPM~X+^%7{HVTp*0s&kLpRSn80t1pCUh^E zp_?ZYx=&x6iky`9Q=nfESi2dx`m}T4fu2e!^!;RsQYpbXP->h5 zWlEzI`T-RHjgRFDa4Tyx`suQ`VOdI{J-q)2!@`ubg&AmT9^?HV>NJB*>JNZ=^&6?z u*0>gR57<)b=RLDX`$o2JVelQ-{Y?qqc>Q1TV6DGcpbPbX2>lTJe literal 0 HcmV?d00001 From a8bdda43a6bb58c6d90feef73682e0b585d13c27 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 17 May 2022 21:32:43 -0400 Subject: [PATCH 15/47] tests: Ignore the `as3_simplebutton_constr_childevents` test as it is broken by fixes I moved to another PR --- tests/tests/regression_tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 31da6eeac9e1..587dfc539dda 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -452,7 +452,7 @@ swf_tests! { (as3_simplebutton_childevents, "avm2/simplebutton_childevents", 2), (as3_simplebutton_childprops, "avm2/simplebutton_childprops", 1), (as3_simplebutton_childshuffle, "avm2/simplebutton_childshuffle", 1), - (as3_simplebutton_constr_childevents, "avm2/simplebutton_constr_childevents", 2), + #[ignore] (as3_simplebutton_constr_childevents, "avm2/simplebutton_constr_childevents", 2), //Broken by other accuracy fixes (as3_simplebutton_constr_params, "avm2/simplebutton_constr_params", 1), (as3_simplebutton_constr, "avm2/simplebutton_constr", 2), (as3_simplebutton_mouseenabled, "avm2/simplebutton_mouseenabled", 1), From dfca46c92eeec4b8b74e21e57820b60858ea92c7 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Fri, 7 Jan 2022 22:11:03 -0500 Subject: [PATCH 16/47] tests: Add a goto-and-stop test that inspects the children after the goto. --- tests/tests/regression_tests.rs | 1 + .../MainDocument.as | 17 +++++++++++++++++ .../movieclip_gotoandstop_children/output.txt | 4 ++++ .../movieclip_gotoandstop_children/test.fla | Bin 0 -> 6240 bytes .../movieclip_gotoandstop_children/test.swf | Bin 0 -> 774 bytes 5 files changed, 22 insertions(+) create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_children/MainDocument.as create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_children/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_children/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_children/test.swf diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index 587dfc539dda..f252d1cfb2c5 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -395,6 +395,7 @@ swf_tests! { (as3_movieclip_goto_during_frame_script, "avm2/movieclip_goto_during_frame_script", 1), (as3_movieclip_gotoandplay, "avm2/movieclip_gotoandplay", 5), (as3_movieclip_gotoandstop, "avm2/movieclip_gotoandstop", 5), + (as3_movieclip_gotoandstop_children, "avm2/movieclip_gotoandstop_children", 1), (as3_movieclip_gotoandstop_queueing, "avm2/movieclip_gotoandstop_queueing", 2), (as3_movieclip_next_frame, "avm2/movieclip_next_frame", 5), (as3_movieclip_next_scene, "avm2/movieclip_next_scene", 5), diff --git a/tests/tests/swfs/avm2/movieclip_gotoandstop_children/MainDocument.as b/tests/tests/swfs/avm2/movieclip_gotoandstop_children/MainDocument.as new file mode 100644 index 000000000000..dcd86473e664 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_gotoandstop_children/MainDocument.as @@ -0,0 +1,17 @@ +package { + import flash.display.MovieClip; + + public class MainDocument extends MovieClip { + public function MainDocument() { + trace("/// this.child.gotoAndStop(2)"); + this.child.gotoAndStop(2); + + trace("/// (Grandchildren of this.child...)"); + for (var i = 0; i < this.child.numChildren; i += 1) { + trace("Child: " + this.child.getChildAt(i).name); + } + + this.stop(); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_gotoandstop_children/output.txt b/tests/tests/swfs/avm2/movieclip_gotoandstop_children/output.txt new file mode 100644 index 000000000000..4fa500d3fc38 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_gotoandstop_children/output.txt @@ -0,0 +1,4 @@ +/// this.child.gotoAndStop(2) +/// (Grandchildren of this.child...) +Child: grandchild_a +Child: grandchild_b diff --git a/tests/tests/swfs/avm2/movieclip_gotoandstop_children/test.fla b/tests/tests/swfs/avm2/movieclip_gotoandstop_children/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..9ba63eaad50721558b15a8c4a1640ccafc0def51 GIT binary patch literal 6240 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 E=Tzx)jsO4v literal 0 HcmV?d00001 From 118b272e7f493b51eccde9a1f0faba03c0ea218a Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sat, 8 Jan 2022 14:33:23 -0500 Subject: [PATCH 17/47] tests: Add tests for gotos interacting with frame scripts. --- tests/tests/regression_tests.rs | 3 +++ .../MainDocument.as | 14 +++++++++++++ .../output.txt | 4 ++++ .../test.fla | Bin 0 -> 6370 bytes .../test.swf | Bin 0 -> 968 bytes .../MainDocument.as | 14 +++++++++++++ .../output.txt | 4 ++++ .../test.fla | Bin 0 -> 6370 bytes .../test.swf | Bin 0 -> 968 bytes .../MainDocument.as | 19 ++++++++++++++++++ .../output.txt | 7 +++++++ .../test.fla | Bin 0 -> 4254 bytes .../test.swf | Bin 0 -> 606 bytes 13 files changed, 65 insertions(+) create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/MainDocument.as create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/test.swf create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts2/MainDocument.as create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts2/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts2/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts2/test.swf create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/MainDocument.as create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/output.txt create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/test.fla create mode 100644 tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/test.swf diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index f252d1cfb2c5..4d83918c8111 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -396,6 +396,9 @@ swf_tests! { (as3_movieclip_gotoandplay, "avm2/movieclip_gotoandplay", 5), (as3_movieclip_gotoandstop, "avm2/movieclip_gotoandstop", 5), (as3_movieclip_gotoandstop_children, "avm2/movieclip_gotoandstop_children", 1), + (as3_movieclip_gotoandstop_framescripts1, "avm2/movieclip_gotoandstop_framescripts1", 1), + (as3_movieclip_gotoandstop_framescripts2, "avm2/movieclip_gotoandstop_framescripts2", 1), + (as3_movieclip_gotoandstop_framescripts_self, "avm2/movieclip_gotoandstop_framescripts_self", 1), (as3_movieclip_gotoandstop_queueing, "avm2/movieclip_gotoandstop_queueing", 2), (as3_movieclip_next_frame, "avm2/movieclip_next_frame", 5), (as3_movieclip_next_scene, "avm2/movieclip_next_scene", 5), diff --git a/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/MainDocument.as b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/MainDocument.as new file mode 100644 index 000000000000..c150a63028e8 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/MainDocument.as @@ -0,0 +1,14 @@ +package { + import flash.display.MovieClip; + + public class MainDocument extends MovieClip { + public function MainDocument() { + trace("/// this.child.gotoAndStop(1)"); + this.child.gotoAndStop(1); + + trace("/// this.stop()"); + + this.stop(); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/output.txt b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/output.txt new file mode 100644 index 000000000000..4a88dc4428a8 --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/output.txt @@ -0,0 +1,4 @@ +/// this.child.gotoAndStop(1) +///MainTimeline frame 1 +///Child Frame 1 +/// this.stop() diff --git a/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/test.fla b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..cdd583ff9876b80a4083463faba2e236f8052cad GIT binary patch literal 6370 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 literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/test.swf b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts1/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..43fa62ab73f439de33ea8634a3fab802737b44d3 GIT binary patch literal 968 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 literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts2/test.swf b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts2/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..c30553ff3be4e2dab26af4e8a412cd0bf3ae523a GIT binary patch literal 968 zcmV;(12_CbS5qsM1^@tfoUK$#bK6uDKKEMEm24-rYsU}T5SN;g4vZ}u=uFZ9N}LwL z(0G_6jG1w;6bH$@v@$~vfd$xJHwte^A z>b6yFZ|EIMg|np)@(JwdM$gC=0mg}<2kdXZzx$^S`_;Xr*oQy}ygY_6NnmV@ckI>U zgKs|xe)G%s%S+m??;)Z@F+_3UXOcv)gPWY1*uyr!#rD=d@Wiy;e-S&n4-Uw`Tl&xU zzWz%kw|<1fwFjA>EU5hksp41nT>asyOEzAC^dGNDYhS{Zn-fD}Y8aRpD(_$`Vj^c! z97k6P4&l(!dQH7;cA9k!X`f3XfsFhqa?;4T9zdD&aODd!PdxDS&ZMZXBEqHbe)t=_ z7@Q>@3cN;mMIq0-Rmj}Y%-&{SKkgbmr!YT>KNe|OTGuFM9m96&t&X-{_S}kvN5Fq0 zlrEo7m;m8<-vtcV?R?X;2OaHHxzj%}jdI5vh~ADQ-&CGTu!%(UDb4v(&QA_}iBffI zy;klwjhc1bYITen7qBO-{c+2#X(!!Mt;_9ow67oboj!`#PJdAM6l~ox2abK?#(eg9 z&0f@+&D)%?;}Jy1(sX0FP$*=bwrS_REb?6K&0cc{)mBT_LUYr|BPO?6y(aK3g&?=t zHM>T~#P8qBAX`k#d#_L4h*UW^GIS^G7t%PvkR7?jyG<;r=ICw1TG;gK>r-P}J;%T_ z9rMKSk>q3Xa=+)Gkzq+Y1Iu)bD5m4pIeXjBBRwsDep3EvE>AK`=P^r}rvsD0+yB#> zswqj5l+!FllHv4XDxACo2}T&B3L`-#gqXO%NQ99nVX> zt}vQq^s?d~E9(6<{4w#4IX~0@l0T<}Dghugz?lLbagoXrFhSyT#v2(=tU@?n02&|! zNiq=yLKOV_D8YcMzJ*Ew5)8dQx-b-76`w5_O8dbf&4JqzDnW{~&`V2|5E(MJ70A&_ zm<$z!QXC4ol?51vQH4@eiMlFAGNWgPghwgj0g6rqS4DlnfX1TQh^URI+K8!*3u+^- zHYnazSoW_rK^|Ww%<>aw%Fm6i%#@`Wo*O+s!<33zhlKA$&JnkzRDyy> qk$F-ty6X7}k!eEW=!Ib#m%I_rd2d97CqE^G=MRea!~6%O#>M+FGv7Y| literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/MainDocument.as b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/MainDocument.as new file mode 100644 index 000000000000..acbc7b9ad6dc --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/MainDocument.as @@ -0,0 +1,19 @@ +package { + import flash.display.MovieClip; + + public class MainDocument extends MovieClip { + public function MainDocument() { + trace("/// this.gotoAndStop(1)"); + this.gotoAndStop(1); + + trace("/// this.gotoAndStop(2)"); + this.gotoAndStop(2); + + trace("/// this.gotoAndStop(1)"); + this.gotoAndStop(1); + + trace("/// this.stop()"); + this.stop(); + } + } +} \ No newline at end of file diff --git a/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/output.txt b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/output.txt new file mode 100644 index 000000000000..34ed0e7ede9e --- /dev/null +++ b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/output.txt @@ -0,0 +1,7 @@ +/// this.gotoAndStop(1) +///MainTimeline frame 1 +/// this.gotoAndStop(2) +///MainTimeline frame 2 +/// this.gotoAndStop(1) +///MainTimeline frame 1 +/// this.stop() diff --git a/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/test.fla b/tests/tests/swfs/avm2/movieclip_gotoandstop_framescripts_self/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..837825aac38150704adec10d474f69e2de373004 GIT binary patch literal 4254 zcmbtYc{r5&7awazvMXyv%Gk4$Y%|tW!=$k@$d)Tx z!l1G>lr2sCW^T9bKDYbN@62Z|bu z3o`dXs@9(H9{a!w5*{F0`R(a}1NJ`GW_Oh*T>+057{HsSIG;mUz!KBQW}E6Jmq(c& zuT`++5fbJyok^O*HSKla8|LSY9Y@R@bd+#!*;b$W$0)@X)O($V5xCyY%wY@V5j>lT zj4846Gz)aSaxBi)qoIXq!$$LgNs^u{n}&%m2F!RF-RsYTYrFlIa$C(52S({&E$}xZ z>&`pL{mG~%ywQ?MN;bV0#vDlTOE5O!f}RV*H~Z4@My&@yPoIV@rI znkt0t6y1$mL-A=(<@57ZggXvb)YmxpO>P@fbs(t|l>A#qN54BY8!5VG$zf317_CXt0+tBap09E)JC$MT_ci>o=>*YCABT5367$~soId)hs^ z+@>5t;0+I5y|bse$`VEetnxW#{e^S~wzm<3=3Oud&7?E7HLJBOP02<3nwC1SN}IGw z+{{x{k{nJPWl}MIKV0a?eFc#;*ce4?YrGL{hFBOPxaWHWTsm5!X48&28rFXH*(_u5 z$qpZyZdI$Bq{CZpE^G>KG55U9eIR>gHtz!-1kvE?obz)?Vcg)E@{2ycfO#nJ)@yBU zBI9F4sv7eJRB3Cfn);Sn@*fIi5hcPB1i@)6?FEcu&=q_c7|&BCu9(?J2youAeq6Eh zn34VnzI>F=|I0G%D<2oD4dP5pZ-6|D#cLo7Z3O^~Kp!CfA zluc@ke2~toRqA)M;Wo;6;@Wt;NKm&;2wZu`d_g~&b1j`ZbwJL?c2>(stof+SCVwdX zUGS+|zbkbsDxdC;SSNf)!!PKJT3BubfAU`4ChlhE7$SH1o^U5XQWS3SsG%DolIab3!E`3JSxg zuHa{fQ9ia%hCrz?_k?iC%zEnbveIKBnb;BR`7O`aw}7=ilY?1shtc}%unVKUl6@~G zxZ3Yk%-Ky{1vWshU!FqKDdHeC`HNM$aSe8JAhRjyz2(Of9yRvmtB zN(!hd8Y*giX5`8rWF-`gVS$nbi80DyxGG5R`yE;)L8JG(h~Q2?Fh7z{y~BP1l7I(Il5_qsiEcBc?SmF)D~6Fi)7nOI;`S%8YrfJgaZUjnP)c?$N*3&+ZFl^zN^g|J2F z%LL%F)Du1MXef8z={efBT)4b0+OCtvtk~o{%fXBTHv4}PlB2ESxi8(IMtInIbci;I zI2#eOEt*fr>fSmjheQ86OnD{GhiKeew72`kDSE9m@Tm3|i8cS3zr2k7|l%j<^!La?@EouASigmTN8zMwtXDRUcZa#3n*_8~p>pxcLTU&l;Kret@T~RntPAv7pgO zQY`-ThUHYovE6VB{4i>?e{$2UauR)iAgUdq%#AZ$kdc6@mAoef&ctVI;wQ{q{wz`8 zJBs?S+&2Mo^`&2hjOxs1iIAiQ*$XXO)D=ADZRMLoh(ueB?}` z1gjUs*-ft7LB~Gu<`js;8GyMt4z2+0(X8))_LAI0puNypwOnJslf&FsH%z#jZP;9S z&T+kxRuL7OyI#Z}P^GL@D&;-R_xdvHDSkYsN1%RZ)pZ!5?6AnLAS|Z}_PLTMmUQV> z=;l1ccVR*u4Rf(_SlFXdcotFEvbShs*7ra}#+JVFFbG}{R(;xB!hf)WrpkGa%e;Fs zN@&C4(i5*nMFY@UK z7O9ITMQ)vFIVd)(F$xkSDWJBXhf3)qcVu#hIBo?2!bDQ;g{L1cl9`HgmKe1m)StTT z1PlVW_ex;LIMO4`6}9>M+(0`@ z2km#Goe<}8rFdD)uA6(?49+rCxowd!gg>Yb{GA;x!d#3 z`Qt-v(0kjrxA;VI`gun0=|uYS%G~zIXO<_1Zz|@$14^!S#*Xc>4POpoxq1`IYWqe@ zu-NQTSScn~#BM5-QOgH6vyVFv4!xhh+{cqHA&?(uoigpLJP(&L! z^G+*$piS|Bu!y@GX1*o#%mL9O^6BD}F-2pZ>JYZ&vlrM*1V}tf*d^d+`g4stNf``nP=NR)m?a#F3XPO8g0vSFFpysve< zo2s79|I(!F8I<_BMiOJ0sQt2|CP&YQoS~~g!$`>kPd!`tQ=hFa3}AaRaT+tvRc0YL zs!7z#qrhrc23z|$2;1FG*|Pb$@7VZ;Qb@_msMCN`cQ@2i0C zLwnms_yk^r_?6LbauB2BX2$MYpuOVqdO89#_gjk^N%+SsD*mK{bq#^g7a`9KKAGOh zzqr)enbxZL9^k*G@r^Znl}z7R26@3wAsQH@v#aCJq~TXJw0yBxi%c*86sNEZq_dm! zC4aQGqr0P96Pila&5Q@r9h?UnuH-)j;XbA0~I`-@EnK*Z$9b{eib9 s`i!uJW6>2cHFR0B<9$${5${SbA0S;&_@83-vFBwdbJe* z=+e8pyDtrZSJkU6vu%ExnD5_xJs-afK7{?ixjdR(dvC4}Eemcoil`?raCyXc+5k7} z$2kSCRiUY-ZP+?>f~Xg}R}&t|*79QQk;PA(32#5aI;CY+_CrUEn_eKMq4O($8qWgW z4TGtX`Dat-;$(l=jXge0u6#e_L&=2{_kZ!z7ei+@=?o{z*+u8k_gKbGuSMuLa_!NGC@O-HOco_C~FgM~_$iR1D{tJT_(<3KdkW}hQ(fSc{M_lir)r!}3u z%0I3$*xl2_y;uc43nn}au)vGNcG~O9+3fFU=l+kl^OU$_^e=yKSC+C;@)?>$03oXxX*XBf7De~L{U%%aW;2Om=Td9S~X&mgl sWfv^FXxSypE?f4hWmD|uu${FrL7j5@xK_)~56gE5pYQ|t1A$Wo)vvlNGXMYp literal 0 HcmV?d00001 From 4d3d234148c9a0262768c1940871cd715dd4be75 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Thu, 16 Dec 2021 23:03:30 -0500 Subject: [PATCH 18/47] core: `enter_frame` should be an event that all display objects get and can respond to --- core/src/display_object.rs | 18 ++++-------------- core/src/display_object/avm2_button.rs | 22 ++++++++++++++++++++++ core/src/display_object/stage.rs | 19 ++++++++++++++++++- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/core/src/display_object.rs b/core/src/display_object.rs index 5aef74d24d2d..ddc500ddfbcf 100644 --- a/core/src/display_object.rs +++ b/core/src/display_object.rs @@ -1094,20 +1094,10 @@ pub trait TDisplayObject<'gc>: .set_instantiated_by_timeline(value); } - /// Emit an `enterFrame` event on this DisplayObject and any children it - /// may have. - fn enter_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) { - let enter_frame_evt = Avm2EventObject::bare_default_event(context, "enterFrame"); - - let dobject_constr = context.avm2.classes().display_object; - - if let Err(e) = Avm2::broadcast_event(context, enter_frame_evt, dobject_constr) { - log::error!( - "Encountered AVM2 error when broadcasting enterFrame event: {}", - e - ); - } - } + /// Run any start-of-frame actions for this display object. + /// + /// When fired on `Stage`, this also emits the AVM2 `enterFrame` broadcast. + fn enter_frame(&self, _context: &mut UpdateContext<'_, 'gc, '_>) {} /// Construct all display objects that the timeline indicates should exist /// this frame, and their children. diff --git a/core/src/display_object/avm2_button.rs b/core/src/display_object/avm2_button.rs index eb4e6ae1f1d9..3c5ecade0bc3 100644 --- a/core/src/display_object/avm2_button.rs +++ b/core/src/display_object/avm2_button.rs @@ -428,6 +428,28 @@ impl<'gc> TDisplayObject<'gc> for Avm2Button<'gc> { self.set_state(context, ButtonState::Up); } + fn enter_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) { + let hit_area = self.0.read().hit_area; + if let Some(hit_area) = hit_area { + hit_area.enter_frame(context); + } + + let up_state = self.0.read().up_state; + if let Some(up_state) = up_state { + up_state.enter_frame(context); + } + + let down_state = self.0.read().down_state; + if let Some(down_state) = down_state { + down_state.enter_frame(context); + } + + let over_state = self.0.read().over_state; + if let Some(over_state) = over_state { + over_state.enter_frame(context); + } + } + fn construct_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) { let hit_area = self.0.read().hit_area; if let Some(hit_area) = hit_area { diff --git a/core/src/display_object/stage.rs b/core/src/display_object/stage.rs index 7ce828379576..6a7c5217cd61 100644 --- a/core/src/display_object/stage.rs +++ b/core/src/display_object/stage.rs @@ -3,7 +3,7 @@ use crate::avm1::Object as Avm1Object; use crate::avm2::object::TObject; use crate::avm2::{ - Activation as Avm2Activation, EventObject as Avm2EventObject, Object as Avm2Object, + Activation as Avm2Activation, Avm2, EventObject as Avm2EventObject, Object as Avm2Object, ScriptObject as Avm2ScriptObject, StageObject as Avm2StageObject, Value as Avm2Value, }; use crate::config::Letterbox; @@ -717,6 +717,23 @@ impl<'gc> TDisplayObject<'gc> for Stage<'gc> { context.renderer.end_frame(); } + fn enter_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) { + for child in self.iter_render_list() { + child.enter_frame(context); + } + + let enter_frame_evt = Avm2EventObject::bare_default_event(context, "enterFrame"); + + let dobject_constr = context.avm2.classes().display_object; + + if let Err(e) = Avm2::broadcast_event(context, enter_frame_evt, dobject_constr) { + log::error!( + "Encountered AVM2 error when broadcasting enterFrame event: {}", + e + ); + } + } + fn construct_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) { for child in self.iter_render_list() { child.construct_frame(context); From 9e527f7a2a0ed36f95043f73d9f1034a46389b36 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 15 Dec 2021 20:29:47 -0500 Subject: [PATCH 19/47] core: In AVM2, movie clips process `RemoveObject` before any other frame actions are done. --- core/src/display_object/movie_clip.rs | 38 +++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 434b6d2ad407..c98f71368a33 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1130,8 +1130,12 @@ impl<'gc> MovieClip<'gc> { TagCode::PlaceObject4 if run_display_actions && !context.is_action_script_3() => { self.place_object(context, reader, tag_len, 4) } - TagCode::RemoveObject if run_display_actions => self.remove_object(context, reader, 1), - TagCode::RemoveObject2 if run_display_actions => self.remove_object(context, reader, 2), + TagCode::RemoveObject if run_display_actions && !context.is_action_script_3() => { + self.remove_object(context, reader, 1) + } + TagCode::RemoveObject2 if run_display_actions && !context.is_action_script_3() => { + self.remove_object(context, reader, 2) + } TagCode::SetBackgroundColor => self.set_background_color(context, reader), TagCode::StartSound => self.start_sound_1(context, reader), TagCode::SoundStreamBlock => self.sound_stream_block(context, reader), @@ -1860,6 +1864,36 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { self.0.read().movie().version() } + fn enter_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) { + for child in self.iter_render_list() { + child.enter_frame(context); + } + + if context.is_action_script_3() { + let is_playing = self.playing(); + + if is_playing { + // Frame destruction happens in-line with frame number advance. + // If we expect to loop, we do not run `RemoveObject` tags. + if self.current_frame() < self.total_frames() { + let mc = self.0.read(); + let data = mc.static_data.swf.clone(); + let mut reader = data.read_from(mc.tag_stream_pos); + drop(mc); + + use swf::TagCode; + let tag_callback = + |reader: &mut SwfStream<'_>, tag_code, _tag_len| match tag_code { + TagCode::RemoveObject => self.remove_object(context, reader, 1), + TagCode::RemoveObject2 => self.remove_object(context, reader, 2), + _ => Ok(()), + }; + let _ = tag_utils::decode_tags(&mut reader, tag_callback, TagCode::ShowFrame); + } + } + } + } + /// Construct objects placed on this frame. fn construct_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) { // New children will be constructed when they are instantiated and thus From a14787aacff8199dbf9a9784efcedfe9be611363 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Thu, 16 Dec 2021 23:07:18 -0500 Subject: [PATCH 20/47] core: Frame actions should start with `enterFrame`; not `exitFrame`. --- core/src/player.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/player.rs b/core/src/player.rs index c1af9fe0edcb..ec110634a347 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -1259,12 +1259,12 @@ impl Player { self.update(|context| { if context.is_action_script_3() { let stage = context.stage; - stage.exit_frame(context); stage.enter_frame(context); stage.construct_frame(context); stage.frame_constructed(context); stage.run_frame_avm2(context); stage.run_frame_scripts(context); + stage.exit_frame(context); } else { // AVM1 execution order is determined by the global execution list, based on instantiation order. for clip in context.avm1.clip_exec_iter() { From a18581d83d98861fe922197fd2e51bc65c64ed5f Mon Sep 17 00:00:00 2001 From: David Wendt Date: Mon, 27 Dec 2021 20:29:58 -0500 Subject: [PATCH 21/47] core: Track what part of the frame processing loop we're in --- core/src/context.rs | 7 +++ core/src/frame_lifecycle.rs | 113 ++++++++++++++++++++++++++++++++++++ core/src/lib.rs | 1 + core/src/player.rs | 33 +++-------- 4 files changed, 129 insertions(+), 25 deletions(-) create mode 100644 core/src/frame_lifecycle.rs diff --git a/core/src/context.rs b/core/src/context.rs index e614a64d4027..863fb56aa45d 100644 --- a/core/src/context.rs +++ b/core/src/context.rs @@ -15,6 +15,7 @@ use crate::context_menu::ContextMenuState; use crate::display_object::{EditText, InteractiveObject, MovieClip, SoundTransform, Stage}; use crate::external::ExternalInterface; use crate::focus_tracker::FocusTracker; +use crate::frame_lifecycle::FramePhase; use crate::library::Library; use crate::loader::LoadManager; use crate::player::Player; @@ -168,6 +169,11 @@ pub struct UpdateContext<'a, 'gc, 'gc_context> { /// Amount of actions performed since the last timeout check pub actions_since_timeout_check: &'a mut u16, + + /// The current frame processing phase. + /// + /// If we are not doing frame processing, then this is `FramePhase::Enter`. + pub frame_phase: &'a mut FramePhase, } /// Convenience methods for controlling audio. @@ -327,6 +333,7 @@ impl<'a, 'gc, 'gc_context> UpdateContext<'a, 'gc, 'gc_context> { time_offset: self.time_offset, frame_rate: self.frame_rate, actions_since_timeout_check: self.actions_since_timeout_check, + frame_phase: self.frame_phase, } } diff --git a/core/src/frame_lifecycle.rs b/core/src/frame_lifecycle.rs new file mode 100644 index 000000000000..23c9ea34ee45 --- /dev/null +++ b/core/src/frame_lifecycle.rs @@ -0,0 +1,113 @@ +//! Frame events management +//! +//! This module aids in keeping track of which frame execution phase we are in. +//! +//! For AVM2 code, display objects execute a series of discrete phases, and +//! each object is notified about the current frame phase in rendering order. +//! When objects are created, they are 'caught up' to the current frame phase +//! to ensure correct order of operations. +//! +//! AVM1 code (presumably, either on an AVM1 stage or within an `AVM1Movie`) +//! runs in one phase, with timeline operations executing with all phases +//! inline in the order that clips were originally created. + +use crate::context::UpdateContext; +use crate::display_object::TDisplayObject; + +/// Which phase of the frame we're currently in. +/// +/// AVM2 frames exist in one of five phases: `Enter`, `Construct`, `Update`, +/// `FrameScripts`, or `Exit`. +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum FramePhase { + /// We're entering the next frame. + /// + /// When movie clips enter a new frame, they must do two things: + /// + /// - Remove all children that should not exist on the next frame. + /// - Increment their current frame number. + /// + /// Once this phase ends, we fire `enterFrame` on the broadcast list. + Enter, + + /// We're constructing children of existing display objects. + /// + /// All `PlaceObject` tags should execute at this time. + /// + /// Once we construct the frame, we fire `frameConstructed` on the + /// broadcast list. + Construct, + + /// We're updating all display objects on the stage. + /// + /// This roughly corresponds to `run_frame`; and should encompass all time + /// based display object changes that are not encompassed by the other + /// phases. + /// + /// This frame phase also exists in AVM1 frames. In AVM1, it does the work + /// of `Enter`, `FrameScripts` (`DoAction` tags), and `Construct`. + Update, + + /// We're running all queued frame scripts. + /// + /// Frame scripts are the AS3 equivalent of old-style `DoAction` tags. They + /// are queued in the `Update` phase if the current timeline frame number + /// differs from the prior frame's one. + FrameScripts, + + /// We're finishing frame processing. + /// + /// When we exit a completed frame, we fire `exitFrame` on the broadcast + /// list. + Exit, +} + +/// Run one frame according to AVM1 frame order. +pub fn run_all_phases_avm1<'gc>(context: &mut UpdateContext<'_, 'gc, '_>) { + // In AVM1, we only ever execute the update phase, and all the work that + // would ordinarily be phased is instead run all at once in whatever order + // the SWF requests it. + *context.frame_phase = FramePhase::Update; + + // AVM1 execution order is determined by the global execution list, based on instantiation order. + for clip in context.avm1.clip_exec_iter() { + if clip.removed() { + // Clean up removed objects from this frame or a previous frame. + // Can be safely removed while iterating here, because the iterator advances + // to the next node before returning the current node. + context.avm1.remove_from_exec_list(context.gc_context, clip); + } else { + clip.run_frame(context); + } + } + + // Fire "onLoadInit" events. + context + .load_manager + .movie_clip_on_load(context.action_queue); + + *context.frame_phase = FramePhase::Enter; +} + +/// Run one frame according to AVM2 frame order. +pub fn run_all_phases_avm2<'gc>(context: &mut UpdateContext<'_, 'gc, '_>) { + let stage = context.stage; + + *context.frame_phase = FramePhase::Enter; + stage.enter_frame(context); + + *context.frame_phase = FramePhase::Construct; + stage.construct_frame(context); + stage.frame_constructed(context); + + *context.frame_phase = FramePhase::Update; + stage.run_frame_avm2(context); + + *context.frame_phase = FramePhase::FrameScripts; + stage.run_frame_scripts(context); + + *context.frame_phase = FramePhase::Exit; + stage.exit_frame(context); + + *context.frame_phase = FramePhase::Enter; +} diff --git a/core/src/lib.rs b/core/src/lib.rs index 490942f868c9..7ee719d9e9cd 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -25,6 +25,7 @@ pub(crate) mod either; pub mod events; pub mod focus_tracker; mod font; +mod frame_lifecycle; mod html; mod library; pub mod loader; diff --git a/core/src/player.rs b/core/src/player.rs index ec110634a347..b77a9db8d11e 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -27,6 +27,7 @@ use crate::events::{ButtonKeyCode, ClipEvent, ClipEventResult, KeyCode, MouseBut use crate::external::Value as ExternalValue; use crate::external::{ExternalInterface, ExternalInterfaceProvider}; use crate::focus_tracker::FocusTracker; +use crate::frame_lifecycle::{run_all_phases_avm1, run_all_phases_avm2, FramePhase}; use crate::library::Library; use crate::loader::LoadManager; use crate::locale::get_current_date_time; @@ -195,6 +196,8 @@ pub struct Player { frame_rate: f64, actions_since_timeout_check: u16, + frame_phase: FramePhase, + /// A time budget for executing frames. /// Gained by passage of time between host frames, spent by executing SWF frames. /// This is how we support custom SWF framerates @@ -1257,31 +1260,9 @@ impl Player { pub fn run_frame(&mut self) { self.update(|context| { - if context.is_action_script_3() { - let stage = context.stage; - stage.enter_frame(context); - stage.construct_frame(context); - stage.frame_constructed(context); - stage.run_frame_avm2(context); - stage.run_frame_scripts(context); - stage.exit_frame(context); - } else { - // AVM1 execution order is determined by the global execution list, based on instantiation order. - for clip in context.avm1.clip_exec_iter() { - if clip.removed() { - // Clean up removed objects from this frame or a previous frame. - // Can be safely removed while iterating here, because the iterator advances - // to the next node before returning the current node. - context.avm1.remove_from_exec_list(context.gc_context, clip); - } else { - clip.run_frame(context); - } - } - - // Fire "onLoadInit" events. - context - .load_manager - .movie_clip_on_load(context.action_queue); + match context.swf.avm_type() { + AvmType::Avm1 => run_all_phases_avm1(context), + AvmType::Avm2 => run_all_phases_avm2(context), } context.update_sounds(); }); @@ -1539,6 +1520,7 @@ impl Player { audio_manager, frame_rate: &mut self.frame_rate, actions_since_timeout_check: &mut self.actions_since_timeout_check, + frame_phase: &mut self.frame_phase, }; let old_frame_rate = *update_context.frame_rate; @@ -1894,6 +1876,7 @@ impl PlayerBuilder { // Timing frame_rate, + frame_phase: FramePhase::Enter, frame_accumulator: 0.0, recent_run_frame_timings: VecDeque::with_capacity(10), start_time: Instant::now(), From bb1f76a44bc4d0323ccbc1046f193833a17bd652 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Mon, 10 Jan 2022 20:25:39 -0500 Subject: [PATCH 22/47] core: Add a new frame phase to represent non-frame work such as input event handlers. --- core/src/frame_lifecycle.rs | 13 ++++++++++--- core/src/player.rs | 7 ++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/core/src/frame_lifecycle.rs b/core/src/frame_lifecycle.rs index 23c9ea34ee45..1bb0f2873a65 100644 --- a/core/src/frame_lifecycle.rs +++ b/core/src/frame_lifecycle.rs @@ -17,7 +17,8 @@ use crate::display_object::TDisplayObject; /// Which phase of the frame we're currently in. /// /// AVM2 frames exist in one of five phases: `Enter`, `Construct`, `Update`, -/// `FrameScripts`, or `Exit`. +/// `FrameScripts`, or `Exit`. An additional `Idle` phase covers rendering and +/// event processing. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum FramePhase { /// We're entering the next frame. @@ -60,6 +61,12 @@ pub enum FramePhase { /// When we exit a completed frame, we fire `exitFrame` on the broadcast /// list. Exit, + + /// We're not currently executing any frame code. + /// + /// At this point in time, event handlers are expected to run. No frame + /// catch-up work should execute. + Idle, } /// Run one frame according to AVM1 frame order. @@ -86,7 +93,7 @@ pub fn run_all_phases_avm1<'gc>(context: &mut UpdateContext<'_, 'gc, '_>) { .load_manager .movie_clip_on_load(context.action_queue); - *context.frame_phase = FramePhase::Enter; + *context.frame_phase = FramePhase::Idle; } /// Run one frame according to AVM2 frame order. @@ -109,5 +116,5 @@ pub fn run_all_phases_avm2<'gc>(context: &mut UpdateContext<'_, 'gc, '_>) { *context.frame_phase = FramePhase::Exit; stage.exit_frame(context); - *context.frame_phase = FramePhase::Enter; + *context.frame_phase = FramePhase::Idle; } diff --git a/core/src/player.rs b/core/src/player.rs index b77a9db8d11e..fdf14790a4a0 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -1260,9 +1260,10 @@ impl Player { pub fn run_frame(&mut self) { self.update(|context| { - match context.swf.avm_type() { - AvmType::Avm1 => run_all_phases_avm1(context), - AvmType::Avm2 => run_all_phases_avm2(context), + if context.is_action_script_3() { + run_all_phases_avm2(context); + } else { + run_all_phases_avm1(context); } context.update_sounds(); }); From e282984965a94c031427847b3e638423d863a2a7 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sat, 22 Jan 2022 18:54:00 -0500 Subject: [PATCH 23/47] core: `Player` should start in the `Idle` phase --- core/src/frame_lifecycle.rs | 6 ++++++ core/src/player.rs | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/frame_lifecycle.rs b/core/src/frame_lifecycle.rs index 1bb0f2873a65..f913eb18a4ed 100644 --- a/core/src/frame_lifecycle.rs +++ b/core/src/frame_lifecycle.rs @@ -69,6 +69,12 @@ pub enum FramePhase { Idle, } +impl Default for FramePhase { + fn default() -> Self { + FramePhase::Idle + } +} + /// Run one frame according to AVM1 frame order. pub fn run_all_phases_avm1<'gc>(context: &mut UpdateContext<'_, 'gc, '_>) { // In AVM1, we only ever execute the update phase, and all the work that diff --git a/core/src/player.rs b/core/src/player.rs index fdf14790a4a0..34a48d85afbe 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -1877,7 +1877,7 @@ impl PlayerBuilder { // Timing frame_rate, - frame_phase: FramePhase::Enter, + frame_phase: Default::default(), frame_accumulator: 0.0, recent_run_frame_timings: VecDeque::with_capacity(10), start_time: Instant::now(), From 2f56670f75c78ba14e15b1b390acc1c419183bb7 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 28 Dec 2021 00:35:34 -0500 Subject: [PATCH 24/47] core: Centralize all the various calls to `enter_frame`/`construct_frame` into a single method, `catchup_display_object_to_frame`. The rationale for the catch-up logic is as follows: * We must always enter-frame and construct objects, even if those respective display events haven't happened yet. * Display objects created in event handlers still need to run catchup phases, otherwise they will tag-stream desync * Frame scripts are never triggered by catchup phases * `exit_frame` is not a catchup phase as it is *only* an event broadcast currently --- .../globals/flash/display/displayobject.rs | 3 +- core/src/display_object/avm2_button.rs | 7 ++-- core/src/display_object/movie_clip.rs | 3 +- core/src/frame_lifecycle.rs | 32 ++++++++++++++++++- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/core/src/avm2/globals/flash/display/displayobject.rs b/core/src/avm2/globals/flash/display/displayobject.rs index 62577b544deb..ccc71f8e643d 100644 --- a/core/src/avm2/globals/flash/display/displayobject.rs +++ b/core/src/avm2/globals/flash/display/displayobject.rs @@ -10,6 +10,7 @@ use crate::avm2::Error; use crate::avm2::Namespace; use crate::avm2::QName; use crate::display_object::{HitTestOptions, TDisplayObject}; +use crate::frame_lifecycle::catchup_display_object_to_frame; use crate::string::AvmString; use crate::types::{Degrees, Percent}; use crate::vminterface::Instantiator; @@ -57,7 +58,7 @@ pub fn native_instance_init<'gc>( child.set_object2(activation.context.gc_context, this); child.post_instantiation(&mut activation.context, None, Instantiator::Avm2, false); - child.construct_frame(&mut activation.context); + catchup_display_object_to_frame(&mut activation.context, child); } } } diff --git a/core/src/display_object/avm2_button.rs b/core/src/display_object/avm2_button.rs index 3c5ecade0bc3..e817e42e986f 100644 --- a/core/src/display_object/avm2_button.rs +++ b/core/src/display_object/avm2_button.rs @@ -12,6 +12,7 @@ use crate::display_object::interactive::{ }; use crate::display_object::{DisplayObjectBase, DisplayObjectPtr, MovieClip, TDisplayObject}; use crate::events::{ClipEvent, ClipEventResult}; +use crate::frame_lifecycle::catchup_display_object_to_frame; use crate::prelude::*; use crate::tag_utils::{SwfMovie, SwfSlice}; use crate::vminterface::Instantiator; @@ -224,7 +225,7 @@ impl<'gc> Avm2Button<'gc> { child.set_parent(context.gc_context, Some(self.into())); child.post_instantiation(context, None, Instantiator::Movie, false); - child.construct_frame(context); + catchup_display_object_to_frame(context, child); (child, false) } else { @@ -232,7 +233,7 @@ impl<'gc> Avm2Button<'gc> { state_sprite.set_avm2_class(context.gc_context, Some(sprite_class)); state_sprite.set_parent(context.gc_context, Some(self.into())); - state_sprite.construct_frame(context); + catchup_display_object_to_frame(context, state_sprite.into()); for (child, depth) in children { // `parent` returns `null` for these grandchildren during construction time, even though @@ -242,7 +243,7 @@ impl<'gc> Avm2Button<'gc> { state_sprite.replace_at_depth(context, child, depth.into()); child.set_parent(context.gc_context, Some(self.into())); child.post_instantiation(context, None, Instantiator::Movie, false); - child.construct_frame(context); + catchup_display_object_to_frame(context, child); child.set_parent(context.gc_context, Some(state_sprite.into())); } diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index c98f71368a33..ec82d616e7d3 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -32,6 +32,7 @@ use crate::display_object::{ use crate::drawing::Drawing; use crate::events::{ButtonKeyCode, ClipEvent, ClipEventResult}; use crate::font::Font; +use crate::frame_lifecycle::catchup_display_object_to_frame; use crate::prelude::*; use crate::string::{AvmString, WStr, WString}; use crate::tag_utils::{self, DecodeResult, Error, SwfMovie, SwfSlice, SwfStream}; @@ -1217,7 +1218,7 @@ impl<'gc> MovieClip<'gc> { // TODO: Missing PlaceObject properties: amf_data, filters // Run first frame. - child.construct_frame(context); + catchup_display_object_to_frame(context, child); child.post_instantiation(context, None, Instantiator::Movie, false); // In AVM1, children are added in `run_frame` so this is necessary. // In AVM2 we add them in `construct_frame` so calling this causes diff --git a/core/src/frame_lifecycle.rs b/core/src/frame_lifecycle.rs index f913eb18a4ed..544eeb50c6cc 100644 --- a/core/src/frame_lifecycle.rs +++ b/core/src/frame_lifecycle.rs @@ -12,7 +12,7 @@ //! inline in the order that clips were originally created. use crate::context::UpdateContext; -use crate::display_object::TDisplayObject; +use crate::display_object::{DisplayObject, TDisplayObject}; /// Which phase of the frame we're currently in. /// @@ -124,3 +124,33 @@ pub fn run_all_phases_avm2<'gc>(context: &mut UpdateContext<'_, 'gc, '_>) { *context.frame_phase = FramePhase::Idle; } + +/// Run all previously-executed frame phases on a newly-constructed display +/// object. +/// +/// This is a no-op on AVM1, which has it's own catch-up logic. +pub fn catchup_display_object_to_frame<'gc>( + context: &mut UpdateContext<'_, 'gc, '_>, + dobj: DisplayObject<'gc>, +) { + if !context.is_action_script_3() { + return; + } + + match *context.frame_phase { + //NOTE: We currently do not have test coverage to justify `Enter` + //running `construct_frame`. However, `Idle` *does* need frame + //construction to happen, because event handlers expect to be able to + //construct new movie clips and see their grandchildren. So I suspect + //that constructing symbols in `enterFrame` works the same way. + FramePhase::Enter | FramePhase::Construct => { + dobj.enter_frame(context); + dobj.construct_frame(context); + } + FramePhase::Update | FramePhase::FrameScripts | FramePhase::Exit | FramePhase::Idle => { + dobj.enter_frame(context); + dobj.construct_frame(context); + dobj.run_frame_avm2(context); + } + } +} From efa1aaaf1cc116b4a17684775db9f96a7f1e77ca Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 27 Jul 2022 20:03:44 -0400 Subject: [PATCH 25/47] core: Movie clips run all their tags at `enter_frame`, and place/remove actions are queued until later. This prevents repeated place/remove actions at the same depth from resulting in repeated event dispatches. --- core/src/display_object/movie_clip.rs | 190 ++++++++++++++++++++++---- 1 file changed, 160 insertions(+), 30 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index ec82d616e7d3..1f261c905b01 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -105,6 +105,9 @@ pub struct MovieClipData<'gc> { /// The tag stream start and stop positions for each frame in the clip. #[cfg(feature = "timeline_debug")] tag_frame_boundaries: HashMap, + + /// List of tags queued up for the current frame. + queued_tags: HashMap, } impl<'gc> MovieClip<'gc> { @@ -137,6 +140,7 @@ impl<'gc> MovieClip<'gc> { #[cfg(feature = "timeline_debug")] tag_frame_boundaries: Default::default(), + queued_tags: HashMap::new(), }, )) } @@ -175,6 +179,7 @@ impl<'gc> MovieClip<'gc> { #[cfg(feature = "timeline_debug")] tag_frame_boundaries: Default::default(), + queued_tags: HashMap::new(), }, )) } @@ -217,6 +222,7 @@ impl<'gc> MovieClip<'gc> { #[cfg(feature = "timeline_debug")] tag_frame_boundaries: Default::default(), + queued_tags: HashMap::new(), }, )) } @@ -277,6 +283,7 @@ impl<'gc> MovieClip<'gc> { #[cfg(feature = "timeline_debug")] tag_frame_boundaries: Default::default(), + queued_tags: HashMap::new(), }, )); @@ -1137,6 +1144,24 @@ impl<'gc> MovieClip<'gc> { TagCode::RemoveObject2 if run_display_actions && !context.is_action_script_3() => { self.remove_object(context, reader, 2) } + TagCode::PlaceObject if run_display_actions && context.is_action_script_3() => { + self.queue_place_object(context, reader, tag_len, 1) + } + TagCode::PlaceObject2 if run_display_actions && context.is_action_script_3() => { + self.queue_place_object(context, reader, tag_len, 2) + } + TagCode::PlaceObject3 if run_display_actions && context.is_action_script_3() => { + self.queue_place_object(context, reader, tag_len, 3) + } + TagCode::PlaceObject4 if run_display_actions && context.is_action_script_3() => { + self.queue_place_object(context, reader, tag_len, 4) + } + TagCode::RemoveObject if run_display_actions && context.is_action_script_3() => { + self.queue_remove_object(context, reader, tag_len, 1) + } + TagCode::RemoveObject2 if run_display_actions && context.is_action_script_3() => { + self.queue_remove_object(context, reader, tag_len, 2) + } TagCode::SetBackgroundColor => self.set_background_color(context, reader), TagCode::StartSound => self.start_sound_1(context, reader), TagCode::SoundStreamBlock => self.sound_stream_block(context, reader), @@ -1834,6 +1859,31 @@ impl<'gc> MovieClip<'gc> { .any(|handler| object.has_property(&mut activation, handler.into())) } } + + fn unqueue_tags_matching( + &self, + context: &mut UpdateContext<'_, 'gc, '_>, + mut matching: F, + ) -> Vec<(Depth, QueuedTag)> + where + F: FnMut(&QueuedTag) -> bool, + { + let mut write = self.0.write(context.gc_context); + let mut unqueued: Vec<_> = write + .queued_tags + .iter() + .filter(|(_, t)| matching(t)) + .map(|(d, t)| (*d, t.clone())) + .collect(); + + unqueued.sort_by(|(_, t1), (_, t2)| t1.tag_start.cmp(&t2.tag_start)); + + for (depth, _) in unqueued.iter() { + write.queued_tags.remove(depth); + } + + unqueued + } } impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { @@ -1874,22 +1924,23 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { let is_playing = self.playing(); if is_playing { - // Frame destruction happens in-line with frame number advance. - // If we expect to loop, we do not run `RemoveObject` tags. - if self.current_frame() < self.total_frames() { - let mc = self.0.read(); - let data = mc.static_data.swf.clone(); - let mut reader = data.read_from(mc.tag_stream_pos); - drop(mc); - - use swf::TagCode; - let tag_callback = - |reader: &mut SwfStream<'_>, tag_code, _tag_len| match tag_code { - TagCode::RemoveObject => self.remove_object(context, reader, 1), - TagCode::RemoveObject2 => self.remove_object(context, reader, 2), - _ => Ok(()), - }; - let _ = tag_utils::decode_tags(&mut reader, tag_callback, TagCode::ShowFrame); + self.run_frame_internal(context, true); + + let data = self.0.read().static_data.swf.clone(); + let remove_actions = self.unqueue_tags_matching(context, |t| { + matches!(t.tag_type, QueuedTagAction::Remove(_)) + }); + + for (_, tag) in remove_actions { + let mut reader = data.read_from(tag.tag_start); + let version = match tag.tag_type { + QueuedTagAction::Remove(v) => v, + _ => unreachable!(), + }; + + if let Err(e) = self.remove_object(context, &mut reader, version) { + log::error!("Error running queued tag: {:?}, got {}", tag.tag_type, e); + } } } } @@ -1913,21 +1964,21 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { false }; - if self.determine_next_frame() != NextFrame::First { - let mc = self.0.read(); - let data = mc.static_data.swf.clone(); - let mut reader = data.read_from(mc.tag_stream_pos); - drop(mc); + let data = self.0.read().static_data.swf.clone(); + let place_actions = self.unqueue_tags_matching(context, |t| { + matches!(t.tag_type, QueuedTagAction::Place(_)) + }); - use swf::TagCode; - let tag_callback = |reader: &mut SwfStream<'_>, tag_code, tag_len| match tag_code { - TagCode::PlaceObject => self.place_object(context, reader, tag_len, 1), - TagCode::PlaceObject2 => self.place_object(context, reader, tag_len, 2), - TagCode::PlaceObject3 => self.place_object(context, reader, tag_len, 3), - TagCode::PlaceObject4 => self.place_object(context, reader, tag_len, 4), - _ => Ok(()), + for (_, tag) in place_actions { + let mut reader = data.read_from(tag.tag_start); + let version = match tag.tag_type { + QueuedTagAction::Place(v) => v, + _ => unreachable!(), }; - let _ = tag_utils::decode_tags(&mut reader, tag_callback, TagCode::ShowFrame); + + if let Err(e) = self.place_object(context, &mut reader, tag.tag_len, version) { + log::error!("Error running queued tag: {:?}, got {}", tag.tag_type, e); + } } if needs_construction { @@ -1959,7 +2010,8 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { } // Run my SWF tags. - if self.playing() { + // In AVM2, SWF tags are processed at enterFrame time. + if self.playing() && !context.is_action_script_3() { self.run_frame_internal(context, true); } } @@ -3240,6 +3292,34 @@ impl<'gc, 'a> MovieClip<'gc> { Ok(()) } + fn queue_place_object( + self, + context: &mut UpdateContext<'_, 'gc, '_>, + reader: &mut SwfStream<'a>, + tag_len: usize, + version: u8, + ) -> DecodeResult { + let mut write = self.0.write(context.gc_context); + let tag_start = + reader.get_ref().as_ptr() as u64 - write.static_data.swf.as_ref().as_ptr() as u64; + let place_object = if version == 1 { + reader.read_place_object(tag_len) + } else { + reader.read_place_object_2_or_3(version) + }?; + + write.queued_tags.insert( + place_object.depth as Depth, + QueuedTag { + tag_type: QueuedTagAction::Place(version), + tag_start, + tag_len, + }, + ); + + Ok(()) + } + fn place_object( self, context: &mut UpdateContext<'_, 'gc, '_>, @@ -3304,6 +3384,35 @@ impl<'gc, 'a> MovieClip<'gc> { Ok(()) } + #[inline] + fn queue_remove_object( + self, + context: &mut UpdateContext<'_, 'gc, '_>, + reader: &mut SwfStream<'a>, + tag_len: usize, + version: u8, + ) -> DecodeResult { + let mut write = self.0.write(context.gc_context); + let tag_start = + reader.get_ref().as_ptr() as u64 - write.static_data.swf.as_ref().as_ptr() as u64; + let remove_object = if version == 1 { + reader.read_remove_object_1() + } else { + reader.read_remove_object_2() + }?; + + write.queued_tags.insert( + remove_object.depth as Depth, + QueuedTag { + tag_type: QueuedTagAction::Remove(version), + tag_start, + tag_len, + }, + ); + + Ok(()) + } + #[inline] fn set_background_color( self, @@ -3572,6 +3681,27 @@ impl<'a> GotoPlaceObject<'a> { } } +/// A single tag we encountered this frame that we intend to process on a queue. +/// +/// No more than one queued action is allowed to be processed on-queue. +#[derive(Debug, Eq, PartialEq, Clone, Collect)] +#[collect(require_static)] +pub struct QueuedTag { + pub tag_type: QueuedTagAction, + pub tag_start: u64, + pub tag_len: usize, +} + +/// The type of queued tag. +/// +/// The u8 parameter is the tag version. +#[derive(Debug, Eq, PartialEq, Clone, Collect)] +#[collect(require_static)] +pub enum QueuedTagAction { + Place(u8), + Remove(u8), +} + bitflags! { /// Boolean state flags used by `MovieClip`. #[derive(Collect)] From 93525df04557d055e4972cf43b12efccf53d5c56 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Thu, 28 Jul 2022 17:20:54 -0400 Subject: [PATCH 26/47] core: Remove AVM2 compatibility hacks surrounding place frame. They are no longer needed, frame advance happens at enterframe time. --- core/src/display_object/movie_clip.rs | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 1f261c905b01..89a92ab266f3 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1204,13 +1204,7 @@ impl<'gc> MovieClip<'gc> { child.set_instantiated_by_timeline(context.gc_context, true); child.set_depth(context.gc_context, depth); child.set_parent(context.gc_context, Some(self.into())); - if movie.is_action_script_3() { - // In AVM2 instantiation happens before frame advance so we - // have to special-case that - child.set_place_frame(context.gc_context, self.current_frame() + 1); - } else { - child.set_place_frame(context.gc_context, self.current_frame()); - } + child.set_place_frame(context.gc_context, self.current_frame()); // Apply PlaceObject parameters. child.apply_place_object(context, place_object); @@ -3341,13 +3335,7 @@ impl<'gc, 'a> MovieClip<'gc> { if let Some(child) = self.child_by_depth(place_object.depth.into()) { child.replace_with(context, id); child.apply_place_object(context, &place_object); - if context.is_action_script_3() { - // In AVM2 instantiation happens before frame advance so we - // have to special-case that - child.set_place_frame(context.gc_context, self.current_frame() + 1); - } else { - child.set_place_frame(context.gc_context, self.current_frame()); - } + child.set_place_frame(context.gc_context, self.current_frame()); } } PlaceObjectAction::Modify => { From b7b0bb03d4b14d61e3caba281f678973d957871b Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 14 Dec 2021 22:38:39 -0500 Subject: [PATCH 27/47] core: `frameConstructed` during a goto fires after the goto commands have fully completed. --- core/src/display_object/movie_clip.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 89a92ab266f3..f935760dc3b9 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1528,10 +1528,6 @@ impl<'gc> MovieClip<'gc> { .filter(|params| params.frame < frame) .for_each(|goto| run_goto_command(self, context, goto)); - if !is_implicit { - self.frame_constructed(context); - } - // Next, run the final frame for the parent clip. // Re-run the final frame without display tags (DoAction, StartSound, etc.) // Note that this only happens if the frame exists and is loaded; @@ -1551,6 +1547,7 @@ impl<'gc> MovieClip<'gc> { .for_each(|goto| run_goto_command(self, context, goto)); if !is_implicit { + self.frame_constructed(context); self.avm2_root(context) .unwrap_or_else(|| self.into()) .run_frame_scripts(context); From c8a1fe55f07957dbb0990f10467e4682a4bd8429 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sat, 8 Jan 2022 14:33:23 -0500 Subject: [PATCH 28/47] core: Explicit gotos must run even if they are no-ops. --- core/src/display_object/movie_clip.rs | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index f935760dc3b9..f51d7d3c0a5b 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -788,19 +788,17 @@ impl<'gc> MovieClip<'gc> { // Clamp frame number in bounds. let frame = frame.max(1); - if frame != self.current_frame() { - if self - .0 - .read() - .flags - .contains(MovieClipFlags::EXECUTING_AVM2_FRAME_SCRIPT) - { - // AVM2 does not allow a clip to see while it is executing a frame script. - // The goto is instead queued and run once the frame script is completed. - self.0.write(context.gc_context).queued_goto_frame = Some(frame); - } else { - self.run_goto(context, frame, false); - } + if self + .0 + .read() + .flags + .contains(MovieClipFlags::EXECUTING_AVM2_FRAME_SCRIPT) + { + // AVM2 does not allow a clip to see while it is executing a frame script. + // The goto is instead queued and run once the frame script is completed. + self.0.write(context.gc_context).queued_goto_frame = Some(frame); + } else { + self.run_goto(context, frame, false); } } From c4078ccd84b7b340edcf672e0a3419cfd3a1ddee Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sat, 22 Jan 2022 18:22:47 -0500 Subject: [PATCH 29/47] core: Same-frame gotos should only proceed on AVM2. --- core/src/display_object/movie_clip.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index f51d7d3c0a5b..c801fb29d1d0 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -788,17 +788,19 @@ impl<'gc> MovieClip<'gc> { // Clamp frame number in bounds. let frame = frame.max(1); - if self - .0 - .read() - .flags - .contains(MovieClipFlags::EXECUTING_AVM2_FRAME_SCRIPT) - { - // AVM2 does not allow a clip to see while it is executing a frame script. - // The goto is instead queued and run once the frame script is completed. - self.0.write(context.gc_context).queued_goto_frame = Some(frame); - } else { - self.run_goto(context, frame, false); + if frame != self.current_frame() || context.is_action_script_3() { + if self + .0 + .read() + .flags + .contains(MovieClipFlags::EXECUTING_AVM2_FRAME_SCRIPT) + { + // AVM2 does not allow a clip to see while it is executing a frame script. + // The goto is instead queued and run once the frame script is completed. + self.0.write(context.gc_context).queued_goto_frame = Some(frame); + } else { + self.run_goto(context, frame, false); + } } } From bff72f47ce6731ffd5d32b1fd46ac7de746bee08 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 28 Dec 2021 22:12:37 -0500 Subject: [PATCH 30/47] core: Movie clip rewinds should not remove any children until after the new timeline position has been set. --- core/src/display_object/movie_clip.rs | 61 +++++++++++++++------------ 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index c801fb29d1d0..c5be0d1bf8a1 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1385,35 +1385,11 @@ impl<'gc> MovieClip<'gc> { let is_rewind = if frame < self.current_frame() { // Because we can only step forward, we have to start at frame 1 - // when rewinding. + // when rewinding. We don't actually remove children yet because + // otherwise AS3 can observe byproducts of the rewinding process. self.0.write(context.gc_context).tag_stream_pos = 0; self.0.write(context.gc_context).current_frame = 0; - // Remove all display objects that were created after the destination frame. - // TODO: We want to do something like self.children.retain here, - // but BTreeMap::retain does not exist. - // TODO: AS3 children don't live on the depth list. Do they respect - // or ignore GOTOs? - let children: SmallVec<[_; 16]> = self - .0 - .read() - .container - .iter_children_by_depth() - .filter_map(|(depth, clip)| { - if clip.place_frame() > frame { - Some((depth, clip)) - } else { - None - } - }) - .collect(); - for (_depth, child) in children { - if !child.placed_by_script() { - self.remove_child(context, child, Lists::all()); - } else { - self.remove_child(context, child, Lists::DEPTH); - } - } true } else { false @@ -1514,6 +1490,39 @@ impl<'gc> MovieClip<'gc> { } }; + if is_rewind { + // Remove all display objects that were created after the + // destination frame. + // + // We do this after reading the clip timeline so that AS3 can't + // observe side effects of the rewinding process. + // + // TODO: We want to do something like self.children.retain here, + // but BTreeMap::retain does not exist. + // TODO: AS3 children don't live on the depth list. Do they respect + // or ignore GOTOs? + let children: SmallVec<[_; 16]> = self + .0 + .read() + .container + .iter_children_by_depth() + .filter_map(|(depth, clip)| { + if clip.place_frame() > frame { + Some((depth, clip)) + } else { + None + } + }) + .collect(); + for (_depth, child) in children { + if !child.placed_by_script() { + self.remove_child(context, child, Lists::all()); + } else { + self.remove_child(context, child, Lists::DEPTH); + } + } + } + // We have to be sure that queued actions are generated in the same order // as if the playhead had reached this frame normally. From af3aed29384696b322362867d441d82ecf07ac70 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Thu, 28 Jul 2022 23:11:59 -0400 Subject: [PATCH 31/47] core: Queue new object placement at loop time on the tag queue. --- core/src/display_object/movie_clip.rs | 116 ++++++++++++++++++-------- 1 file changed, 81 insertions(+), 35 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index c5be0d1bf8a1..054cf28291f3 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1450,12 +1450,64 @@ impl<'gc> MovieClip<'gc> { } let hit_target_frame = self.0.read().current_frame == frame; + if is_rewind { + // Remove all display objects that were created after the + // destination frame. + // + // We do this after reading the clip timeline so that AS3 can't + // observe side effects of the rewinding process. + // + // TODO: We want to do something like self.children.retain here, + // but BTreeMap::retain does not exist. + // TODO: AS3 children don't live on the depth list. Do they respect + // or ignore GOTOs? + let children: SmallVec<[_; 16]> = self + .0 + .read() + .container + .iter_children_by_depth() + .filter_map(|(depth, clip)| { + if clip.place_frame() > frame { + Some((depth, clip)) + } else { + None + } + }) + .collect(); + for (_depth, child) in children { + if !child.placed_by_script() { + self.remove_child(context, child, Lists::all()); + } else { + self.remove_child(context, child, Lists::DEPTH); + } + } + } + // Run the list of goto commands to actually create and update the display objects. let run_goto_command = |clip: MovieClip<'gc>, context: &mut UpdateContext<'_, 'gc, '_>, params: &GotoPlaceObject<'_>| { use swf::PlaceObjectAction; let child_entry = clip.child_by_depth(params.depth()); + if context.is_action_script_3() && is_implicit && child_entry.is_none() { + // Looping gotos do not run their PlaceObject commands at goto + // time. They are instead held to frameConstructed like normal + // playback. + // + // TODO: We can only queue *new* object placement, existing + // objects still get updated too early. + self.0.write(context.gc_context).queued_tags.insert( + params.place_object.depth as Depth, + QueuedTag { + tag_type: QueuedTagAction::Place(params.version), + tag_start: params.tag_start, + tag_len: params.tag_len, + }, + ); + + return; + } + match (params.place_object.action, child_entry, is_rewind) { // Apply final delta to display parameters. // For rewinds, if an object was created before the final frame, @@ -1490,39 +1542,6 @@ impl<'gc> MovieClip<'gc> { } }; - if is_rewind { - // Remove all display objects that were created after the - // destination frame. - // - // We do this after reading the clip timeline so that AS3 can't - // observe side effects of the rewinding process. - // - // TODO: We want to do something like self.children.retain here, - // but BTreeMap::retain does not exist. - // TODO: AS3 children don't live on the depth list. Do they respect - // or ignore GOTOs? - let children: SmallVec<[_; 16]> = self - .0 - .read() - .container - .iter_children_by_depth() - .filter_map(|(depth, clip)| { - if clip.place_frame() > frame { - Some((depth, clip)) - } else { - None - } - }) - .collect(); - for (_depth, child) in children { - if !child.placed_by_script() { - self.remove_child(context, child, Lists::all()); - } else { - self.remove_child(context, child, Lists::DEPTH); - } - } - } - // We have to be sure that queued actions are generated in the same order // as if the playhead had reached this frame normally. @@ -2531,6 +2550,8 @@ impl<'gc> MovieClipData<'gc> { is_rewind: bool, index: usize, ) -> DecodeResult { + let tag_start = + reader.get_ref().as_ptr() as u64 - self.static_data.swf.as_ref().as_ptr() as u64; let place_object = if version == 1 { reader.read_place_object(tag_len) } else { @@ -2539,8 +2560,15 @@ impl<'gc> MovieClipData<'gc> { // We merge the deltas from this PlaceObject with the previous command. let depth: Depth = place_object.depth.into(); - let mut goto_place = - GotoPlaceObject::new(self.current_frame(), place_object, is_rewind, index); + let mut goto_place = GotoPlaceObject::new( + self.current_frame(), + place_object, + is_rewind, + index, + tag_start, + tag_len, + version, + ); if let Some(i) = goto_commands.iter().position(|o| o.depth() == depth) { goto_commands[i].merge(&mut goto_place); } else { @@ -3582,6 +3610,18 @@ struct GotoPlaceObject<'a> { place_object: swf::PlaceObject<'a>, /// Increasing index of this place command, for sorting. index: usize, + + /// The location of the *first* SWF tag that created this command. + /// + /// NOTE: Only intended to be used in looping gotos, where tag merging is + /// not possible and we want to add children after the goto completes. + tag_start: u64, + + /// The length of the PlaceObject tag at `tag_start`. + tag_len: usize, + + /// The version of the PlaceObject tag at `tag_start`. + version: u8, } impl<'a> GotoPlaceObject<'a> { @@ -3590,6 +3630,9 @@ impl<'a> GotoPlaceObject<'a> { mut place_object: swf::PlaceObject<'a>, is_rewind: bool, index: usize, + tag_start: u64, + tag_len: usize, + version: u8, ) -> Self { if is_rewind { if let swf::PlaceObjectAction::Place(_) = place_object.action { @@ -3625,6 +3668,9 @@ impl<'a> GotoPlaceObject<'a> { frame, place_object, index, + tag_start, + tag_len, + version, } } From cb2704e63acf5244967f46f22c537ca48a091051 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 2 Feb 2022 17:49:08 -0500 Subject: [PATCH 32/47] core: Fast-forward removals as the result of a goto happen before the frame number advances. --- core/src/display_object/movie_clip.rs | 35 ++++++++++++++++++++------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 054cf28291f3..170d960d15dc 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1364,6 +1364,8 @@ impl<'gc> MovieClip<'gc> { self.assert_expected_tag_start(); } + let from_frame = self.current_frame(); + // Flash gotos are tricky: // 1) Conceptually, a goto should act like the playhead is advancing forward or // backward to a frame. @@ -1438,12 +1440,22 @@ impl<'gc> MovieClip<'gc> { mc.goto_place_object(reader, tag_len, 4, &mut goto_commands, is_rewind, index) } - TagCode::RemoveObject => { - self.goto_remove_object(reader, 1, context, &mut goto_commands, is_rewind) - } - TagCode::RemoveObject2 => { - self.goto_remove_object(reader, 2, context, &mut goto_commands, is_rewind) - } + TagCode::RemoveObject => self.goto_remove_object( + reader, + 1, + context, + &mut goto_commands, + is_rewind, + from_frame, + ), + TagCode::RemoveObject2 => self.goto_remove_object( + reader, + 2, + context, + &mut goto_commands, + is_rewind, + from_frame, + ), _ => Ok(()), }; let _ = tag_utils::decode_tags(&mut reader, tag_callback, TagCode::ShowFrame); @@ -1791,6 +1803,7 @@ impl<'gc> MovieClip<'gc> { context: &mut UpdateContext<'_, 'gc, '_>, goto_commands: &mut Vec>, is_rewind: bool, + from_frame: FrameNumber, ) -> DecodeResult { let remove_object = if version == 1 { reader.read_remove_object_1() @@ -1807,15 +1820,19 @@ impl<'gc> MovieClip<'gc> { // Don't do this for rewinds, because they conceptually // start from an empty display list, and we also want to examine // the old children to decide if they persist (place_frame <= goto_frame). - let read = self.0.read(); - if let Some(child) = read.container.get_depth(depth) { - drop(read); + let to_frame = self.current_frame(); + self.0.write(context.gc_context).current_frame = from_frame; + + let child = self.0.read().container.get_depth(depth); + if let Some(child) = child { if !child.placed_by_script() { self.remove_child(context, child, Lists::all()); } else { self.remove_child(context, child, Lists::DEPTH); } } + + self.0.write(context.gc_context).current_frame = to_frame; } Ok(()) } From 9d58aecb90a899cd1b1ae9adb6b2455c58528cd9 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sun, 1 May 2022 17:16:12 -0400 Subject: [PATCH 33/47] core: Child removals appear to resolve in reverse render order. --- core/src/display_object/movie_clip.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 170d960d15dc..0d7376b556ee 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1952,7 +1952,8 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { } fn enter_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) { - for child in self.iter_render_list() { + //Child removals from looping gotos appear to resolve in reverse order. + for child in self.iter_render_list().rev() { child.enter_frame(context); } From e88dc81e2676b9180c7866395745cd4f9a6e5d1f Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 2 Aug 2022 21:36:02 -0400 Subject: [PATCH 34/47] core: In AVM2, run removals before frame advance. We still retain the queue system as events are fired at removal time, and those events can trigger more gotos. If such a goto happens, AS3 code will hit a clip still in the old state rather than an inconsistent one. I don't have test coverage for this exact scenario just yet. --- core/src/display_object/movie_clip.rs | 43 ++++++++++++++++----------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 0d7376b556ee..a97442caa3af 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1111,7 +1111,10 @@ impl<'gc> MovieClip<'gc> { context: &mut UpdateContext<'_, 'gc, '_>, run_display_actions: bool, ) { - match self.determine_next_frame() { + let next_frame = self.determine_next_frame(); + match next_frame { + //Removals happen before frame advance. + NextFrame::Next if context.is_action_script_3() => {} NextFrame::Next => self.0.write(context.gc_context).current_frame += 1, NextFrame::First => return self.run_goto(context, 1, true), NextFrame::Same => self.stop(context), @@ -1169,7 +1172,24 @@ impl<'gc> MovieClip<'gc> { }; let _ = tag_utils::decode_tags(&mut reader, tag_callback, TagCode::ShowFrame); + let remove_actions = self.unqueue_tags_matching(context, |t| { + matches!(t.tag_type, QueuedTagAction::Remove(_)) + }); + + for (_, tag) in remove_actions { + let mut reader = data.read_from(tag.tag_start); + let version = match tag.tag_type { + QueuedTagAction::Remove(v) => v, + _ => unreachable!(), + }; + + if let Err(e) = self.remove_object(context, &mut reader, version) { + log::error!("Error running queued tag: {:?}, got {}", tag.tag_type, e); + } + } + let mut write = self.0.write(context.gc_context); + write.tag_stream_pos = reader.get_ref().as_ptr() as u64 - tag_stream_start; // Check if our audio track has finished playing. @@ -1179,6 +1199,10 @@ impl<'gc> MovieClip<'gc> { } } + if matches!(next_frame, NextFrame::Next) && context.is_action_script_3() { + write.current_frame += 1; + } + let frame_id = write.current_frame; write.queued_script_frame = Some(frame_id); } @@ -1962,23 +1986,6 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { if is_playing { self.run_frame_internal(context, true); - - let data = self.0.read().static_data.swf.clone(); - let remove_actions = self.unqueue_tags_matching(context, |t| { - matches!(t.tag_type, QueuedTagAction::Remove(_)) - }); - - for (_, tag) in remove_actions { - let mut reader = data.read_from(tag.tag_start); - let version = match tag.tag_type { - QueuedTagAction::Remove(v) => v, - _ => unreachable!(), - }; - - if let Err(e) = self.remove_object(context, &mut reader, version) { - log::error!("Error running queued tag: {:?}, got {}", tag.tag_type, e); - } - } } } } From d7f3b5c861e42d39477973b98402589d462162f0 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 2 Aug 2022 23:11:22 -0400 Subject: [PATCH 35/47] core: No-op gotos should be treated as rewinding. --- core/src/display_object/movie_clip.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index a97442caa3af..8ee0bf7f144c 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1409,7 +1409,7 @@ impl<'gc> MovieClip<'gc> { self.0.write(context.gc_context).stop_audio_stream(context); - let is_rewind = if frame < self.current_frame() { + let is_rewind = if frame <= self.current_frame() { // Because we can only step forward, we have to start at frame 1 // when rewinding. We don't actually remove children yet because // otherwise AS3 can observe byproducts of the rewinding process. From 7adca76be336e1e91b53113b002455cddedba6c4 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 3 Aug 2022 18:30:52 -0400 Subject: [PATCH 36/47] core: Allow queueing both a remove and a place tag at the same depth, in that order only. --- core/src/display_object/movie_clip.rs | 116 +++++++++++++++++++------- 1 file changed, 85 insertions(+), 31 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 8ee0bf7f144c..542490a40f9c 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -107,7 +107,12 @@ pub struct MovieClipData<'gc> { tag_frame_boundaries: HashMap, /// List of tags queued up for the current frame. - queued_tags: HashMap, + /// + /// There are only a handful of valid tag configurations per depth: namely, + /// the empty set, one removal, one add, or a removal followed by an add. + /// Any other configuration in the SWF tag stream is normalized to one of + /// these patterns. + queued_tags: HashMap>, } impl<'gc> MovieClip<'gc> { @@ -1532,14 +1537,25 @@ impl<'gc> MovieClip<'gc> { // // TODO: We can only queue *new* object placement, existing // objects still get updated too early. - self.0.write(context.gc_context).queued_tags.insert( - params.place_object.depth as Depth, - QueuedTag { - tag_type: QueuedTagAction::Place(params.version), - tag_start: params.tag_start, - tag_len: params.tag_len, - }, - ); + let mut write = self.0.write(context.gc_context); + let new_tag = QueuedTag { + tag_type: QueuedTagAction::Place(params.version), + tag_start: params.tag_start, + tag_len: params.tag_len, + }; + let bucket = write + .queued_tags + .entry(params.place_object.depth as Depth) + .or_insert_with(|| Vec::with_capacity(2)); + + if let Some(slot) = bucket + .iter_mut() + .rfind(|i| matches!(i.tag_type, QueuedTagAction::Place(_))) + { + *slot = new_tag + } else { + bucket.push(new_tag); + } return; } @@ -1923,23 +1939,33 @@ impl<'gc> MovieClip<'gc> { fn unqueue_tags_matching( &self, context: &mut UpdateContext<'_, 'gc, '_>, - mut matching: F, + matching: F, ) -> Vec<(Depth, QueuedTag)> where - F: FnMut(&QueuedTag) -> bool, + F: Fn(&QueuedTag) -> bool, { let mut write = self.0.write(context.gc_context); let mut unqueued: Vec<_> = write .queued_tags .iter() - .filter(|(_, t)| matching(t)) - .map(|(d, t)| (*d, t.clone())) + .flat_map(|(d, b)| b.iter().filter(|t| matching(t)).map(|t| (*d, t.clone()))) .collect(); unqueued.sort_by(|(_, t1), (_, t2)| t1.tag_start.cmp(&t2.tag_start)); - for (depth, _) in unqueued.iter() { - write.queued_tags.remove(depth); + for (depth, tag) in unqueued.iter_mut() { + let bucket = write + .queued_tags + .get_mut(depth) + .expect("Unqueued tag to come from a depth that exists"); + let pos = bucket + .iter() + .enumerate() + .find(|(_, o)| *o == tag) + .map(|(i, _)| i) + .expect("Unqueued tag to still be present in source bucket"); + + bucket.remove(pos); } unqueued @@ -3361,14 +3387,24 @@ impl<'gc, 'a> MovieClip<'gc> { reader.read_place_object_2_or_3(version) }?; - write.queued_tags.insert( - place_object.depth as Depth, - QueuedTag { - tag_type: QueuedTagAction::Place(version), - tag_start, - tag_len, - }, - ); + let new_tag = QueuedTag { + tag_type: QueuedTagAction::Place(version), + tag_start, + tag_len, + }; + let bucket = write + .queued_tags + .entry(place_object.depth as Depth) + .or_insert_with(|| Vec::with_capacity(2)); + + if let Some(slot) = bucket + .iter_mut() + .rfind(|i| matches!(i.tag_type, QueuedTagAction::Place(_))) + { + *slot = new_tag + } else { + bucket.push(new_tag); + } Ok(()) } @@ -3448,14 +3484,32 @@ impl<'gc, 'a> MovieClip<'gc> { reader.read_remove_object_2() }?; - write.queued_tags.insert( - remove_object.depth as Depth, - QueuedTag { - tag_type: QueuedTagAction::Remove(version), - tag_start, - tag_len, - }, - ); + let new_tag = QueuedTag { + tag_type: QueuedTagAction::Remove(version), + tag_start, + tag_len, + }; + let bucket = write + .queued_tags + .entry(remove_object.depth as Depth) + .or_insert_with(|| Vec::with_capacity(2)); + + let place_slot_id = bucket + .iter() + .enumerate() + .rfind(|(_, i)| matches!(i.tag_type, QueuedTagAction::Place(_))) + .map(|(i, _)| i); + + if let Some(place_slot_id) = place_slot_id { + bucket.remove(place_slot_id); // Add + Remove cancel each other out. + } else if let Some(slot) = bucket + .iter_mut() + .rfind(|i| matches!(i.tag_type, QueuedTagAction::Remove(_))) + { + *slot = new_tag + } else { + bucket.push(new_tag); + } Ok(()) } From e82c7168dedce7d21e40b5ea61f4fb4297604ca6 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sun, 30 Jan 2022 18:27:11 -0500 Subject: [PATCH 37/47] core: Gotos *always* queue the target frame's scripts on the target clip, even if we already executed that script beforehand. --- core/src/display_object/movie_clip.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 542490a40f9c..e1499e4bf16f 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1608,6 +1608,12 @@ impl<'gc> MovieClip<'gc> { .filter(|params| params.frame < frame) .for_each(|goto| run_goto_command(self, context, goto)); + if context.is_action_script_3() { + let mut write = self.0.write(context.gc_context); + write.queued_script_frame = Some(clamped_frame); + write.last_queued_script_frame = None; + } + // Next, run the final frame for the parent clip. // Re-run the final frame without display tags (DoAction, StartSound, etc.) // Note that this only happens if the frame exists and is loaded; From fb54f1220fbb8d9c4f7cbc4517797eb0befe2ce6 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 1 Feb 2022 19:50:56 -0500 Subject: [PATCH 38/47] core: Only force-queue frame scripts if the goto is not a no-op. --- core/src/display_object/movie_clip.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index e1499e4bf16f..9b9ead5f6f12 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1393,8 +1393,6 @@ impl<'gc> MovieClip<'gc> { self.assert_expected_tag_start(); } - let from_frame = self.current_frame(); - // Flash gotos are tricky: // 1) Conceptually, a goto should act like the playhead is advancing forward or // backward to a frame. @@ -1426,6 +1424,8 @@ impl<'gc> MovieClip<'gc> { false }; + let from_frame = self.current_frame(); + // Step through the intermediate frames, and aggregate the deltas of each frame. let mc = self.0.read(); let tag_stream_start = mc.static_data.swf.as_ref().as_ptr() as u64; @@ -1611,7 +1611,10 @@ impl<'gc> MovieClip<'gc> { if context.is_action_script_3() { let mut write = self.0.write(context.gc_context); write.queued_script_frame = Some(clamped_frame); - write.last_queued_script_frame = None; + + if write.current_frame != from_frame { + write.last_queued_script_frame = None; + } } // Next, run the final frame for the parent clip. From eba1134a00cdbaa2c45746489f94845ae8c30739 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 3 Aug 2022 19:30:36 -0400 Subject: [PATCH 39/47] core: Only `Construct` and `Enter` phases want forced script frames on gotos --- core/src/display_object/movie_clip.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 9b9ead5f6f12..5e3a815a3aab 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -32,7 +32,7 @@ use crate::display_object::{ use crate::drawing::Drawing; use crate::events::{ButtonKeyCode, ClipEvent, ClipEventResult}; use crate::font::Font; -use crate::frame_lifecycle::catchup_display_object_to_frame; +use crate::frame_lifecycle::{catchup_display_object_to_frame, FramePhase}; use crate::prelude::*; use crate::string::{AvmString, WStr, WString}; use crate::tag_utils::{self, DecodeResult, Error, SwfMovie, SwfSlice, SwfStream}; @@ -1612,7 +1612,10 @@ impl<'gc> MovieClip<'gc> { let mut write = self.0.write(context.gc_context); write.queued_script_frame = Some(clamped_frame); - if write.current_frame != from_frame { + if (*context.frame_phase == FramePhase::Construct + || *context.frame_phase == FramePhase::Enter) + && write.current_frame != from_frame + { write.last_queued_script_frame = None; } } From 3475e5864885702d110c9d998f9d28f501f05fe9 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 2 Feb 2022 20:03:15 -0500 Subject: [PATCH 40/47] core: Fast-forwarding gotos should run frame scripts on all removed children --- core/src/display_object/movie_clip.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 5e3a815a3aab..65b8fbfb6b28 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1438,6 +1438,8 @@ impl<'gc> MovieClip<'gc> { let clamped_frame = frame.min(mc.total_frames()); drop(mc); + let mut removed_frame_scripts: Vec> = vec![]; + let mut reader = data.read_from(frame_pos); while self.current_frame() < clamped_frame && !reader.get_ref().is_empty() { self.0.write(context.gc_context).current_frame += 1; @@ -1476,6 +1478,7 @@ impl<'gc> MovieClip<'gc> { &mut goto_commands, is_rewind, from_frame, + &mut removed_frame_scripts, ), TagCode::RemoveObject2 => self.goto_remove_object( reader, @@ -1484,6 +1487,7 @@ impl<'gc> MovieClip<'gc> { &mut goto_commands, is_rewind, from_frame, + &mut removed_frame_scripts, ), _ => Ok(()), }; @@ -1643,6 +1647,11 @@ impl<'gc> MovieClip<'gc> { self.avm2_root(context) .unwrap_or_else(|| self.into()) .run_frame_scripts(context); + + for child in removed_frame_scripts { + child.run_frame_scripts(context); + } + self.exit_frame(context); } @@ -1848,6 +1857,7 @@ impl<'gc> MovieClip<'gc> { /// Handle a RemoveObject tag when running a goto action. #[inline] + #[allow(clippy::too_many_arguments)] fn goto_remove_object<'a>( mut self, reader: &mut SwfStream<'a>, @@ -1856,6 +1866,7 @@ impl<'gc> MovieClip<'gc> { goto_commands: &mut Vec>, is_rewind: bool, from_frame: FrameNumber, + removed_frame_scripts: &mut Vec>, ) -> DecodeResult { let remove_object = if version == 1 { reader.read_remove_object_1() @@ -1882,6 +1893,8 @@ impl<'gc> MovieClip<'gc> { } else { self.remove_child(context, child, Lists::DEPTH); } + + removed_frame_scripts.push(child); } self.0.write(context.gc_context).current_frame = to_frame; From 01102b6907fed09afd80ca3636f4b04e8dd857eb Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 3 Aug 2022 21:41:52 -0400 Subject: [PATCH 41/47] core: Clear queued tags if AS3 attempts a goto in the middle of a loop. --- core/src/display_object/movie_clip.rs | 30 +++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 65b8fbfb6b28..462727582630 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1426,6 +1426,16 @@ impl<'gc> MovieClip<'gc> { let from_frame = self.current_frame(); + let mut write = self.0.write(context.gc_context); + if write.loop_queued() { + write.queued_tags = HashMap::new(); + } + + if is_implicit { + write.set_loop_queued(); + } + drop(write); + // Step through the intermediate frames, and aggregate the deltas of each frame. let mc = self.0.read(); let tag_stream_start = mc.static_data.swf.as_ref().as_ptr() as u64; @@ -2076,6 +2086,8 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { } } + self.0.write(context.gc_context).unset_loop_queued(); + if needs_construction { self.construct_as_avm2_object(context); @@ -2599,6 +2611,18 @@ impl<'gc> MovieClipData<'gc> { self.flags |= MovieClipFlags::PROGRAMMATICALLY_PLAYED; } + fn loop_queued(&self) -> bool { + self.flags.contains(MovieClipFlags::LOOP_QUEUED) + } + + fn set_loop_queued(&mut self) { + self.flags |= MovieClipFlags::LOOP_QUEUED; + } + + fn unset_loop_queued(&mut self) { + self.flags.remove(MovieClipFlags::LOOP_QUEUED); + } + fn play(&mut self) { // Can only play clips with multiple frames. if self.total_frames() > 1 { @@ -3867,6 +3891,12 @@ bitflags! { /// /// This causes any goto action to be queued and executed at the end of the script. const EXECUTING_AVM2_FRAME_SCRIPT = 1 << 3; + + /// Flag set when AVM2 loops to the next frame. + /// + /// Because AVM2 queues PlaceObject tags to run later, explicit gotos + /// that happen while those tags run should cancel the loop. + const LOOP_QUEUED = 1 << 4; } } From 8568cfb0ee5757add39d35d712a791063f24ce97 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 3 Aug 2022 21:44:21 -0400 Subject: [PATCH 42/47] core: Explicit gotos drain the tag queue of any prior operations. This is in keeping with the whole idea of a "recursive frame": gotos run the entire frame lifecycle on the target clip, including broadcasts for `frameConstructed` and `exitFrame`. --- core/src/display_object/movie_clip.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 462727582630..b516f41e2316 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -1653,6 +1653,7 @@ impl<'gc> MovieClip<'gc> { .for_each(|goto| run_goto_command(self, context, goto)); if !is_implicit { + self.construct_frame(context); self.frame_constructed(context); self.avm2_root(context) .unwrap_or_else(|| self.into()) From ab11022692bd18f7ecfcb84a259c9ca3983ed8f7 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 3 Aug 2022 22:00:56 -0400 Subject: [PATCH 43/47] tests: Fix regression in `as3_loaderinfo_events` caused by the frame lifecycle fixes --- tests/tests/swfs/avm2/loaderinfo_events/output.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/tests/swfs/avm2/loaderinfo_events/output.txt b/tests/tests/swfs/avm2/loaderinfo_events/output.txt index ba45b16c591a..4a69c213715e 100644 --- a/tests/tests/swfs/avm2/loaderinfo_events/output.txt +++ b/tests/tests/swfs/avm2/loaderinfo_events/output.txt @@ -4,3 +4,4 @@ Called addedToStage Called exitFrame Called init! Called enterFrame +Called exitFrame \ No newline at end of file From 71807f74be1a89d0fe81f378fd44e33f4f43aff4 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Thu, 4 Aug 2022 19:29:27 -0400 Subject: [PATCH 44/47] core: Fix a potential stack overflow caused by gotos triggering frame scripts on one another. --- core/src/display_object/movie_clip.rs | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index b516f41e2316..f9f143329e84 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -32,7 +32,7 @@ use crate::display_object::{ use crate::drawing::Drawing; use crate::events::{ButtonKeyCode, ClipEvent, ClipEventResult}; use crate::font::Font; -use crate::frame_lifecycle::{catchup_display_object_to_frame, FramePhase}; +use crate::frame_lifecycle::catchup_display_object_to_frame; use crate::prelude::*; use crate::string::{AvmString, WStr, WString}; use crate::tag_utils::{self, DecodeResult, Error, SwfMovie, SwfSlice, SwfStream}; @@ -1208,8 +1208,13 @@ impl<'gc> MovieClip<'gc> { write.current_frame += 1; } - let frame_id = write.current_frame; - write.queued_script_frame = Some(frame_id); + write.queued_script_frame = Some(write.current_frame); + if write.last_queued_script_frame != Some(write.current_frame) { + // We explicitly clear this variable since AS3 may later GOTO back + // to the already-ran frame. Since the frame number *has* changed + // in the meantime, it should absolutely run again. + write.last_queued_script_frame = None; + } } /// Instantiate a given child object on the timeline at a given depth. @@ -1622,18 +1627,6 @@ impl<'gc> MovieClip<'gc> { .filter(|params| params.frame < frame) .for_each(|goto| run_goto_command(self, context, goto)); - if context.is_action_script_3() { - let mut write = self.0.write(context.gc_context); - write.queued_script_frame = Some(clamped_frame); - - if (*context.frame_phase == FramePhase::Construct - || *context.frame_phase == FramePhase::Enter) - && write.current_frame != from_frame - { - write.last_queued_script_frame = None; - } - } - // Next, run the final frame for the parent clip. // Re-run the final frame without display tags (DoAction, StartSound, etc.) // Note that this only happens if the frame exists and is loaded; From 68ddaf21ed78e9d163b6dfe6a69831e00ab26edf Mon Sep 17 00:00:00 2001 From: David Wendt Date: Fri, 12 Aug 2022 22:52:47 -0400 Subject: [PATCH 45/47] core: Replace `Vec` of queued tags with a more restrictive enum that enforces our queueing invariants --- core/src/display_object/movie_clip.rs | 174 +++++++++++++++----------- 1 file changed, 103 insertions(+), 71 deletions(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index f9f143329e84..fcac1e333544 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -107,12 +107,7 @@ pub struct MovieClipData<'gc> { tag_frame_boundaries: HashMap, /// List of tags queued up for the current frame. - /// - /// There are only a handful of valid tag configurations per depth: namely, - /// the empty set, one removal, one add, or a removal followed by an add. - /// Any other configuration in the SWF tag stream is normalized to one of - /// these patterns. - queued_tags: HashMap>, + queued_tags: HashMap, } impl<'gc> MovieClip<'gc> { @@ -1177,9 +1172,7 @@ impl<'gc> MovieClip<'gc> { }; let _ = tag_utils::decode_tags(&mut reader, tag_callback, TagCode::ShowFrame); - let remove_actions = self.unqueue_tags_matching(context, |t| { - matches!(t.tag_type, QueuedTagAction::Remove(_)) - }); + let remove_actions = self.unqueue_removes(context); for (_, tag) in remove_actions { let mut reader = data.read_from(tag.tag_start); @@ -1565,16 +1558,9 @@ impl<'gc> MovieClip<'gc> { let bucket = write .queued_tags .entry(params.place_object.depth as Depth) - .or_insert_with(|| Vec::with_capacity(2)); + .or_insert_with(|| QueuedTagList::None); - if let Some(slot) = bucket - .iter_mut() - .rfind(|i| matches!(i.tag_type, QueuedTagAction::Place(_))) - { - *slot = new_tag - } else { - bucket.push(new_tag); - } + bucket.queue_add(new_tag); return; } @@ -1965,36 +1951,39 @@ impl<'gc> MovieClip<'gc> { } } - fn unqueue_tags_matching( - &self, - context: &mut UpdateContext<'_, 'gc, '_>, - matching: F, - ) -> Vec<(Depth, QueuedTag)> - where - F: Fn(&QueuedTag) -> bool, - { + fn unqueue_adds(&self, context: &mut UpdateContext<'_, 'gc, '_>) -> Vec<(Depth, QueuedTag)> { let mut write = self.0.write(context.gc_context); let mut unqueued: Vec<_> = write .queued_tags - .iter() - .flat_map(|(d, b)| b.iter().filter(|t| matching(t)).map(|t| (*d, t.clone()))) + .iter_mut() + .filter_map(|(d, b)| b.unqueue_add().map(|b| (*d, b))) .collect(); unqueued.sort_by(|(_, t1), (_, t2)| t1.tag_start.cmp(&t2.tag_start)); - for (depth, tag) in unqueued.iter_mut() { - let bucket = write - .queued_tags - .get_mut(depth) - .expect("Unqueued tag to come from a depth that exists"); - let pos = bucket - .iter() - .enumerate() - .find(|(_, o)| *o == tag) - .map(|(i, _)| i) - .expect("Unqueued tag to still be present in source bucket"); + for (depth, _tag) in unqueued.iter() { + if matches!(write.queued_tags.get(depth), Some(QueuedTagList::None)) { + write.queued_tags.remove(depth); + } + } + + unqueued + } + + fn unqueue_removes(&self, context: &mut UpdateContext<'_, 'gc, '_>) -> Vec<(Depth, QueuedTag)> { + let mut write = self.0.write(context.gc_context); + let mut unqueued: Vec<_> = write + .queued_tags + .iter_mut() + .filter_map(|(d, b)| b.unqueue_remove().map(|b| (*d, b))) + .collect(); - bucket.remove(pos); + unqueued.sort_by(|(_, t1), (_, t2)| t1.tag_start.cmp(&t2.tag_start)); + + for (depth, _tag) in unqueued.iter() { + if matches!(write.queued_tags.get(depth), Some(QueuedTagList::None)) { + write.queued_tags.remove(depth); + } } unqueued @@ -2064,9 +2053,7 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { }; let data = self.0.read().static_data.swf.clone(); - let place_actions = self.unqueue_tags_matching(context, |t| { - matches!(t.tag_type, QueuedTagAction::Place(_)) - }); + let place_actions = self.unqueue_adds(context); for (_, tag) in place_actions { let mut reader = data.read_from(tag.tag_start); @@ -3438,16 +3425,9 @@ impl<'gc, 'a> MovieClip<'gc> { let bucket = write .queued_tags .entry(place_object.depth as Depth) - .or_insert_with(|| Vec::with_capacity(2)); + .or_insert_with(|| QueuedTagList::None); - if let Some(slot) = bucket - .iter_mut() - .rfind(|i| matches!(i.tag_type, QueuedTagAction::Place(_))) - { - *slot = new_tag - } else { - bucket.push(new_tag); - } + bucket.queue_add(new_tag); Ok(()) } @@ -3535,24 +3515,9 @@ impl<'gc, 'a> MovieClip<'gc> { let bucket = write .queued_tags .entry(remove_object.depth as Depth) - .or_insert_with(|| Vec::with_capacity(2)); + .or_insert_with(|| QueuedTagList::None); - let place_slot_id = bucket - .iter() - .enumerate() - .rfind(|(_, i)| matches!(i.tag_type, QueuedTagAction::Place(_))) - .map(|(i, _)| i); - - if let Some(place_slot_id) = place_slot_id { - bucket.remove(place_slot_id); // Add + Remove cancel each other out. - } else if let Some(slot) = bucket - .iter_mut() - .rfind(|i| matches!(i.tag_type, QueuedTagAction::Remove(_))) - { - *slot = new_tag - } else { - bucket.push(new_tag); - } + bucket.queue_remove(new_tag); Ok(()) } @@ -3843,10 +3808,77 @@ impl<'a> GotoPlaceObject<'a> { } } +/// A list of add/remove tags to process on a given depth this frame. +/// +/// There are only a handful of valid tag configurations per depth: namely, +/// no tags, one removal, one add, or a removal followed by an add. +/// +/// Any other configuration in the SWF tag stream is normalized to one of +/// these patterns. +#[derive(Default, Debug, Eq, PartialEq, Clone, Copy, Collect)] +#[collect(require_static)] +pub enum QueuedTagList { + #[default] + None, + Add(QueuedTag), + Remove(QueuedTag), + RemoveThenAdd(QueuedTag, QueuedTag), +} + +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::Remove(r) => QueuedTagList::RemoveThenAdd(*r, add_tag), + QueuedTagList::RemoveThenAdd(r, _) => QueuedTagList::RemoveThenAdd(*r, add_tag), + }; + + *self = new; + } + + fn queue_remove(&mut self, remove_tag: QueuedTag) { + let new = match self { + QueuedTagList::None => QueuedTagList::Remove(remove_tag), + QueuedTagList::Add(_) => QueuedTagList::None, + QueuedTagList::Remove(_) => QueuedTagList::Remove(remove_tag), + QueuedTagList::RemoveThenAdd(r, _) => QueuedTagList::Remove(*r), + }; + + *self = new; + } + + fn unqueue_add(&mut self) -> Option { + let (new_queue, return_val) = match self { + QueuedTagList::None => (QueuedTagList::None, None), + QueuedTagList::Add(a) => (QueuedTagList::None, Some(*a)), + QueuedTagList::Remove(r) => (QueuedTagList::Remove(*r), None), + QueuedTagList::RemoveThenAdd(r, a) => (QueuedTagList::Remove(*r), Some(*a)), + }; + + *self = new_queue; + + return_val + } + + fn unqueue_remove(&mut self) -> Option { + let (new_queue, return_val) = match self { + QueuedTagList::None => (QueuedTagList::None, None), + QueuedTagList::Add(a) => (QueuedTagList::Add(*a), None), + QueuedTagList::Remove(r) => (QueuedTagList::None, Some(*r)), + QueuedTagList::RemoveThenAdd(r, a) => (QueuedTagList::Add(*a), Some(*r)), + }; + + *self = new_queue; + + return_val + } +} + /// A single tag we encountered this frame that we intend to process on a queue. /// /// No more than one queued action is allowed to be processed on-queue. -#[derive(Debug, Eq, PartialEq, Clone, Collect)] +#[derive(Debug, Eq, PartialEq, Clone, Copy, Collect)] #[collect(require_static)] pub struct QueuedTag { pub tag_type: QueuedTagAction, @@ -3857,7 +3889,7 @@ pub struct QueuedTag { /// The type of queued tag. /// /// The u8 parameter is the tag version. -#[derive(Debug, Eq, PartialEq, Clone, Collect)] +#[derive(Debug, Eq, PartialEq, Clone, Copy, Collect)] #[collect(require_static)] pub enum QueuedTagAction { Place(u8), From 1a712f6c8bf84a22a13f98f07beb3526d276c713 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Wed, 24 Aug 2022 18:12:19 -0400 Subject: [PATCH 46/47] docs: Add comments documenting subtle points of AS3 loop & tag queueing behavior --- core/src/display_object/movie_clip.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index fcac1e333544..4db6ef330c1d 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -788,6 +788,8 @@ impl<'gc> MovieClip<'gc> { // Clamp frame number in bounds. let frame = frame.max(1); + // In AS3, no-op gotos have side effects that are visible to user code. + // Hence, we have to run them anyway. if frame != self.current_frame() || context.is_action_script_3() { if self .0 @@ -1113,7 +1115,7 @@ impl<'gc> MovieClip<'gc> { ) { let next_frame = self.determine_next_frame(); match next_frame { - //Removals happen before frame advance. + // AS3 removals need to happen before frame advance (see below) NextFrame::Next if context.is_action_script_3() => {} NextFrame::Next => self.0.write(context.gc_context).current_frame += 1, NextFrame::First => return self.run_goto(context, 1, true), @@ -1172,6 +1174,10 @@ impl<'gc> MovieClip<'gc> { }; let _ = tag_utils::decode_tags(&mut reader, tag_callback, TagCode::ShowFrame); + // On AS3, we deliberately run all removals before the frame number or + // tag position updates. This ensures that code that runs gotos when a + // display object is added or removed does not catch the movie clip in + // an invalid state. let remove_actions = self.unqueue_removes(context); for (_, tag) in remove_actions { @@ -1186,6 +1192,8 @@ impl<'gc> MovieClip<'gc> { } } + // It is now safe to update the tag position and frame number. + // TODO: Determine if explicit gotos override these or not. let mut write = self.0.write(context.gc_context); write.tag_stream_pos = reader.get_ref().as_ptr() as u64 - tag_stream_start; @@ -1424,6 +1432,9 @@ impl<'gc> MovieClip<'gc> { let from_frame = self.current_frame(); + // Explicit gotos in the middle of an AS3 loop cancel the loop's queued + // tags. The rest of the goto machinery can handle the side effects of + // a half-executed loop. let mut write = self.0.write(context.gc_context); if write.loop_queued() { write.queued_tags = HashMap::new(); @@ -1631,6 +1642,12 @@ impl<'gc> MovieClip<'gc> { .filter(|params| params.frame >= frame) .for_each(|goto| run_goto_command(self, context, goto)); + // On AVM2, all explicit gotos act the same way as a normal new frame, + // save for the lack of an enterFrame event. Since this must happen + // before AS3 continues execution, this is effectively a "recursive + // frame". + // + // Our queued place tags will now run at this time, too. if !is_implicit { self.construct_frame(context); self.frame_constructed(context); @@ -1873,6 +1890,8 @@ impl<'gc> MovieClip<'gc> { // Don't do this for rewinds, because they conceptually // start from an empty display list, and we also want to examine // the old children to decide if they persist (place_frame <= goto_frame). + // + // We also have to reset the frame number as this emits AS3 events. let to_frame = self.current_frame(); self.0.write(context.gc_context).current_frame = from_frame; @@ -1951,6 +1970,7 @@ impl<'gc> MovieClip<'gc> { } } + /// Remove all `PlaceObject` tags off the internal tag queue. fn unqueue_adds(&self, context: &mut UpdateContext<'_, 'gc, '_>) -> Vec<(Depth, QueuedTag)> { let mut write = self.0.write(context.gc_context); let mut unqueued: Vec<_> = write @@ -1970,6 +1990,7 @@ impl<'gc> MovieClip<'gc> { unqueued } + /// Remove all `RemoveObject` tags off the internal tag queue. fn unqueue_removes(&self, context: &mut UpdateContext<'_, 'gc, '_>) -> Vec<(Depth, QueuedTag)> { let mut write = self.0.write(context.gc_context); let mut unqueued: Vec<_> = write @@ -2052,6 +2073,7 @@ impl<'gc> TDisplayObject<'gc> for MovieClip<'gc> { false }; + // PlaceObject tags execute at this time. let data = self.0.read().static_data.swf.clone(); let place_actions = self.unqueue_adds(context); From 9011e7afdaf235480e2beb2454974bd0d1b1e355 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Wed, 24 Aug 2022 18:15:21 -0500 Subject: [PATCH 47/47] core: Use catchup_display_object_to_frame in Loader --- core/src/loader.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/loader.rs b/core/src/loader.rs index f8414da3fbda..c1df22916033 100644 --- a/core/src/loader.rs +++ b/core/src/loader.rs @@ -20,6 +20,7 @@ use crate::display_object::{ Bitmap, DisplayObject, TDisplayObject, TDisplayObjectContainer, TInteractiveObject, }; use crate::events::ClipEvent; +use crate::frame_lifecycle::catchup_display_object_to_frame; use crate::player::Player; use crate::string::AvmString; use crate::tag_utils::SwfMovie; @@ -558,13 +559,16 @@ impl<'gc> Loader<'gc> { ); // FIXME - do we need to call 'set_place_frame' mc.preload(&mut activation.context); - mc.construct_frame(&mut activation.context); mc.post_instantiation( &mut activation.context, None, Instantiator::Movie, false, ); + catchup_display_object_to_frame( + &mut activation.context, + mc.into(), + ); if let Some(loader_info) = loader_info { // Store the real movie into the `LoaderStream`, so that