<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../editing.js" type="text/javascript"></script>
<script type="text/javascript">
if (window.testRunner) {  
    window.testRunner.waitUntilDone(); 
    testRunner.dumpAsText();
}

var handleDrop = function(e) {
    var console = document.getElementById('console');
    var pasteText = e.dataTransfer.getData("text/plain");
    // Check that the content we get is the same content we dragged.
    var expectedText = 'drag';
    if (pasteText == expectedText)
        console.innerHTML += "SUCCESS: Pasted text matched expected text";
    else
        console.innerHTML += "FAILURE: Expected: " +expectedText + "\nbut was: " + pasteText;
}

var handleDrag = function(e) {
    e.dataTransfer.dropEffect = "copy";
    // Cancel the drag, so we get the drop.
    e.preventDefault();
}
    
function runTest() {
    if (window.internals)
        internals.settings.setEditingBehavior('mac');
    var console = document.getElementById('console');
    var editDiv = document.getElementById('test');
    editDiv.addEventListener('drop', handleDrop, false);
    editDiv.addEventListener('dragover', handleDrag, false);
  
    // Select the text to drag.
    selection.setPosition(editDiv, 0);
    extendSelectionForwardByWordCommand(); 

    if (!window.testRunner)
        return;
    
    // Now, drag foo.
    var drag = document.getElementById('drag');
    var x = drag.offsetLeft + drag.offsetWidth / 2;
    var y = drag.offsetTop + drag.offsetHeight / 2;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseDown();
    eventSender.leapForward(400);

    // And drop it.
    var drop = document.getElementById("drop");
    x = drop.offsetLeft + drop.offsetWidth / 2;
    y = drop.offsetTop + drop.offsetHeight / 2;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseUp();
    window.testRunner.notifyDone();
}

</script>
<title>Test getData during drag and drop.</title>
</head>
<body onload='runTest();'>
<p>This tests that getData is supported for type text/plain during drop.  We select "drag", drag it, and then check that on drop getData returns "drag".  To run this test manually, just drag "drag" on to "drop".</p>
<div contentEditable id='test'><div><span id='drag'>drag</span></div><div><span id='drop'>drop</span></div></div>
<div id='console'></div>
</body>
</html>
