| <!DOCTYPE html> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/resources/testdriver.js"></script> |
| <script src="/resources/testdriver-vendor.js"></script> |
| <script src="/resources/testdriver-actions.js"></script> |
| <script src="resources/utils.js"></script> |
| <body> |
| <div> |
| Dragging the mouse from a child frame to the parent frame causes |
| <code>mousedown</code>, <code>mousemove</code> and <code>mouseup</code> |
| events being dispatched to the child frame, regardless of whether the |
| <code>mousedown</code> event is canceled or not. |
| </div> |
| <iframe id="child_frame" width="300px" height="40px" |
| src="resources/mouse-event-reporter-subframe.html"> |
| </iframe> |
| </body> |
| <script> |
| "use strict" |
| let topframe_loaded = getEvent("load", window); |
| let subframe_loaded = getMessageData("load", frames[0]); |
| |
| let topframe_mousedown; |
| let topframe_mousemove; |
| let topframe_mouseup; |
| |
| let subframe_mousedown; |
| let subframe_mousemove_drag; |
| let subframe_mouseup; |
| |
| let mouse_is_dragging; |
| |
| promise_setup(async () => { |
| await topframe_loaded; |
| await subframe_loaded; |
| |
| window.addEventListener("mousedown", e => topframe_mousedown = true); |
| window.addEventListener("mousemove", e => topframe_mousemove = true); |
| window.addEventListener("mouseup", e => topframe_mouseup = true); |
| |
| window.addEventListener("message", e => { |
| if (e.source != frames[0] || !e.data || !e.data.type) |
| return; |
| |
| if (e.data.type === "mousedown") { |
| subframe_mousedown = true; |
| mouse_is_dragging = true; |
| } else if (e.data.type === "mousemove") { |
| if (mouse_is_dragging) |
| subframe_mousemove_drag = true; |
| } else if (e.data.type === "mouseup") { |
| subframe_mouseup = true; |
| mouse_is_dragging = false; |
| } |
| }); |
| }); |
| |
| function add_promise_test(cancel_mousedown) { |
| let test_label = "Child frame receives events when mousedown is " + |
| (cancel_mousedown ? "canceled" : "not canceled"); |
| |
| promise_test(async t => { |
| topframe_mousedown = false; |
| topframe_mousemove = false; |
| topframe_mouseup = false; |
| |
| subframe_mousedown = false; |
| subframe_mousemove_drag = false; |
| subframe_mouseup = false; |
| |
| mouse_is_dragging = false; |
| |
| sendMessage(frames[0], "cancel-mousedown", cancel_mousedown); |
| const mouseup_promise = getMessageData("mouseup", frames[0]); |
| |
| const child_frame = document.getElementById("child_frame"); |
| const actions_promise = new test_driver.Actions() |
| .pointerMove(5, 5, {origin: child_frame}) |
| .pointerDown() |
| .pointerMove(5, 5, {origin: document.body}) |
| .pointerUp() |
| .send(); |
| |
| await actions_promise; |
| await mouseup_promise; |
| |
| assert_false(topframe_mousedown, "Top frame received mousedown?"); |
| assert_false(topframe_mousemove, "Top frame received mousemove?"); |
| assert_false(topframe_mouseup, "Top frame received mouseup?"); |
| |
| assert_true(subframe_mousedown, "Child frame received mousedown?"); |
| assert_true(subframe_mousemove_drag, "Child frame received mousemove?"); |
| assert_true(subframe_mouseup, "Child frame received mouseup?"); |
| }, test_label); |
| } |
| |
| add_promise_test(false); |
| add_promise_test(true); |
| </script> |