<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true, editable=true ] -->
<html>
<meta name="viewport" content="width=device-width, initial-scale=1">
<head>
    <script src="../../../resources/basic-gestures.js"></script>
    <script src="../../../resources/ui-helper.js"></script>
    <style>
        body {
            margin: 0;
        }
    </style>
    <script>
    function appendOutput(string) {
        let pre = document.createElement("pre");
        pre.textContent = string;
        document.body.appendChild(pre);
    }

    beforeInputEvents = [];
    inputEvents = [];
    eventNumber = 0;

    async function run()
    {
        script.remove();

        document.body.addEventListener("beforeinput", event => {
            beforeInputEvents.push({
                "inputType": event.inputType,
                "data": event.data,
                "order": ++eventNumber
            });
        });

        document.body.addEventListener("input", event => {
            inputEvents.push({
                "inputType": event.inputType,
                "data": event.data,
                "order": ++eventNumber
            });
        });

        await UIHelper.setKeyboardInputModeIdentifier("he_IL");
        await UIHelper.activateAndWaitForInputSessionAt(100, 250);
        await UIHelper.ensurePresentationUpdate();
        const markupUsingHebrewKeyboard = document.body.innerHTML;

        document.body.blur();
        await UIHelper.waitForKeyboardToHide();
        await UIHelper.setKeyboardInputModeIdentifier("en_US");
        await UIHelper.activateAndWaitForInputSessionAt(100, 250);
        await UIHelper.ensurePresentationUpdate();
        const markupUsingEnglishKeyboard = document.body.innerHTML;

        appendOutput(`Using Hebrew keyboard: ${markupUsingHebrewKeyboard}`);
        appendOutput(`Using English keyboard: ${markupUsingEnglishKeyboard}`);
        appendOutput(`Observed 'beforeinput' events: ${JSON.stringify(beforeInputEvents, null, 4)}`);
        appendOutput(`Observed 'input' events: ${JSON.stringify(inputEvents, null, 4)}`);
        testRunner.notifyDone();
    }
    </script>
</head>
<body onload="run()">
    <div><br></div>
    <div><br></div>
</body>
<script id="script">
if (window.testRunner) {
    testRunner.waitUntilDone();
    testRunner.dumpAsText();
} else {
    const description = document.createElement("p");
    description.textContent = "Verifies that focusing an editable area with an RTL keyboard switches text direction to RTL. "
        + "To test manually, switch to a Hebrew keyboard and focus the editable area. "
        + "The editable area should be made RTL.";
    document.body.prepend(description);
}
</script>
</html>
