<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="resources/js-test-selection-shared.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description('Tests if the spellchecker behavior change after the spellcheck attribute changed by the script.');

jsTestIsAsync = true;

if (window.internals) {
    internals.settings.setUnifiedTextCheckerEnabled(true);
    internals.settings.setAsynchronousSpellCheckingEnabled(true);
}

var parent = document.createElement("div");
document.body.appendChild(parent);
var sel = document.getSelection();

function testSpellCheckingEnabled(target, enabled)
{
    target.spellcheck = enabled;

    if (target.tagName == "SPAN") {
        target.appendChild(document.createTextNode("Hello,"));
        sel.setBaseAndExtent(target, 6, target, 6);
    } else if (target.tagName == "INPUT" || target.tagName == "TEXTAREA") {
        target.focus();
        document.execCommand("InsertText", false, "Hello,");
    }

    document.execCommand("InsertText", false, 'z');
    document.execCommand("InsertText", false, 'z');
    document.execCommand("InsertText", false, ' ');

    window.target = target;
    shouldBe("target.spellcheck", enabled ? "true" : "false");
    shouldBecomeEqual("internals.hasSpellingMarker(6, 2)", enabled ? "true" : "false", done);
}

function createElement(tagName, spellcheck)
{
    var target = document.createElement(tagName);
    if (tagName == "SPAN")
        target.setAttribute("contentEditable", "true");
    if (spellcheck)
        target.setAttribute("spellcheck", spellcheck);
    return target;
}

function testFor(tagName, initialAttribute, expectation)
{
    var target = createElement(tagName, initialAttribute);
    parent.appendChild(target);

    testSpellCheckingEnabled(target, expectation);
}

var tests = [ function() { testFor("SPAN", undefined, true); }, // default -> true
              function() { testFor("SPAN", undefined, false); }, // default -> false
              function() { testFor("SPAN", true, true); }, // true -> true
              function() { testFor("SPAN", true, false); }, // true -> false
              function() { testFor("SPAN", false, true); }, // false -> true
              function() { testFor("SPAN", false, false); }, // false -> false

              function() { testFor("INPUT", undefined, true); }, // default -> true
              function() { testFor("INPUT", undefined, false); }, // default -> false
              function() { testFor("INPUT", true, true); }, // true -> true
              function() { testFor("INPUT", true, false); }, // true -> false
              function() { testFor("INPUT", false, true); }, // false -> true
              function() { testFor("INPUT", false, false); }, // false -> false

              function() { testFor("TEXTAREA", undefined, true); }, // default -> true
              function() { testFor("TEXTAREA", undefined, false); }, // default -> false
              function() { testFor("TEXTAREA", true, true); }, // true -> true
              function() { testFor("TEXTAREA", true, false); }, // true -> false
              function() { testFor("TEXTAREA", false, true); }, // false -> true
              function() { testFor("TEXTAREA", false, false); }, // false -> false
            ];

function done()
{
    if (window.internals) {
        var next = tests.shift();
        if (next)
            return window.setTimeout(next, 0);

        parent.innerHTML = "";
    }
    finishJSTest();
}
done();

var successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
