blob: baf0ca2fbe3d48491a55685ebd99313672d3da5e [file] [log] [blame]
<html>
<head>
<script src="../../resources/js-test.js"></script>
<style>
#dropTarget, #dragMe { text-align: center; display: table-cell; vertical-align: middle }
#dropTarget {width: 256px; height: 256px; border: 1px dashed}
#dragMe {-webkit-user-drag: element; -webkit-user-select: none; background: #ff0000; width: 64px; height: 64px; color: white}
</style>
<script>
var dragMe;
var dropTarget;
var effectAllowedElem;
var dropEffectElem;
var consoleElm;
var event;
window.onload = function()
{
dragMe = document.getElementById("dragMe");
dropTarget = document.getElementById("dropTarget");
effectAllowedElem = document.getElementById("effectAllowed");
dropEffectElem = document.getElementById("dropEffect");
consoleElm = document.getElementById("console");
if (!dragMe || !dropTarget || !effectAllowedElem || !dropEffectElem || !consoleElm)
return;
dragMe.ondragstart = dragStart;
dragMe.ondragend = dragEnd;
dropTarget.ondragenter = dragEntered;
dropTarget.ondragover = dragOver;
dropTarget.ondrop = drop;
runTest();
}
function dragStart(e)
{
event = e;
if (effectAllowedElem.options[effectAllowedElem.selectedIndex].value != "undefined")
e.dataTransfer.effectAllowed = effectAllowedElem.options[effectAllowedElem.selectedIndex].value;
e.dataTransfer.setData('Text', e.target.textContent);
}
function dragEnd(e)
{
checkDragState(e);
return;
}
function dragEntered(e)
{
dragEnteredAndUpdated(e);
}
function dragOver(e)
{
dragEnteredAndUpdated(e);
}
function dragEnteredAndUpdated(e)
{
event = e;
e.dataTransfer.dropEffect = dropEffectElem.options[dropEffectElem.selectedIndex].value;
cancelDrag(e);
}
function drop(e)
{
cancelDrag(e);
}
function cancelDrag(e)
{
if (e.preventDefault)
e.preventDefault();
else {
// Assume this script is executing within Internet Explorer
e.returnValue = false;
}
}
function checkDragState(e)
{
event = e;
var chosenDropEffect = dropEffectElem.options[dropEffectElem.selectedIndex].value;
var chosenEffectAllowed = effectAllowedElem.options[effectAllowedElem.selectedIndex].value;
var actualDropEffect = e.dataTransfer.dropEffect;
if (chosenEffectAllowed === "undefined") {
// If no effectAllowed is set, we should default to uninitialized. Make sure that's the case.
shouldBeEqualToString("event.dataTransfer.effectAllowed", "uninitialized");
// Then set the chosenEffectAllowed so isDropEffectAllowed matches the HTML5 spec, and
// doesn't need special cases for undefined.
chosenEffectAllowed = "uninitialized";
}
if (chosenEffectAllowed === "dummy") {
// If a bad effectAllowed is attempted to be set, it should never be set, and the
// effectAllowed should be uninitialized.
shouldBeEqualToString("event.dataTransfer.effectAllowed", "uninitialized");
// Then set the chosenEffectAllowed so isDropEffectAllowed matches the HTML5 spec, and
// doesn't need special cases for undefined.
chosenEffectAllowed = "uninitialized";
}
expected = dropEffectElem.options[dropEffectElem.selectedIndex].value;
if (chosenDropEffect == "dummy") {
switch (chosenEffectAllowed) {
case "undefined":
case "copyLink":
case "uninitialized":
case "all":
expected = "copy";
break;
case "copyMove":
case "move":
case "linkMove":
expected = "move";
break;
default:
expected = chosenEffectAllowed;
}
}
if (isDropEffectAllowed(chosenDropEffect, chosenEffectAllowed))
shouldBeEqualToString('event.dataTransfer.dropEffect', expected);
else
shouldBeEqualToString('event.dataTransfer.dropEffect', 'none');
}
function isDropEffectAllowed(chosenDropEffect, allowedDropEffect) {
// Extracted from the HTML 5 drag-and-drop section, http://dev.w3.org/html5/spec/Overview.html#dnd
if (chosenDropEffect == "none")
return true;
if (chosenDropEffect == "copy" && ["copy", "copyLink", "copyMove", "uninitialized", "all"].indexOf(allowedDropEffect) != -1)
return true;
if (chosenDropEffect == "move" && ["move", "copyMove", "linkMove", "uninitialized", "all"].indexOf(allowedDropEffect) != -1)
return true;
if (chosenDropEffect == "link" && ["link", "copyLink", "linkMove", "uninitialized", "all"].indexOf(allowedDropEffect) != -1)
return true;
if (chosenDropEffect == "dummy" && ["copy", "link", "move", "copyLink", "copyMove", "linkMove", "uninitialized", "all"].indexOf(allowedDropEffect) != -1)
return true;
return false;
}
function runTest()
{
if (!window.eventSender)
return;
if (window.testRunner)
testRunner.dumpAsText();
var startX = dragMe.offsetLeft + 10;
var startY = dragMe.offsetTop + dragMe.offsetHeight / 2;
var endX = dropTarget.offsetLeft + 10;
var endY = dropTarget.offsetTop + dropTarget.offsetHeight / 2;
var numEffectAllowed = effectAllowedElem.options.length;
var numEffects = dropEffectElem.options.length;
for (var i = 0; i < numEffectAllowed; ++i) {
effectAllowedElem.options[i].selected = true;
debug('<br />When effectAllowed == "' + effectAllowedElem.options[i].value + '"<br />');
for (var j = 0; j < numEffects; ++j) {
dropEffectElem.options[j].selected = true;
eventSender.mouseMoveTo(startX, startY);
eventSender.mouseDown();
eventSender.leapForward(100);
eventSender.mouseMoveTo(endX, endY);
eventSender.mouseUp();
}
}
var testContainer = document.getElementById("test-container");
if (testContainer)
document.body.removeChild(testContainer);
debug('<br /><span class="pass">TEST COMPLETE</span>');
}
</script>
</head>
<body>
<p id="description"></p>
<div id="test-container">
<label for="effectAllowed">effectAllowed</label> <select id="effectAllowed">
<option value="uninitialized">Uninitialized</option>
<option value="undefined">Undefined</option>
<option value="none">None</option>
<option value="all">All</option>
<option value="copy">Copy</option>
<option value="move">Move</option>
<option value="link">Link</option>
<option value="copyMove">CopyMove</option>
<option value="copyLink">CopyLink</option>
<option value="linkMove">LinkMove</option>
<option value="dummy">Nonexistent (Dummy) Effect</option>
</select>
<br/><br/>
<div id="dropTarget">Drop the red square onto me.<br/><br/>
<label for="dropEffect">Expects dropEffect</label> <select id="dropEffect">
<option value="none">None</option>
<option value="copy">Copy</option>
<option value="move">Move</option>
<option value="link">Link</option>
<option value="dummy">Nonexistent (Dummy) Effect</option>
</select>
</div>
<hr/>
<p>Items that can be dragged to the drop target:</p>
<div id="dragMe" draggable="true">Square</div>
<hr/>
</div>
<div id="console"></div>
<script>
description("This test checks that drag-and-drop support works and conforms to the HTML 5 specification.<br/>" +
"For each effectAllowed, iterates through the possible dropEffects: none, copy, move, link, dummy.");
</script>
</body>
</html>