<p>This tests the ability to drag a file onto &lt;input type="file"&gt;</p>
<p>To test manually you need to attempt to drag a file onto the file input below</p>
<input id="target" type="file"/><br />
<input id="dragStart" type="text" value="This input field is only present to allow DRT to initiate a drag"></input><br />
<pre id="console"></pre>


<script>
    function debug(str) {
        var c = document.getElementById('console')
        c.appendChild(document.createTextNode(str + '\n'));
    }

    function runTest() {
        var dragStart = document.getElementById("dragStart");
        var x = dragStart.offsetLeft + dragStart.offsetWidth / 2;
        var y = dragStart.offsetTop + dragStart.offsetHeight / 2;

        var target = document.getElementById("target");
        var tx = target.offsetLeft + target.offsetWidth / 2;
        var ty = target.offsetTop + target.offsetHeight / 2;
        
        dragStart.select();

        var initialValue = target.value;
        
        eventSender.mouseMoveTo(x, y);
        eventSender.mouseDown();
        eventSender.leapForward(400);
        eventSender.mouseMoveTo(tx, ty);
        eventSender.mouseUp();       
         
        var finalValue = target.value;
        if (initialValue == finalValue || finalValue != "DRTFakeFile")
            debug("FAIL: Could not drop file on to file input");
        else
            debug("PASS: Successfully dropped file on to file input");
            
        debug("PASS: Finished test");
    }

    if (window.layoutTestController) {
        layoutTestController.addFileToPasteboardOnDrag();
        layoutTestController.dumpAsText();
        runTest();
    }
    
    // remove drag source
    var dragStart = document.getElementById("dragStart");
    dragStart.parentNode.removeChild(dragStart);
    
</script>