<!DOCTYPE html>
<html>
<body>
    <style>
        #source, #richDestination, #plainDestination {
            font-size: 30px;
            border: 1px blue dashed;
            width: 100px;
        }
    </style>
    <p>To manually test this, drag the text into the contenteditable, and then into the textarea. Observe the output.
    You should see a pair of insertFromDrop events dispatched on richDestination followed by another pair of
    insertFromDrop events dispatched on plainDestination.</p>
    <div id="source">WebKit</div>
    <div id="richDestination" contenteditable onbeforeinput=logInputEvent(event) oninput=logInputEvent(event)></div>
    <textarea id="plainDestination" onbeforeinput=logInputEvent(event) oninput=logInputEvent(event)></textarea>
    <div id="output"></div>
    <script type="text/javascript">
        if (window.internals && window.testRunner) {
            internals.settings.setInputEventsEnabled(true);
            testRunner.dumpAsText();
        }

        if (window.eventSender) {
            moveToCenter(source);
            doubleClick();
            eventSender.leapForward(1000);

            eventSender.mouseDown();
            eventSender.leapForward(1000);
            moveToCenter(richDestination);
            eventSender.leapForward(1000);
            eventSender.mouseUp();
            eventSender.leapForward(1000);

            moveToCenter(source);
            doubleClick();
            eventSender.leapForward(1000);

            eventSender.mouseDown();
            eventSender.leapForward(1000);
            moveToCenter(plainDestination);
            eventSender.leapForward(1000);
            eventSender.mouseUp();
        }

        function dataTransferToString(dataTransfer)
        {
            if (!dataTransfer)
                return "(null)"

            return `{rich:${dataTransfer.getData("text/html")} plain:${dataTransfer.getData("text/plain")}}`;
        }

        function logInputEvent(event)
        {
            output.innerHTML += `(${event.target.id}): type=${event.type}, inputType=${event.inputType}, data="${event.data}" dataTransfer=${dataTransferToString(event.dataTransfer)}<br>`;
        }

        function doubleClick() {
            eventSender.mouseDown();
            eventSender.mouseUp();
            eventSender.leapForward(100);
            eventSender.mouseDown();
            eventSender.mouseUp();
        }

        function moveToCenter(element)
        {
            let x = element.offsetParent.offsetLeft + element.offsetLeft + element.offsetWidth / 2;
            let y = element.offsetParent.offsetTop + element.offsetTop + element.offsetHeight / 2;
            eventSender.mouseMoveTo(x, y);
        }
    </script>
</body>
</html>
