<html>
<head>
<title>Spellcheck Attribute Test</title>
<link rel="help" href="http://damowmow.com/playground/spellcheck.txt">
<script src="../editing.js"></script>
<script src="resources/util.js"></script>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<div id="testRoot">

<div spellcheck="true">
<label>1.1.</label><input id="test1_1" type="text"></input><br/>
<label>1.2.</label><input id="test1_2" type="text" spellcheck="true"></input><br/>
<label>1.3.</label><input id="test1_3" type="text" spellcheck="false"></input><br/>
<label>1.4.</label><input id="test1_4" type="text" spellcheck="InvalidValue"></input><br/>
<label>1.5.</label><input id="test1_5" type="text" spellcheck></input><br/>
</div>
<div spellcheck="false">
<label>2.1.</label><input id="test2_1" type="text"></input><br/>
<label>2.2.</label><input id="test2_2" type="text" spellcheck="true"></input><br/>
<label>2.3.</label><input id="test2_3" type="text" spellcheck="false"></input><br/>
<label>2.4.</label><input id="test2_4" type="text" spellcheck="InvalidValue"></input><br/>
<label>2.5.</label><input id="test2_5" type="text" spellcheck></input><br/>
</div>

<div spellcheck="true">
<label>3.1.</label><input id="test3_1" type="search"></input><br/>
<label>3.2.</label><input id="test3_2" type="search" spellcheck="true"></input><br/>
<label>3.3.</label><input id="test3_3" type="search" spellcheck="false"></input><br/>
<label>3.4.</label><input id="test3_4" type="search" spellcheck="InvalidValue"></input><br/>
<label>3.5.</label><input id="test3_5" type="search" spellcheck></input><br/>
</div>
<div spellcheck="false">
<label>4.1.</label><input id="test4_1" type="search"></input><br/>
<label>4.2.</label><input id="test4_2" type="search" spellcheck="true"></input><br/>
<label>4.3.</label><input id="test4_3" type="search" spellcheck="false"></input><br/>
<label>4.4.</label><input id="test4_4" type="search" spellcheck="InvalidValue"></input><br/>
<label>4.5.</label><input id="test4_5" type="search" spellcheck></input><br/>
</div>

</div>
<script>
description('This tests if the "spellcheck" attribute is implemented '
    + 'as written in its specification. If this test succeeds, you can see '
    + 'forms filled with an invalid word "zz". Nevertheless, the "zz" is not '
    + 'marked as misspelled in all of them.');

jsTestIsAsync = true;

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

// Type misspelling to all input elements.
var inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++)
    typeText(inputs[i], 'zz ');

var shouldBeMarked;

function testMarkerForMisspelledWord(id, isMisspelled) {
    if (!window.internals)
        return done();

    var inputElement = document.getElementById(id);
    // Spelling markers for input will appear if it's focused.
    inputElement.focus();

    debug("id=" + id + " type=" + inputElement.type + " spellcheck=" + inputElement.spellcheck
        + " parent's spellcheck=" + inputElement.parentNode.spellcheck);

    shouldBeMarked = isMisspelled;
    shouldBecomeEqual('internals.hasSpellingMarker(document, 0, 2)', 'shouldBeMarked', done);
}

var tests = [
    // For type="text".
    function() { testMarkerForMisspelledWord('test1_1', true); },
    function() { testMarkerForMisspelledWord('test1_2', true); },
    function() { testMarkerForMisspelledWord('test1_3', false); },
    function() { testMarkerForMisspelledWord('test1_4', true); },
    function() { testMarkerForMisspelledWord('test1_5', true); },
    function() { testMarkerForMisspelledWord('test2_1', false); },
    function() { testMarkerForMisspelledWord('test2_2', true); },
    function() { testMarkerForMisspelledWord('test2_3', false); },
    function() { testMarkerForMisspelledWord('test2_4', false); },
    function() { testMarkerForMisspelledWord('test2_5', true); },
    // For type="search".
    function() { testMarkerForMisspelledWord('test3_1', true); },
    function() { testMarkerForMisspelledWord('test3_2', true); },
    function() { testMarkerForMisspelledWord('test3_3', false); },
    function() { testMarkerForMisspelledWord('test3_4', true); },
    function() { testMarkerForMisspelledWord('test3_5', true); },
    function() { testMarkerForMisspelledWord('test4_1', false); },
    function() { testMarkerForMisspelledWord('test4_2', true); },
    function() { testMarkerForMisspelledWord('test4_3', false); },
    function() { testMarkerForMisspelledWord('test4_4', false); },
    function() { testMarkerForMisspelledWord('test4_5', true); },
];

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

    if (window.testRunner) {
        // Cleaning up for expectation text if running on DRT.
        document.getElementById("testRoot").style.display = "none";
    }
    finishJSTest();
}
done();
</script>
</body>
</html>
