diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 9d72dc843309..cfc09b01bb9f 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -3128,32 +3128,34 @@ impl<'gc> TInteractiveObject<'gc> for MovieClip<'gc> { continue; } - let mut res = if let Some(child) = child.as_interactive() { + let mut res = None; + + if let Some(child) = child.as_interactive() { if child.as_displayobject().movie().is_action_script_3() { - child.mouse_pick_avm2(context, point, require_button_mode) - } else { - let avm1_result = - child.mouse_pick_avm1(context, point, require_button_mode); - if let Some(result) = avm1_result { - Avm2MousePick::Hit(result) + res = Some(child.mouse_pick_avm2(context, point, require_button_mode)); + } else if let Some(result) = + child.mouse_pick_avm1(context, point, require_button_mode) + { + res = Some(Avm2MousePick::Hit(result)); + } + } + + let mut res = res.unwrap_or_else(|| { + if child.hit_test_shape(context, point, options) + && child + .masker() + .map(|mask| mask.hit_test_shape(context, point, options)) + .unwrap_or(true) + { + if self.mouse_enabled() { + Avm2MousePick::Hit(this) } else { - Avm2MousePick::Miss + Avm2MousePick::PropagateToParent } - } - } else if child.hit_test_shape(context, point, options) - && child - .masker() - .map(|mask| mask.hit_test_shape(context, point, options)) - .unwrap_or(true) - { - if self.mouse_enabled() { - Avm2MousePick::Hit(this) } else { - Avm2MousePick::PropagateToParent + Avm2MousePick::Miss } - } else { - Avm2MousePick::Miss - }; + }); while let Some((clip, clip_range)) = clip_layers.peek() { // This clip layer no longer applies to the remaining children (which all have lower depth values). diff --git a/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/Test.as b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/Test.as new file mode 100644 index 000000000000..6a179559d0fc --- /dev/null +++ b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/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.content); + } + + } + +} diff --git a/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/avm1.fla b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/avm1.fla new file mode 100644 index 000000000000..37d3f58ed752 Binary files /dev/null and b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/avm1.fla differ diff --git a/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/avm1.swf b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/avm1.swf new file mode 100644 index 000000000000..165f60385e55 Binary files /dev/null and b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/avm1.swf differ diff --git a/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/input.json b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/input.json new file mode 100644 index 000000000000..527550f01f89 --- /dev/null +++ b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/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_mixed_avm_swf9/output.txt b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/output.txt new file mode 100644 index 000000000000..d02c29a89a60 --- /dev/null +++ b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/output.txt @@ -0,0 +1,42 @@ +Clicked on: [object Sprite] (avm1Container) +Clicked on: [object Sprite] (avm1Container) +Clicked on: [object Sprite] (avm1Container) +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 Sprite] (avm1Container) +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 Stage] (null) +Clicked on: [object MovieClip] (rect_mc) +Clicked on: [object MovieClip] (rect_mc) +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 MovieClip] (rect_mc) +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_mixed_avm_swf9/test.fla b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/test.fla new file mode 100644 index 000000000000..1d6b749c786e Binary files /dev/null and b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/test.fla differ diff --git a/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/test.swf b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/test.swf new file mode 100644 index 000000000000..82a37d02af52 Binary files /dev/null and b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/test.swf differ diff --git a/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/test.toml b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/test.toml new file mode 100644 index 000000000000..99142b5c1359 --- /dev/null +++ b/tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/test.toml @@ -0,0 +1 @@ +num_ticks = 3