<!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 Paste commands fires textInput events.');

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

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

function pastingTextInputHandler(evt)
{
    shouldBe("event.data", toStringLiteral(expectedTextEventData));
    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 id='targetEditable' contentEditable>";
testTargetRoot.innerHTML += "<textarea id='targetTextarea' ></textarea>";
document.body.appendChild(testTargetRoot);

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

var selection = window.getSelection();

function copyPlainText()
{
    testSourceRoot.innerHTML = "<input type='text' value='PlainHello' id='src' />";
    var input = document.getElementById("src");
    input.focus();

    selection.modify("extend", "forward", "line");
    document.execCommand("Copy");
}

function copyRichText()
{
    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");
    document.execCommand("Copy");
}

function pasteToTargetEditable()
{
    var editable = testTargetEditable;
    editable.innerHTML = "";
    selection.setBaseAndExtent(editable, 0, editable, 0);
    document.execCommand("Paste");

}

function targetEditableShouldHave(value)
{
    shouldBe("testTargetEditable.innerHTML", toStringLiteral(value));
}

function pasteToTargetInput()
{
    var input = testTargetInput;
    input.value = "";
    input.focus();
    document.execCommand("Paste");
}

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

function pasteToTargetTextarea()
{
    var textarea = testTargetTextarea;
    textarea.value = "";
    textarea.focus();
    document.execCommand("Paste");
}

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

var proceedingTestCases = [
    [copyPlainText, pasteToTargetTextarea, targetTextareaShouldHave, "PlainHello", "PlainHello"],
    [copyPlainText, pasteToTargetInput, targetInputShouldHave, "PlainHello", "PlainHello"],
    [copyPlainText, pasteToTargetEditable, targetEditableShouldHave, "PlainHello", ""],
    [copyRichText, pasteToTargetTextarea, targetTextareaShouldHave, "RichHello", "RichHello"],
    [copyRichText, pasteToTargetInput, targetInputShouldHave, "RichHello", "RichHello"],
    [copyRichText, pasteToTargetEditable, targetEditableShouldHave, "<b>Rich</b>Hello", ""],
];

var cancelingTestCases = [
    [copyPlainText, pasteToTargetTextarea, targetTextareaShouldHave, "", "PlainHello"],
    [copyPlainText, pasteToTargetInput, targetInputShouldHave, "", "PlainHello"],
    [copyPlainText, pasteToTargetEditable, targetEditableShouldHave, "", ""],
    [copyRichText, pasteToTargetTextarea, targetTextareaShouldHave, "", "RichHello"],
    [copyRichText, pasteToTargetInput, targetInputShouldHave, "", "RichHello"],
    [copyRichText, pasteToTargetEditable, targetEditableShouldHave, "", ""],
];

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

    expectedTextEventData = caseData[4];

    copy();
    paste();
    verifyFunction(verifyParameter);
}

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>
