<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test-pre.js"></script>
<script>

description('This tests copying HTML markup using dataTransfer.items. To manually test, click on "Copy text" and paste (Command+V on Mac Control+V elsewhere).');

function copyText()
{
    document.getElementById('source').focus();
    document.execCommand('SelectAll', false, null);
    document.execCommand('Copy', false, null);
}

function copy(event)
{
    clipboardData = event.clipboardData;
    shouldBe('clipboardData.items.length', '0');
    shouldBe('clipboardData.setData("text/html", "rock"); clipboardData.items.length', '1');
    shouldBeEqualToString('initialItem = clipboardData.items[0]; initialItem.kind', 'string');
    shouldBeEqualToString('initialItem.type', 'text/html');
    shouldBe('initialItem.getAsFile()', 'null');
    shouldBe('initialItem.getAsString(checkContent(1, "rock"))', 'undefined');

    shouldThrowErrorName('clipboardData.items.add("paper", "text/HTML")', 'NotSupportedError');
    shouldBe('clipboardData.items[0]', 'initialItem');
    shouldBe('clipboardData.clearData(); clipboardData.items.length', '0');

    const markup = `<!DOCTYPE html><!-- hello --><script>alert('Test failed');</scr` + `ipt>`;
    shouldBe(`clipboardData.items.add("${markup}", "TEXT/html"); clipboardData.items.length`, '1');
    shouldNotBe('clipboardData.items[0]', 'initialItem');
    shouldBeEqualToString('initialItem.kind', 'string');
    shouldBeEqualToString('initialItem.type', '');
    shouldBe('initialItem.getAsFile()', 'null');
    shouldBe('initialItem.getAsString(() => testFailed("getAsString should exit immeidately if item is disabled 1"))', 'undefined');

    shouldBeEqualToString('clipboardData.getData("text/html")', markup);
    shouldBeEqualToString('clipboardData.getData("text/plain")', '');
    shouldBeEqualToString('firstItem = clipboardData.items[0]; clipboardData.items[0].kind', 'string');
    shouldBeEqualToString('firstItem.type', 'text/html');
    shouldBe('firstItem.getAsFile()', 'null');
    shouldBe(`firstItem.getAsString(checkContent(2, "${markup}"))`, 'undefined');

    shouldBe('secondItem = clipboardData.items.add("some content", "text/plain"); secondItem', 'clipboardData.items[1]');
    shouldBeEqualToString('clipboardData.getData("text/plain")', 'some content');
    shouldBeEqualToString('secondItem.kind', 'string');
    shouldBeEqualToString('secondItem.type', 'text/plain');
    shouldBe('secondItem.getAsFile()', 'null');
    shouldBe('secondItem.getAsString(checkContent(3, "some content"))', 'undefined');

    shouldBe('clipboardData.items[0]', 'firstItem');
    shouldBeEqualToString('firstItem.kind', 'string');
    shouldBeEqualToString('firstItem.type', 'text/html');
    shouldBeEqualToString('clipboardData.getData("text/html")', markup);
    shouldBe(`firstItem.getAsString(checkContent(4, "${markup}"))`, 'undefined');

    shouldBe('clipboardData.items.remove(0); clipboardData.items.length', '1');
    shouldBe('clipboardData.items[0]', 'secondItem');
    shouldBe('firstItem.kind', 'string');
    shouldBe('firstItem.type', 'text/html');
    shouldBe('firstItem.getAsFile()', 'null');
    shouldBe('firstItem.getAsString(() => testFailed("getAsString should exit immeidately if item is disabled 2"))', 'undefined');
    shouldBe('secondItem.kind', 'string');
    shouldBe('secondItem.type', 'text/plain');
    shouldBe('secondItem.getAsFile()', 'null');
    shouldBe('secondItem.getAsString(checkContent(4, "some content"))', 'undefined');

}

let count = 0;
function checkContent(number, expectedContent)
{
    count++;
    return (content) => {
        const variableName = 'actualContent' + number;
        window[variableName] = content;
        shouldBeEqualToString(variableName, expectedContent);
        count--;
        if (!count) {
            document.getElementById('container').style.display = 'none';
            finishJSTest();
        }
    }
}

if (window.testRunner)
    window.onload = copyText;
jsTestIsAsync = true;
successfullyParsed = true;

</script>
<div id="container">
    <button onclick="copyText();">Copy text</button>
    <div id="source" oncopy="copy(event)" contenteditable="true">hello, world</div>
</div>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
