<!DOCTYPE html>
<html>
<body>
    <style>
    #source, #destination, #copy {
        width: 100vw;
        height: 20vh;
        border: blue dashed 1px;
        font-size: 18vh;
        position: absolute;
        opacity: 0.5;
        text-align: center;
    }
    #source {
        top: 0vh;
    }
    #destination {
        top: 20vh;
    }
    </style>
    <p>To manually test this, drag the text in the first editing area into the second. The first area should retain the
    text, the second area should be blank, and the third area should show an HTML representation of the first area with
    style information.</p>
    <p>Source:</p>
    <div id="source" contenteditable onbeforeinput=handleBeforeInput(event)><code>input events</code></div>
    <p>Destination:</p>
    <div id="destination" contenteditable onbeforeinput=handleBeforeInput(event)></div>
    <p>HTML content:</p>
    <div id="result"></div>
    <script type="text/javascript">
        if (window.internals && window.testRunner) {
            internals.settings.setInputEventsEnabled(true);
            testRunner.dumpAsText();
        }

        source.focus();
        document.execCommand("selectAll");

        if (window.eventSender) {
            moveToCenter(source);
            eventSender.leapForward(500);
            eventSender.mouseDown();
            eventSender.leapForward(1000);
            moveToCenter(destination);
            eventSender.leapForward(500);
            eventSender.mouseUp();
        }

        function handleBeforeInput(event)
        {
            if (event.inputType === "insertFromDrop") {
                result.textContent = event.dataTransfer.getData("text/html");
                event.preventDefault();
                return;
            }

            if (event.inputType === "deleteByDrag")
                event.preventDefault();
        }

        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>
