blob: 3ce80c9f4210eac49dc020f0ed7f2ed0a0c0b479 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<style>
#drag {
border: 1px solid black;
height: 200px;
width: 200px;
}
#drop {
border: 1px solid black;
height: 200px;
width: 200px;
}
</style>
<script>
function assertEq(left, right)
{
if (left === right)
log('PASS: ' + left + " === " + right);
else
log('FAIL: ' + left + "(of type " + (typeof left) + ") !== " + right + "(of type " + (typeof right) + ")");
}
function log(str)
{
var result = document.getElementById('result');
result.appendChild(document.createTextNode(str));
result.appendChild(document.createElement('br'));
}
function legacyDragStart(dataTransfer)
{
dataTransfer.setData('text', 'sample');
dataTransfer.setData('url', 'http://www.google.com/');
dataTransfer.setData('text/html', '<em>Markup</em>');
dataTransfer.setData('custom-data', 'hello world');
}
function itemListDragStart(dataTransfer)
{
dataTransfer.items.add('sample', 'text/plain');
dataTransfer.items.add('http://www.google.com/', 'text/uri-list');
dataTransfer.items.add('<em>Markup</em>', 'text/html');
dataTransfer.items.add('hello world', 'custom-data');
}
function dragstart(event)
{
var dragMethod = document.getElementById('dragMethod');
if (dragMethod.selectedIndex == 0)
legacyDragStart(event.dataTransfer);
else if (dragMethod.selectedIndex == 1)
itemListDragStart(event.dataTransfer);
}
function dragenter(event)
{
event.preventDefault();
}
function dragover(event)
{
event.preventDefault();
}
function legacyDrop(dataTransfer)
{
assertEq(4, dataTransfer.types.length);
if (dataTransfer.types.indexOf('text/plain') < 0)
log('FAIL: types array did not contain "text"');
if (dataTransfer.types.indexOf('text/uri-list') < 0)
log('FAIL: types array did not contain "text/uri-list"');
if (dataTransfer.types.indexOf('text/html') < 0)
log('FAIL: types array did not contain "text/html"');
if (dataTransfer.types.indexOf('custom-data') < 0)
log('FAIL: types array did not contain "custom-data"');
assertEq('sample', dataTransfer.getData('text'));
assertEq('http://www.google.com/', dataTransfer.getData('url'));
assertEq('<em>Markup</em>', dataTransfer.getData('text/html'));
assertEq('hello world', dataTransfer.getData('custom-data'));
runNext();
}
var outstandingRequests;
function itemListDrop(dataTransfer)
{
outstandingRequests = 0;
assertEq(4, dataTransfer.items.length);
var types = [];
for (var i = 0; i < dataTransfer.items.length; ++i) {
types.push({kind: dataTransfer.items[i].kind, type: dataTransfer.items[i].type});
}
types.sort(function (a, b) { return a.type.localeCompare(b.type); });
var expectedTypes = [
{ kind: 'string', type: 'custom-data'},
{ kind: 'string', type: 'text/html'},
{ kind: 'string', type: 'text/plain'},
{ kind: 'string', type: 'text/uri-list'},
];
assertEq(JSON.stringify(expectedTypes), JSON.stringify(types));
var expectedResults = {
'custom-data': 'hello world',
'text/html': '<em>Markup</em>',
'text/plain': 'sample',
'text/uri-list': 'http://www.google.com/',
}
function makeClosure(expectedData)
{
++outstandingRequests;
return function (data) {
assertEq(expectedData, data);
if (--outstandingRequests == 0)
window.setTimeout(runNext, 0);
}
}
// We use this funky loop to make sure we always print out results in the same order.
for (var i = 0; i < types.length; ++i) {
for (var j = 0; j < dataTransfer.items.length; ++j) {
if (types[i].type == dataTransfer.items[j].type) {
dataTransfer.items[j].getAsString(makeClosure(expectedResults[types[i].type]));
break;
}
}
}
}
function drop(event)
{
var dropMethod = document.getElementById('dropMethod');
if (dropMethod.selectedIndex == 0)
legacyDrop(event.dataTransfer);
else if (dropMethod.selectedIndex == 1)
itemListDrop(event.dataTransfer);
event.preventDefault();
}
function runTest(dragMethodIndex, dropMethodIndex)
{
var dragMethod = document.getElementById('dragMethod');
var dropMethod = document.getElementById('dropMethod');
dragMethod.selectedIndex = dragMethodIndex;
dropMethod.selectedIndex = dropMethodIndex;
log('Running test with ' + dragMethod.value + ' drag handler and ' + dropMethod.value + ' drop handler');
var dragElement = document.getElementById('drag');
eventSender.mouseMoveTo(dragElement.offsetLeft + dragElement.offsetWidth / 2,
dragElement.offsetTop + dragElement.offsetHeight / 2);
eventSender.mouseDown();
eventSender.leapForward(100);
var dropElement = document.getElementById('drop');
eventSender.mouseMoveTo(dropElement.offsetLeft + dropElement.offsetWidth / 2,
dropElement.offsetTop + dropElement.offsetHeight / 2);
eventSender.mouseUp();
}
var testCases = [
[0, 0],
[0, 1],
[1, 0],
[1, 1],
];
function runNext()
{
if (!window.testRunner)
return;
var testCase = testCases.shift();
if (testCase)
runTest.apply(null, testCase);
else
testRunner.notifyDone();
}
window.onload = function()
{
if (!window.testRunner)
return;
testRunner.dumpAsText();
testRunner.waitUntilDone();
runNext();
}
</script>
</head>
<body>
<p>To manually test, drag 'Drag Me' to 'Drop Here' and drop. Several lines that say 'PASS' should appear below.
<div draggable="true" id="drag" ondragstart="dragstart(event)">Drag Me</div>
<div id="drop" ondragenter="dragenter(event)" ondragover="dragover(event)" ondrop="drop(event)">Drop Here</div>
</div>
<div>Drag handler: <select id="dragMethod"><option>Legacy</option><option>DataTransferItemList</option></select></div>
<div>Drop handler: <select id="dropMethod"><option>Legacy</option><option>DataTransferItemList</option></select></div>
<div id="result"></div>
</body>
</html>