<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width">
<script src="../../../resources/js-test.js"></script>
<script src="../../../resources/ui-helper.js"></script>
<style>
#test {
    border: 1px solid black;
    height: 500px;
    width: 500px;
}

.hidden {
    display: none;
}
</style>
</head>
<body>
<p id="description"></p>
<p id="manual-instructions" class="hide">To run this test by hand, place the text insertion point at the begin of the text below and press Option + Forward Delete.</p>
<div id="console"></div>
<div id="test" contenteditable="true">hello world</div>
<script>
window.jsTestIsAsync = true;

let testElement = document.getElementById("test");
let mutationObserver = null;

function handleMutation()
{
    mutationObserver.disconnect();
    shouldBeEqualToString('document.getElementById("test").textContent', "world");
    document.body.removeChild(testElement);
    finishJSTest();
}

async function runTest()
{
    if (!window.testRunner)
        document.getElementById("manual-instructions").classList.remove("hidden");

    mutationObserver = new MutationObserver(handleMutation);
    mutationObserver.observe(testElement, { subtree:true, characterData: true });

    function handleFocus() {
        window.getSelection().setBaseAndExtent(testElement.firstChild, 0, testElement.firstChild, 0); // Put caret before the 'h'.
        if (window.testRunner)
            UIHelper.keyDown("forwardDelete", ["altKey"]);
    }

    if (window.testRunner) {
        await UIHelper.activateElement(testElement);
        handleFocus();
    } else
        testElement.addEventListener("focus", handleFocus, { once: true });
}

description("Tests that pressing Option + Forward Delete in a content-editable field deletes to next word.");
runTest();
</script>
</body>
</html>
