blob: 2c83483c7b4dca341cba978fac1c5ac5abb2b9b4 [file] [log] [blame]
<html>
<head>
<title>Test for WebKit bug 15106: Dragging text inside an element with "user-drag: element" and "user-select: none" should initiate a drag</title>
<style type="text/css">
.test {
background-color: #ccc;
border: 1px solid #333;
width: 200px;
text-align: center;
margin: 10px;
}
.result {
float: right;
}
body > div {
clear: both;
padding-top: 15px;
}
#draggable {
-webkit-user-drag: element;
}
#unselectable {
-webkit-user-select: none;
}
#draggable-unselectable {
-webkit-user-drag: element;
-webkit-user-select: none;
}
.fail {
color: red;
}
.success {
color: green;
}
</style>
<script type="text/javascript">
function shouldBe(resultElement, expected, actual) {
var msg = document.createElement('p');
if (expected == actual) {
msg.innerHTML = "<span class='success'>SUCCESS</span> Expected '" + expected + "' and got it.";
} else {
msg.innerHTML = "<span class='fail'>FAIL</span> Expected '" + expected + "' but got '" + actual + "'.";
}
resultElement.appendChild(msg);
}
function compareResults(id, expectedResult, actualResult) {
var resultElement = document.getElementById(id + '-result');
shouldBe(resultElement, expectedResult.length, actualResult.length);
for (var i = 0; i < expectedResult.length; i++) {
shouldBe(resultElement, expectedResult[i], actualResult[i]);
}
}
function registerEventListenersWithResults(resultArray) {
document.ondragstart = function() {
resultArray.push('dragstart');
}
document.onmousedown = function(event) {
resultArray.push('mousedown');
}
document.onmouseup = function(event) {
resultArray.push('mouseup');
resultArray.push(window.getSelection().toString() == '' ? 'No selection' : 'Selection');
}
}
function dragFromTopOfElement(element, dragOffset) {
var startX = element.offsetLeft + element.offsetWidth / 2;
var startY = element.offsetTop + 1.0;
eventSender.mouseMoveTo(startX, startY);
eventSender.mouseDown();
eventSender.mouseMoveTo(startX, startY);
var endX = startX + dragOffset.x;
var endY = startY + dragOffset.y;
eventSender.mouseMoveTo(endX, endY);
eventSender.mouseUp()
}
function runTest() {
if (!window.eventSender)
return;
if (window.testRunner)
testRunner.dumpAsText();
var draggableResults = [];
registerEventListenersWithResults(draggableResults);
var draggable = document.getElementById('draggable');
dragFromTopOfElement(draggable, {x: 0, y: draggable.offsetHeight / 2});
compareResults("draggable", ["mousedown", "mouseup", "Selection"], draggableResults);
var unselectableResults = [];
registerEventListenersWithResults(unselectableResults);
var unselectable = document.getElementById('unselectable');
dragFromTopOfElement(unselectable, {x: 0, y: unselectable.offsetHeight / 2});
compareResults("unselectable", ["mousedown", "mouseup", "No selection"], unselectableResults);
var draggableUnselectableResults = [];
registerEventListenersWithResults(draggableUnselectableResults);
var draggableUnselectable = document.getElementById('draggable-unselectable');
dragFromTopOfElement(draggableUnselectable, {x: 0, y: draggableUnselectable.offsetHeight / 2});
// <https://bugs.webkit.org/show_bug.cgi?id=26758>: eventSender.mouseUp during a drag can dispatch a duplicate mouseup event on Mac OS X
if (draggableUnselectableResults.length == 6 && draggableUnselectableResults[4] == "mouseup" && draggableUnselectableResults[5] == "No selection")
draggableUnselectableResults = draggableUnselectableResults.slice(0, 4);
compareResults("draggable-unselectable", ["mousedown", "dragstart", "mouseup", "No selection"], draggableUnselectableResults);
}
</script>
</head>
<body onload="runTest()">
<h3>Test for <a href='https://bugs.webkit.org/show_bug.cgi?id=15106'>WebKit bug 15106</a>: Dragging text inside an element with "user-drag: element" and "user-select: none" should initiate a drag</h3>
<div>
<div id="draggable-result" class="result"></div>
<div id="draggable" class="test">
This element should be draggable, but initiating a drag from within the text should begin a selection.
</div>
</div>
<div>
<div id="unselectable-result" class="result"></div>
<div id="unselectable" class="test">
This element should not be draggable, and initiating a drag from within the text should not begin a selection.
</div>
</div>
<div>
<div id="draggable-unselectable-result" class="result"></div>
<div id="draggable-unselectable" class="test">
This element should be draggable, and initiating a drag from within the text should drag the element.
</div>
</div>
</body>
</html>