<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test-pre.js"></script>
<div id="container">
<button onclick="runTest()">Copy</button>
<div id="source" contenteditable="true">hello, <b>world</b><br>WebKit</div>
<div id="destination" onpaste="check(event)" contenteditable="true" style="width: 500px; height: 100px; border: solid red 1px"></div>
</div>
</body>
<script>
description('Tests that pasting as plain text only exposes "text/plain" in the clipboard. To manually test, press "Copy" below and paste (Command+V on macOS and Control+V elsewhere).');
jsTestIsAsync = true;

function runTest()
{
    if (window.internals)
        internals.settings.setCustomPasteboardDataEnabled(true);

    document.getElementById("source").focus();
    document.execCommand("SelectAll");
    document.execCommand("Copy");

    document.getElementById("destination").focus();
    if (window.testRunner)
        document.execCommand("PasteAndMatchStyle");
}

function check(event)
{
    shouldBeEqualToString('JSON.stringify(event.clipboardData.types)', '["text/plain"]');
    shouldBeEqualToString('event.clipboardData.getData("text/plain")', 'hello, world\nWebKit');
    shouldBeEqualToString('event.clipboardData.getData("text/html")', '');
    shouldBe('event.clipboardData.items.length', '1');
    shouldBeEqualToString('item = event.clipboardData.items[0]; item.kind', 'string');
    shouldBeEqualToString('item.type', 'text/plain');

    document.getElementById('container').remove();

    finishJSTest();
}

if (window.testRunner)
    runTest();

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