<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
<html>
<head>
<meta name="viewport" content="initial-scale=1.0">
<script src="../../resources/js-test.js"></script>
<script src="../../resources/ui-helper.js"></script>
<link rel="stylesheet" href="resources/test.css">
</head>
<body>
<p id="description"></p>
<div id="test" class="test" style="width: 200px; height: 200px; border: 1px solid black" contenteditable="true">Hello from Cupertino!</div>
<p id="console"></p>
<script>
window.jsTestIsAsync = true;

description("This tests that the text insertion point is before the inserted text placeholder when it's inserted before the start of a word. This test can only be run in WebKitTestRunner or DumpRenderTree.");

async function runTest()
{
    let testElement = document.getElementById("test");
    if (window.testRunner)
        await UIHelper.activateElementAndWaitForInputSession(testElement);
    else
        await UIHelper.callFunctionAndWaitForEvent(() => testElement.focus(), testElement, "focus");

    let positionOfFrom = testElement.textContent.indexOf("from");
    window.getSelection().setBaseAndExtent(testElement.firstChild, positionOfFrom, testElement.firstChild, positionOfFrom);

    if (window.internals) {
        let lineHeight = parseInt(window.getComputedStyle(testElement, null).lineHeight, 10);
        internals.insertTextPlaceholder(0 /* width */, lineHeight);
    }

    shouldBeEqualToString("window.getSelection().type", "Caret");
    shouldBe("window.getSelection().baseOffset", "'Hello'.length");

    if (window.testRunner) {
        // Cleanup to make the results pretty.
        document.body.removeChild(testElement);
    }

    finishJSTest();
}
runTest();
</script>
</body>
</html>
