blob: fc40474744ba318f275c5089327bcc3ea6268ae2 [file] [log] [blame] [edit]
<!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>