1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
<!doctype html>
<html>
<head>
<title>Draggable select</title>
<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>
<style type="text/css">
#inner { border: 1px solid orange; border-top-width: 20px; }
</style>
<script type="text/javascript">
window.onload = function () {
document.getElementsByTagName('select')[0].ondragstart = function (e) {
e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
};
};
</script>
</head>
<body>
<p>Press your mouse button down on the orange block and drag downwards. It should open and select items in the dropdown, and should <strong>not</strong> drag the block or text.</p>
<div id="element">
<select draggable="true" id="inner">
<option>Option 1</option>
<option>Option 2</option>
<option>Option 3</option>
</select>
</div>
<script>
const element = document.getElementById("element");
const inner = document.getElementById("inner");
promise_test(t => {
return new Promise((resolve, reject) => {
let didReceiveDragStart = false;
const dragStartListener = ev => {
ev.preventDefault();
didReceiveDragStart = true;
};
element.addEventListener("dragstart", dragStartListener, { once: true });
t.add_cleanup(() => {
element.removeEventListener("dragstart", dragStartListener);
// Click on center to dismiss the dropdown.
new test_driver.Actions()
.pointerMove(0, 0, { origin: document.body })
.pointerDown()
.pointerUp()
.send();
});
element.addEventListener("mouseup", () => {
resolve(didReceiveDragStart);
}, { once: true });
const centerH = inner.getBoundingClientRect().height / 2;
new test_driver.Actions()
// Move pointer to the center of the top-border.
.pointerMove(0, 10 - centerH, { origin: inner })
.pointerDown()
// Move pointer to the center of the select.
.pointerMove(0, 0, { origin: inner })
.pointerUp()
.send();
}).then(didReceiveDragStart => {
assert_false(didReceiveDragStart, "dragstart should not fire");
});
}, "Draggable select should not be draggable from border");
promise_test(t => {
return new Promise((resolve, reject) => {
let didReceiveDragStart = false;
const dragStartListener = ev => {
ev.preventDefault();
didReceiveDragStart = true;
};
element.addEventListener("dragstart", dragStartListener, { once: true });
t.add_cleanup(() => {
element.removeEventListener("dragstart", dragStartListener);
// Click on center to dismiss the dropdown.
new test_driver.Actions()
.pointerMove(0, 0, { origin: document.body })
.pointerDown()
.pointerUp()
.send();
});
element.addEventListener("mouseup", () => {
resolve(didReceiveDragStart);
}, { once: true });
const centerH = inner.getBoundingClientRect().height / 2;
new test_driver.Actions()
// Move pointer to the center of the select body.
.pointerMove(0, 10, { origin: inner })
.pointerDown()
// Move pointer out of the select.
.pointerMove(0, centerH, { origin: inner })
.pointerUp()
.send();
}).then(didReceiveDragStart => {
assert_false(didReceiveDragStart, "dragstart should not fire");
});
}, "Draggable select should not be draggable from select body");
</script>
</body>
</html>
|