<!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('This tests that Drag drop fires textInput events.');

function toStringLiteral(str)
{
   return "'" + str + "'";
}

var willCancelTextInput = false;
var textInputCount = 0;
var expectedTextEventData = "";
var actualTextEventData = null;

function droppingTextInputHandler(evt)
{
    actualTextEventData = evt.data;
    textInputCount++;
    if (willCancelTextInput)
        evt.preventDefault();
}

var testSourceRoot = document.createElement("div");
document.body.appendChild(testSourceRoot);

var testTargetRoot = document.createElement("div");
testTargetRoot.innerHTML += "<input type='text' id='targetInput' value=''>";
testTargetRoot.innerHTML += "<div><span id='targetEditable' contentEditable></span></div>";
testTargetRoot.innerHTML += "<textarea id='targetTextarea' ></textarea>";
document.body.appendChild(testTargetRoot);

testTargetEditable = document.getElementById("targetEditable");
testTargetEditable.addEventListener("textInput", droppingTextInputHandler);
testTargetInput = document.getElementById("targetInput");
testTargetInput.addEventListener("textInput", droppingTextInputHandler);
testTargetTextarea = document.getElementById("targetTextarea");
testTargetTextarea.addEventListener("textInput", droppingTextInputHandler);

var selection = window.getSelection();

function clearTargets()
{
    testTargetEditable.innerHTML = "placeholder"; // give some text to have an area to drop
    testTargetInput.value = "";
    testTargetTextarea.value = "";
    actualTextEventData = null;
}

function dragFrom(element)
{
    var x = element.offsetLeft + element.offsetWidth / 2;
    var y = element.offsetTop + element.offsetHeight / 2;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseDown();

    // Makes drag happen
    var meaninglessDelta = 10; 
    eventSender.leapForward(500);
    eventSender.mouseMoveTo(x + meaninglessDelta , y + meaninglessDelta);
}

function dropTo(element)
{
    var x = element.offsetLeft + element.offsetWidth / 2;
    var y = element.offsetTop + element.offsetHeight / 2;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseUp();
}

function dragPlainText()
{
    testSourceRoot.innerHTML = "<input type='text' value='PlainHello' id='src' />";
    var input = document.getElementById("src");
    input.focus();
    selection.modify("extend", "forward", "line");
    dragFrom(input);
}

function dragRichText()
{
    testSourceRoot.innerHTML = "<div id='src' contentEditable><b>Rich</b>Hello</div>";
    var editable = document.getElementById("src");
    selection.setBaseAndExtent(editable, 0, editable, 0);
    selection.modify("extend", "forward", "line");
    dragFrom(editable);
}

function dropToTargetEditable()
{
    var editable = testTargetEditable;
    dropTo(editable);
}

function targetEditableShouldHave(value)
{
    shouldBeTrue("0 <= testTargetEditable.innerHTML.indexOf(" + toStringLiteral(value) + ")");
}

function targetEditableShouldStayAsIs()
{
    shouldBe("testTargetEditable.innerHTML", toStringLiteral("placeholder"));
}

function dropToTargetInput()
{
    var input = testTargetInput;
    dropTo(input);
}

function targetInputShouldHave(value)
{
    shouldBe("testTargetInput.value", toStringLiteral(value));
}

function dropToTargetTextarea()
{
    var textarea = testTargetTextarea;
    dropTo(textarea);
}

function targetTextareaShouldHave(value)
{
    shouldBe("testTargetTextarea.value", toStringLiteral(value));
}

var proceedingTestCases = [
    [dragPlainText, dropToTargetTextarea, targetTextareaShouldHave, "PlainHello", "PlainHello"],
    [dragPlainText, dropToTargetInput, targetInputShouldHave, "PlainHello", "PlainHello"],
    [dragPlainText, dropToTargetEditable, targetEditableShouldHave, "PlainHello", ""],
    [dragRichText, dropToTargetTextarea, targetTextareaShouldHave, "RichHello", "RichHello"],
    [dragRichText, dropToTargetInput, targetInputShouldHave, "RichHello", "RichHello"],
    [dragRichText, dropToTargetEditable, targetEditableShouldHave, "<b>Rich</b>Hello", ""],
];

var cancelingTestCases = [
    [dragPlainText, dropToTargetTextarea, targetTextareaShouldHave, "", "PlainHello"],
    [dragPlainText, dropToTargetInput, targetInputShouldHave, "", "PlainHello"],
    [dragPlainText, dropToTargetEditable, targetEditableShouldStayAsIs, "", ""],
    [dragRichText, dropToTargetTextarea, targetTextareaShouldHave, "", "RichHello"],
    [dragRichText, dropToTargetInput, targetInputShouldHave, "", "RichHello"],
    [dragRichText, dropToTargetEditable, targetEditableShouldStayAsIs, "", ""],
];

function runSingleTest(caseData)
{
    var drag = caseData[0];
    var drop = caseData[1];
    var verifyFunction = caseData[2];
    var verifyParameter = caseData[3];

    expectedTextEventData = caseData[4];

    clearTargets();
    drag();
    drop();
    shouldBe("actualTextEventData", toStringLiteral(expectedTextEventData));
    verifyFunction(verifyParameter);
}

eventSender.dragMode = false;

textInputCount = 0;
willCancelTextInput = false;
for (var i = 0; i < proceedingTestCases.length; ++i)
    runSingleTest(proceedingTestCases[i]);
shouldBe("textInputCount", "proceedingTestCases.length");

textInputCount = 0;
willCancelTextInput = true;
for (var i = 0; i < cancelingTestCases.length; ++i)
    runSingleTest(cancelingTestCases[i]);
shouldBe("textInputCount", "cancelingTestCases.length");

// Hides dataset to make dump clean.
testTargetRoot.style.display = "none";
testSourceRoot.style.display = "none";

var successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
