<!DOCTYPE HTML>
<script type="text/javascript" src="/resources/testharness.js"></script>
<script type="text/javascript" src="/resources/testharnessreport.js"></script>
<script type="text/javascript" src="/resources/testdriver.js"></script>
<script type="text/javascript" src="/resources/testdriver-vendor.js"></script>
<script type="text/javascript" src="/resources/testdriver-actions.js"></script>
<script type="text/javascript" src="../pointerevent_support.js"></script>
<style>
#obj {
width: 50px;
height: 50px;
padding: 50px;
background-color: lightblue;
border:1px solid black;
}
div {
display: block;
}
</style>
<h1>Verifies that mouse activities on an object fire pointerevents. It expected to get pointerup when the pointerdown happened on the object for compatibility with flash objects.</h1>
<p>
To test that when clicking inside the blue rectangle all compat mouse events are correct:
<ul>
<li> Click once in the blue rectangle
<li> Click the Done button
</ul>
</p>
<p>
To test that when dragging mouse outside all compat mouse events are correct:
<ul>
<li> Press left mouse button in the blue rectangle
<li> Drag the mouse cursor out of the blue rectangle
<li> Release the left mouse button
<li> Click the Done button
</ul>
</p>
<!-- draggable is set to false because there is a difference between auto draggable value in different browsers -->
<object id="obj" draggable="false"></object>
<button id="done">Done</button>
<div id="log"></div>
<script>
var target = document.getElementById("obj");
var done = document.getElementById("done");
var rect = target.getBoundingClientRect();
var done_clicked = 0;
var receivedEvents = [];
var previous_done_clicked = 0;
["mousedown", "mouseup", "mousemove", "pointerdown", "pointerup", "pointermove"].forEach(function(eventName) {
target.addEventListener(eventName, function(event) {
// This will clear receivedEvents once another test starts
if(previous_done_clicked !== done_clicked){
previous_done_clicked = done_clicked;
receivedEvents = [];
}
receivedEvents.push(event.type);
});
});
// Simple test to check that passive listeners can't prevent compatibility events.
target.addEventListener("pointerdown", function(event) {
event.preventDefault();
},
{ passive: true, once: true });
document.getElementById('done').addEventListener('click', (e) => done_clicked++);
// Need to prevent the default behaviour for firefox
target.addEventListener("dragstart", (e)=>e.preventDefault());
if(window.promise_test){
promise_test(async() => {
receivedEvents = [];
await new test_driver.Actions()
.pointerMove(Math.ceil(rect.left+5), Math.ceil(rect.top+5))
.pointerDown()
.pointerUp()
.send()
.then(() => clickInTarget("mouse", done));
await resolveWhen(() => done_clicked === 1);
assert_array_equals(receivedEvents.filter(isPointerEvent), ["pointermove", "pointerdown", "pointerup"],
"Click on object should result in the correct sequence of pointer events");
assert_array_equals(receivedEvents.filter(isMouseEvent), ["mousemove", "mousedown", "mouseup"],
"Click on object should result in the correct sequence of mouse events");
assert_true(arePointerEventsBeforeCompatMouseEvents(receivedEvents),
"Click on object should result in the correct sequence of events: " + receivedEvents);
}, "Normal click event sequence within object");
promise_test(async() => {
receivedEvents = [];
await new test_driver.Actions()
.pointerMove(Math.ceil(rect.left+5), Math.ceil(rect.top+5))
.pointerDown()
.pointerMove(Math.ceil(rect.left-5), Math.ceil(rect.top-5))
.pointerUp()
.send()
.then(() => clickInTarget("mouse", done));
await resolveWhen(() => done_clicked === 2);
assert_array_equals(receivedEvents.filter(isPointerEvent), ["pointermove", "pointerdown", "pointermove", "pointerup"],
"Drag from object should result in the correct sequence of pointer events");
assert_array_equals(receivedEvents.filter(isMouseEvent), ["mousemove", "mousedown", "mousemove", "mouseup"],
"Drag from object should result in the correct sequence of mouse events");
assert_true(arePointerEventsBeforeCompatMouseEvents(receivedEvents),
"Drag from object should result in the correct sequence of events: " + receivedEvents);
}, "Click and drag outside of object event sequence");
}
</script>