<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->

<html>

<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <script id="ui-script" type="text/plain">
        (function() {
            uiController.didShowKeyboardCallback = function() {
                uiController.typeCharacterUsingHardwareKeyboard("t", function() {
                    uiController.selectTextCandidateAtIndex(1, function() {
                        uiController.uiScriptComplete();
                    });
                });
            }
            uiController.singleTapAtPoint($x, $y, function() {});
        })();
    </script>

    <script>
        var progress = 0;
        var replacementText = "";
        let write = (message) => output.innerHTML += (message + "<br>");
        function getUIScript() {
            let rect = editable.getBoundingClientRect();
            let script = document.getElementById("ui-script").text;
            script = script.replace("$x", rect.left + rect.width / 2);
            return script.replace("$y", rect.top + rect.height / 2);
        }

        if (window.testRunner) {
            testRunner.dumpAsText();
            testRunner.waitUntilDone();
            internals.settings.setInputEventsEnabled(true);
        }

        function incrementProgress()
        {
            progress++;
            if (!window.testRunner || progress !== 2)
                return;

            setTimeout(function() {
                if (editable.value.indexOf(replacementText) == -1)
                    write(`PASS: The replacement text was prevented.`);
                else
                    write(`FAIL: The input value ${editable.value} should not contain replacement text ${replacementText}.`);
                testRunner.notifyDone();
            }, 0);
        }

        function runTest()
        {
            editable.addEventListener("beforeinput", preventBeforeInput);
            if (!window.testRunner || !testRunner.runUIScript)
                return;

            testRunner.runUIScript(getUIScript(), function(result) {
                incrementProgress();
            });
        }

        function preventBeforeInput(event)
        {
            if (event.inputType === "insertReplacementText") {
                replacementText = event.data;
                if (!replacementText)
                    write("FAIL: The replacement text input event lacks data.");
                event.preventDefault();
                incrementProgress();
            }
        }

    </script>
    <style>
    #editable {
        width: 200px;
        height: 100px;
        top: 0;
        left: 0;
        position: absolute;
    }
    </style>
</head>

<body style="margin: 0;" onload=runTest()>
    <input contenteditable id="editable"></input>
    <p>To manually test, type 't' into the contenteditable and try to select a candidate. The replacement text should not be inserted.</p>
    <div id="output"></div>
</body>

</html>
