<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description("Tests correct behavior of event.dataTransfer.setData/getData for 'URL', 'text/uri-list' and 'text/plain'");

// Important that we put these at the top of the doc so that logging does not cause it to go out of view (and be undragable)
var dragMe = document.createElement("div");
dragMe.innerHTML = "<span id='dragme'>Drag me</span>";
document.body.insertBefore(dragMe, document.body.firstChild);
var dragTarget = document.createElement("div");
dragTarget.innerHTML = "Drag here"
dragTarget.style.backgroundColor = "blue";
dragTarget.style.width = "100px";
dragTarget.style.height = "100px";
document.body.insertBefore(dragTarget, dragMe);

var setDataType;
var setDataValue;
var getDataType;
var getDataValue;
var getDataResult;
var getDataResultType;
var getDataLines;

dragMe.addEventListener("dragstart", function() {
    event.dataTransfer.setData(setDataType, setDataValue);
}, false);

dragTarget.addEventListener("dragenter", function() {
    event.dataTransfer.dropEffect = "copy";
    event.preventDefault();
}, false);

dragTarget.addEventListener("dragover", function() {
    event.dataTransfer.dropEffect = "copy";
    event.preventDefault();
}, false);

dragTarget.addEventListener("drop", function() {
    doDrop();
    event.preventDefault();
}, false);

function moveMouseToCenterOfElement(element)
{
    var centerX = element.offsetLeft + element.offsetWidth / 2;
    var centerY = element.offsetTop + element.offsetHeight / 2;
    eventSender.mouseMoveTo(centerX, centerY);
}

function dragOntoDragTarget() {
    var e = document.getElementById("dragme");
    window.getSelection().setBaseAndExtent(e, 0, e, 4); 
    x = e.offsetLeft + 10;
    y = e.offsetTop + e.offsetHeight / 2;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseDown();
    eventSender.leapForward(400);
    moveMouseToCenterOfElement(dragTarget);
    eventSender.mouseUp();
}

function doDrop() {
    getDataResult = event.dataTransfer.getData(getDataType);
    getDataResultType = typeof getDataResult;
    shouldBeEqualToString("getDataResultType", typeof getDataValue);
    shouldBeEqualToString("getDataResult", getDataValue);
}

function test(setType, setValues, getType, getValues) {
    setDataType = setType;
    setDataValue = setValues;
    getDataType = getType;
    getDataValue = getValues;
    dragOntoDragTarget();
}

function runTest()
{
    debug("--- Test set/get 'URL':");
    test("URL", "http://test.com", 
         "URL", "http://test.com");

    debug("--- Test set/get 'URL' with multiple URLs:");
    test("URL", "http://test.com\r\nhttp://check.com", 
         "URL", "http://test.com");

    debug("--- Test set/get 'text/uri-list':");
    test("text/uri-list", "http://test.com\r\nhttp://check.com", 
         "text/uri-list", "http://test.com\r\nhttp://check.com");

    debug("--- Test set/get 'text/uri-list' using '\\n':");
    test("text/uri-list", "http://test.com\nhttp://check.com", 
         "text/uri-list", "http://test.com\nhttp://check.com");

    debug("--- Test set 'text/uri-list', get 'URL':");
    test("text/uri-list", "http://test.com\r\nhttp://check.com", 
         "URL", "http://test.com");

    debug("--- Test set 'URL', get 'text/uri-list':");
    test("URL", "http://test.com\r\nhttp://check.com", 
         "text/uri-list", "http://test.com\r\nhttp://check.com");

    debug("--- Test set 'text/uri-list', get 'URL', using only '\\n':");
    test("text/uri-list", "http://test.com\nhttp://check.com",
         "URL", "http://test.com");

    debug("--- Test set/get 'text/uri-list' with comments:");
    test("text/uri-list", "# comment\r\nhttp://test.com\r\nhttp://check.com", 
         "text/uri-list", "# comment\r\nhttp://test.com\r\nhttp://check.com");

    debug("--- Test set 'text/uri-list', get 'URL' with comments:");
    test("text/uri-list", "# comment\r\nhttp://test.com\r\nhttp://check.com", 
         "URL", "http://test.com");

    debug("--- Test set 'text/uri-list', get 'URL' with only comments:");
    test("text/uri-list", "# comment\r\n# comment 2\r\n# comment 3", 
         "URL", "");

    debug("--- Test set/get 'text/plain':");
    test("text/plain", "Lorem ipsum dolor sit amet.", 
         "text/plain", "Lorem ipsum dolor sit amet.");

    debug("--- Test set 'text/plain', get 'text':");
    test("text/plain", "Lorem ipsum dolor sit amet.",
         "text", "Lorem ipsum dolor sit amet.");

    debug("--- Test set 'text', get 'text/plain':");
    test("text", "Lorem ipsum dolor sit amet.",
         "text/plain", "Lorem ipsum dolor sit amet.");

    debug("--- Test set/get 'text':");
    test("text", "Lorem ipsum dolor sit amet.",
         "text", "Lorem ipsum dolor sit amet.");
}

if (window.eventSender) {
    runTest();
    // Clean up after ourselves
    dragMe.parentNode.removeChild(dragMe);
    dragTarget.parentNode.removeChild(dragTarget);
} else {
    testFailed("This test is not interactive, please run using DumpRenderTree");
}

var successfullyParsed = true;

</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
