<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<head>
<script src="../../resources/js-test-pre.js"></script>
<style>
#dropTarget { text-align: center; display: table-cell; vertical-align: middle }
#dropTarget {width: 256px; height: 256px; border: 1px dashed}
</style>
<script>
var dropTarget;
var dropEffectElem;
var consoleElm;
var event;

window.onload = function()
{
    dropTarget = document.getElementById("dropTarget");
    dropEffectElem = document.getElementById("dropEffect");
    consoleElm = document.getElementById("console");
    
    if (!dropTarget || !dropEffectElem || !consoleElm)
        return;
    
    dropEffectElem.onclick = changeDropZone;
    changeDropZone();
    dropTarget.ondrop = drop;
    
    runTest();
}

function changeDropZone()
{
    dropTarget.setAttribute("webkitdropzone", dropEffectElem.options[dropEffectElem.selectedIndex].value + " file:text/html");
}

function printDropEvent(e)
{
    chosenDropEffect = dropEffectElem.options[dropEffectElem.selectedIndex].value;
    debug("Received drop event when chosenDropEffect is " + chosenDropEffect);
}

function runTest()
{
    if (!window.eventSender)
        return;
        
    if (window.testRunner)
        testRunner.dumpAsText();
        
    var endX = dropTarget.offsetLeft + 10;
    var endY = dropTarget.offsetTop + dropTarget.offsetHeight / 2
    
    var numEffects = dropEffectElem.options.length;
    
    for (var j = 0; j < numEffects; ++j) {
        dropEffectElem.options[j].selected = true;
        changeDropZone();
            
        eventSender.beginDragWithFiles(["resources/file-for-prevent-drag-to-navigate.html"]);
        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>
<script src="resources/dropzone.js"></script>
</head>
<body>
<p id="description"></p>
<div id="test-container">
<div id="dropTarget">Drop the file onto me.<br/><br/>
<label for="dropEffect">Expects dropEffect</label> <select id="dropEffect">
<option value="copy">Copy</option>
<option value="move">Move</option>
<option value="link">Link</option>
<option value="dummy">Nonexistent (Dummy) Effect should be converted to copy</option>
</select>
</div>
<hr/>
<hr/>
</div>
<div id="console"></div>
<script>
description("This test checks that drag-and-drop support works with files.<br/>");
</script>
</body>
</html>
