diff --git a/core/src/display_object/loader_display.rs b/core/src/display_object/loader_display.rs index a16d15e7ffe9..280bb995429e 100644 --- a/core/src/display_object/loader_display.rs +++ b/core/src/display_object/loader_display.rs @@ -178,22 +178,21 @@ impl<'gc> TInteractiveObject<'gc> for LoaderDisplay<'gc> { options.set(HitTestOptions::SKIP_MASK, self.maskee().is_none()); if self.visible() { - // We have at most one child + // A loader has at most one child. if let Some(child) = self.iter_render_list().next() { if let Some(int) = child.as_interactive() { if int.as_displayobject().movie().is_action_script_3() { return int .mouse_pick_avm2(context, point, require_button_mode) .combine_with_parent(self.into()); - } else { - let avm1_result = int.mouse_pick_avm1(context, point, require_button_mode); - if let Some(result) = avm1_result { - return Avm2MousePick::Hit(result); - } else { - return Avm2MousePick::Miss; - } + } else if let Some(result) = + int.mouse_pick_avm1(context, point, require_button_mode) + { + return Avm2MousePick::Hit(result).combine_with_parent(self.into()); } - } else if child.hit_test_shape(context, point, options) { + } + + if child.hit_test_shape(context, point, options) { if self.mouse_enabled() { return Avm2MousePick::Hit(self.into()); } else { diff --git a/core/src/focus_tracker.rs b/core/src/focus_tracker.rs index ebaeec54a20c..02b5888bbedb 100644 --- a/core/src/focus_tracker.rs +++ b/core/src/focus_tracker.rs @@ -262,10 +262,6 @@ impl<'gc> FocusTracker<'gc> { .or_else(|| { // The current focus as the stage is only used // if the interactive object is AVM2. - // - // TODO: Clicking a non-interactive AVM1 object should - // fire the focus event with the related object - // as the root LoaderDisplay. if related_object .is_none_or(|ro| ro.as_displayobject().movie().is_action_script_3()) { diff --git a/tests/tests/swfs/avm2/mouse_pick_loader_avm1/Test.as b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/Test.as new file mode 100644 index 000000000000..87bd2d24bff2 --- /dev/null +++ b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/Test.as @@ -0,0 +1,50 @@ +package { + + import flash.display.MovieClip; + import flash.display.Loader; + import flash.events.Event; + import flash.events.FocusEvent; + import flash.net.URLRequest; + import flash.display.Sprite; + import flash.events.KeyboardEvent; + import flash.ui.Keyboard; + + public class Test extends MovieClip { + + var avm1Loader:Loader = new Loader(); + + var avm1Container:Sprite = new Sprite(); + + public function Test() { + super(); + + avm1Container.name = "avm1Container"; + addChild(avm1Container); + + avm1Loader.contentLoaderInfo.addEventListener("complete", onAVM1Loaded); + avm1Loader.load(new URLRequest("avm1.swf")); + + stage.addEventListener("click", function(e) { + trace("Clicked on:", e.target, "(" + e.target.name + ")"); + }); + + stage.addEventListener("keyDown", onKeyPress); + } + + public function onKeyPress(e:KeyboardEvent) { + if (e.keyCode == Keyboard.SHIFT) { + avm1Container.mouseEnabled = !avm1Container.mouseEnabled; + trace("avm1Container.mouseEnabled is now", avm1Container.mouseEnabled); + } else if (e.keyCode == Keyboard.SPACE) { + avm1Container.mouseChildren = !avm1Container.mouseChildren; + trace("avm1Container.mouseChildren is now", avm1Container.mouseChildren); + } + } + + public function onAVM1Loaded(e:Event):void { + avm1Container.addChild(avm1Loader); + } + + } + +} diff --git a/tests/tests/swfs/avm2/mouse_pick_loader_avm1/avm1.fla b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/avm1.fla new file mode 100644 index 000000000000..37d3f58ed752 Binary files /dev/null and b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/avm1.fla differ diff --git a/tests/tests/swfs/avm2/mouse_pick_loader_avm1/avm1.swf b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/avm1.swf new file mode 100644 index 000000000000..9798c181d57a Binary files /dev/null and b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/avm1.swf differ diff --git a/tests/tests/swfs/avm2/mouse_pick_loader_avm1/input.json b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/input.json new file mode 100644 index 000000000000..527550f01f89 --- /dev/null +++ b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/input.json @@ -0,0 +1,51 @@ +[ + { "type": "Wait" }, + { "type": "Wait" }, + + { "type": "MouseDown", "pos": [90, 190], "btn": "Left" }, { "type": "MouseUp", "pos": [90, 190], "btn": "Left" }, + { "type": "MouseDown", "pos": [155, 175], "btn": "Left" }, { "type": "MouseUp", "pos": [155, 175], "btn": "Left" }, + { "type": "MouseDown", "pos": [160, 140], "btn": "Left" }, { "type": "MouseUp", "pos": [160, 140], "btn": "Left" }, + { "type": "MouseDown", "pos": [140, 230], "btn": "Left" }, { "type": "MouseUp", "pos": [140, 230], "btn": "Left" }, + { "type": "MouseDown", "pos": [290, 90], "btn": "Left" }, { "type": "MouseUp", "pos": [290, 90], "btn": "Left" }, + { "type": "MouseDown", "pos": [350, 125], "btn": "Left" }, { "type": "MouseUp", "pos": [350, 125], "btn": "Left" }, + { "type": "MouseDown", "pos": [275, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 200], "btn": "Left" }, + { "type": "MouseDown", "pos": [275, 240], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 240], "btn": "Left" }, + { "type": "MouseDown", "pos": [130, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [130, 200], "btn": "Left" }, + + { "type": "KeyDown", "key": "Space" }, + + { "type": "MouseDown", "pos": [90, 190], "btn": "Left" }, { "type": "MouseUp", "pos": [90, 190], "btn": "Left" }, + { "type": "MouseDown", "pos": [155, 175], "btn": "Left" }, { "type": "MouseUp", "pos": [155, 175], "btn": "Left" }, + { "type": "MouseDown", "pos": [160, 140], "btn": "Left" }, { "type": "MouseUp", "pos": [160, 140], "btn": "Left" }, + { "type": "MouseDown", "pos": [140, 230], "btn": "Left" }, { "type": "MouseUp", "pos": [140, 230], "btn": "Left" }, + { "type": "MouseDown", "pos": [290, 90], "btn": "Left" }, { "type": "MouseUp", "pos": [290, 90], "btn": "Left" }, + { "type": "MouseDown", "pos": [350, 125], "btn": "Left" }, { "type": "MouseUp", "pos": [350, 125], "btn": "Left" }, + { "type": "MouseDown", "pos": [275, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 200], "btn": "Left" }, + { "type": "MouseDown", "pos": [275, 240], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 240], "btn": "Left" }, + { "type": "MouseDown", "pos": [130, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [130, 200], "btn": "Left" }, + + { "type": "KeyDown", "key": "Space" }, + { "type": "KeyDown", "key": "LeftShift" }, + + { "type": "MouseDown", "pos": [90, 190], "btn": "Left" }, { "type": "MouseUp", "pos": [90, 190], "btn": "Left" }, + { "type": "MouseDown", "pos": [155, 175], "btn": "Left" }, { "type": "MouseUp", "pos": [155, 175], "btn": "Left" }, + { "type": "MouseDown", "pos": [160, 140], "btn": "Left" }, { "type": "MouseUp", "pos": [160, 140], "btn": "Left" }, + { "type": "MouseDown", "pos": [140, 230], "btn": "Left" }, { "type": "MouseUp", "pos": [140, 230], "btn": "Left" }, + { "type": "MouseDown", "pos": [290, 90], "btn": "Left" }, { "type": "MouseUp", "pos": [290, 90], "btn": "Left" }, + { "type": "MouseDown", "pos": [350, 125], "btn": "Left" }, { "type": "MouseUp", "pos": [350, 125], "btn": "Left" }, + { "type": "MouseDown", "pos": [275, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 200], "btn": "Left" }, + { "type": "MouseDown", "pos": [275, 240], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 240], "btn": "Left" }, + { "type": "MouseDown", "pos": [130, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [130, 200], "btn": "Left" }, + + { "type": "KeyDown", "key": "Space" }, + + { "type": "MouseDown", "pos": [90, 190], "btn": "Left" }, { "type": "MouseUp", "pos": [90, 190], "btn": "Left" }, + { "type": "MouseDown", "pos": [155, 175], "btn": "Left" }, { "type": "MouseUp", "pos": [155, 175], "btn": "Left" }, + { "type": "MouseDown", "pos": [160, 140], "btn": "Left" }, { "type": "MouseUp", "pos": [160, 140], "btn": "Left" }, + { "type": "MouseDown", "pos": [140, 230], "btn": "Left" }, { "type": "MouseUp", "pos": [140, 230], "btn": "Left" }, + { "type": "MouseDown", "pos": [290, 90], "btn": "Left" }, { "type": "MouseUp", "pos": [290, 90], "btn": "Left" }, + { "type": "MouseDown", "pos": [350, 125], "btn": "Left" }, { "type": "MouseUp", "pos": [350, 125], "btn": "Left" }, + { "type": "MouseDown", "pos": [275, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 200], "btn": "Left" }, + { "type": "MouseDown", "pos": [275, 240], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 240], "btn": "Left" }, + { "type": "MouseDown", "pos": [130, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [130, 200], "btn": "Left" } +] diff --git a/tests/tests/swfs/avm2/mouse_pick_loader_avm1/output.txt b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/output.txt new file mode 100644 index 000000000000..99e305288651 --- /dev/null +++ b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/output.txt @@ -0,0 +1,42 @@ +Clicked on: [object Loader] (instance2) +Clicked on: [object Loader] (instance2) +Clicked on: [object Loader] (instance2) +input_txt.onSetFocus +input_txt.onKillFocus +Clicked on: [object MovieClip] (rect_mc) +Clicked on: [object Stage] (null) +avm1 button clicked +avm1 button clicked +Clicked on: [object Loader] (instance2) +avm1Container.mouseChildren is now false +Clicked on: [object Sprite] (avm1Container) +Clicked on: [object Sprite] (avm1Container) +Clicked on: [object Sprite] (avm1Container) +Clicked on: [object Sprite] (avm1Container) +Clicked on: [object MovieClip] (rect_mc) +Clicked on: [object Stage] (null) +Clicked on: [object Sprite] (avm1Container) +Clicked on: [object Sprite] (avm1Container) +Clicked on: [object Sprite] (avm1Container) +avm1Container.mouseChildren is now true +avm1Container.mouseEnabled is now false +Clicked on: [object Loader] (instance2) +Clicked on: [object Loader] (instance2) +Clicked on: [object Loader] (instance2) +input_txt.onSetFocus +input_txt.onKillFocus +Clicked on: [object MovieClip] (rect_mc) +Clicked on: [object Stage] (null) +avm1 button clicked +avm1 button clicked +Clicked on: [object Loader] (instance2) +avm1Container.mouseChildren is now false +Clicked on: [object Stage] (null) +Clicked on: [object MovieClip] (rect_mc) +Clicked on: [object MovieClip] (rect_mc) +Clicked on: [object MovieClip] (rect_mc) +Clicked on: [object MovieClip] (rect_mc) +Clicked on: [object Stage] (null) +Clicked on: [object MovieClip] (rect_mc) +Clicked on: [object MovieClip] (rect_mc) +Clicked on: [object MovieClip] (rect_mc) diff --git a/tests/tests/swfs/avm2/mouse_pick_loader_avm1/test.fla b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/test.fla new file mode 100644 index 000000000000..1d6b749c786e Binary files /dev/null and b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/test.fla differ diff --git a/tests/tests/swfs/avm2/mouse_pick_loader_avm1/test.swf b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/test.swf new file mode 100644 index 000000000000..8d8f77f53d4f Binary files /dev/null and b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/test.swf differ diff --git a/tests/tests/swfs/avm2/mouse_pick_loader_avm1/test.toml b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/test.toml new file mode 100644 index 000000000000..99142b5c1359 --- /dev/null +++ b/tests/tests/swfs/avm2/mouse_pick_loader_avm1/test.toml @@ -0,0 +1 @@ +num_ticks = 3