<!DOCTYPE html>
<html>
<head>
<script src="../editing.js"></script>
<script src="../../resources/ui-helper.js"></script>
<title>Editing word with marker test 1</title>
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

if (window.internals) {
    if (UIHelper.isIOSFamily() || !UIHelper.isWebKit2())
        internals.setContinuousSpellCheckingEnabled(true);
    else {
        internals.settings.setUnifiedTextCheckerEnabled(true);
        internals.settings.setAsynchronousSpellCheckingEnabled(true);
    }
}
</script>
</head>
<body>
<p>The test verified that when a word is modified, its spelling markers are removed.
When manually testing, type "it's a meagesga", then edit the word "meagesga". You should see the 
underline under the modified "meagesga" disppears after editing.</p>
<textarea id="test" cols="80" rows="10"></textarea>
<div id="console"></div>
<script>
let textarea = document.getElementById("test");

async function resetText()
{
    textarea.blur();
    if (window.testRunner)
        await UIHelper.activateElementAndWaitForInputSession(textarea);
    else
        textarea.focus();
    textarea.value = "";
    typeCharacterCommand('i');
    typeCharacterCommand('t');
    typeCharacterCommand('\'');
    typeCharacterCommand('s');
    typeCharacterCommand(' ');
    typeCharacterCommand('a');
    typeCharacterCommand(' ');
    typeCharacterCommand('m');
    typeCharacterCommand('e');
    typeCharacterCommand('a');
    typeCharacterCommand('g');
    typeCharacterCommand('e');
    typeCharacterCommand('s');
    typeCharacterCommand('g');
    typeCharacterCommand('a');
    typeCharacterCommand(' ');
}

async function runTest()
{
    resetText();
    textarea.setSelectionRange(14, 15);
    execDeleteCommand();
    if (window.internals && window.internals.hasSpellingMarker) {
        if (!window.internals.hasSpellingMarker(7, 7))
            document.getElementById('console').innerHTML = 'SUCCESS<br>';
        else
            document.getElementById('console').innerHTML = "FAILURE. The word 'meagesg' has underline.<br>";
    }

    // Testing deletion at various location.
    resetText();
    textarea.setSelectionRange(6, 6);
    execForwardDeleteCommand();
    if (window.internals && window.internals.hasSpellingMarker) {
        if (!window.internals.hasSpellingMarker(6, 8))
            document.getElementById('console').innerHTML += 'SUCCESS<br>';
        else
            document.getElementById('console').innerHTML += "FAILURE. The word 'ameagesga' has underline.<br>";
    }

    resetText();
    textarea.setSelectionRange(7, 7);
    execForwardDeleteCommand();
    if (window.internals && window.internals.hasSpellingMarker) {
        if (!window.internals.hasSpellingMarker(7, 7))
            document.getElementById('console').innerHTML += 'SUCCESS<br>';
        else
            document.getElementById('console').innerHTML += "FAILURE. The word 'eagesga' has underline.<br>";
    }

    resetText();
    textarea.setSelectionRange(10, 10);
    typeCharacterCommand(' ');
    if (window.internals && window.internals.hasSpellingMarker) {
        if (!window.internals.hasSpellingMarker(7, 3) && !window.internals.hasSpellingMarker(11, 5))
            document.getElementById('console').innerHTML += 'SUCCESS<br>';
        else
            document.getElementById('console').innerHTML += "FAILURE. The segment 'mea gesga' has underline.<br>";
    }

    resetText();
    textarea.setSelectionRange(10, 13);
    execDeleteCommand();
    if (window.internals && window.internals.hasSpellingMarker) {
        if (!window.internals.hasSpellingMarker(7, 5))
            document.getElementById('console').innerHTML += 'SUCCESS<br>';
        else
            document.getElementById('console').innerHTML += "FAILURE. The word 'meaga' has underline.<br>";
    }

    resetText();
    textarea.setSelectionRange(10, 13);
    typeCharacterCommand(' ');
    if (window.internals && window.internals.hasSpellingMarker) {
        if (!window.internals.hasSpellingMarker(7, 3) && !window.internals.hasSpellingMarker(11, 2))
            document.getElementById('console').innerHTML += 'SUCCESS<br>';
        else
            document.getElementById('console').innerHTML += "FAILURE. The segment 'mea ga' has underline.<br>";
    }

    // Testing appending non-whitespace character.
    resetText();
    textarea.setSelectionRange(7, 7);
    typeCharacterCommand('a');
    if (window.internals && window.internals.hasSpellingMarker) {
        if (!window.internals.hasSpellingMarker(8, 8))
            document.getElementById('console').innerHTML += 'SUCCESS<br>';
        else
            document.getElementById('console').innerHTML += "FAILURE. The word 'ameagesga' has underline.<br>";
    }

    resetText();
    textarea.setSelectionRange(15, 15);
    typeCharacterCommand('a');
    if (window.internals && window.internals.hasSpellingMarker) {
        if (!window.internals.hasSpellingMarker(7,8))
            document.getElementById('console').innerHTML += 'SUCCESS<br>';
        else
            document.getElementById('console').innerHTML += "FAILURE. The word 'meagesgaa' has underline.<br>";
    }

    // Testing pasting.
    resetText();
    textarea = document.getElementById('test');
    textarea.setSelectionRange(0, 4);
    execCopyCommand();
    textarea.setSelectionRange(7, 7);
    execPasteCommand();
    if (window.internals && window.internals.hasSpellingMarker) {
        if (!window.internals.hasSpellingMarker(11, 8))
            document.getElementById('console').innerHTML += 'SUCCESS<br>';
        else
            document.getElementById('console').innerHTML += "FAILURE. The word 'meagesga' has underline.<br>";
    }

    resetText();
    textarea = document.getElementById('test');
    textarea.setSelectionRange(0, 4);
    execCopyCommand();
    textarea.setSelectionRange(15, 15);
    if (window.internals)
        internals.updateEditorUINowIfScheduled();
    execPasteCommand();
    if (window.internals && window.internals.hasSpellingMarker) {
        if (!window.internals.hasSpellingMarker(7, 8))
            document.getElementById('console').innerHTML += 'SUCCESS<br>';
        else
            document.getElementById('console').innerHTML += "FAILURE. The word 'meagesga' has underline.<br>";
    }

    resetText();
    textarea = document.getElementById('test');
    textarea.setSelectionRange(0, 4);
    execCopyCommand();
    textarea.setSelectionRange(10, 10);
    execPasteCommand();
    if (window.internals && window.internals.hasSpellingMarker) {
        if (!window.internals.hasSpellingMarker(7, 3) && !window.internals.hasSpellingMarker(15, 5))
            document.getElementById('console').innerHTML += 'SUCCESS<br>';
        else
            document.getElementById('console').innerHTML += "FAILURE. The word 'meait\'sgesga' has underline.<br>";
    }

    if (window.testRunner)
        testRunner.notifyDone();
}

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