<!DOCTYPE HTML>
<html>
<head>
<script src="../../LayoutTests/editing/editing.js"></script>
<script src="../../LayoutTests/editing/spelling/resources/util.js"></script>
<script src="../resources/runner.js"></script>
</head>
<body onload="start()">
<textarea style="border:2px solid red;" id="huge_text">
</textarea><br/>
<textarea id="destination">
</textarea>
<p id="helper" contenteditable spellcheck="false"></p>
<script>
var srcNode = null;
var dstNode = null;
var auxNode = null;
var startTime = 0;

function start()
{
    if (window.internals) {
        internals.settings.setUnifiedTextCheckerEnabled(true);
        internals.settings.setAsynchronousSpellCheckingEnabled(true);
        internals.setContinuousSpellCheckingEnabled(true);
        internals.settings.setJavaScriptCanAccessClipboard(true);
        internals.settings.setDOMPasteAllowed(true);
    }
    
    var testText = "";
    for (var i = 0; i < 260; i++)
        testText += "zz zz zz zz zz zz zz zz zz zz zz zz zz zz zz zz zz zz zz zz zz zz zz zz.\n";

    srcNode = document.getElementById('huge_text');
    srcNode.innerText = testText;

    PerfTestRunner.prepareToMeasureValuesAsync({ unit: "ms", done:done });

    test();
}

function test()
{
    startTime = PerfTestRunner.now();
    stepSelectAllInSrc();
}

function stepSelectAllInSrc()
{
    srcNode.focus();
    document.execCommand('SelectAll');
    waitUntilSelectedAndSpellchecked();
}

function waitUntilSelectedAndSpellchecked()
{
    if (!window.getSelection().toString().length) {
        setTimeout(waitUntilSelectedAndSpellchecked, 0);
        return;
    } else {
        if (window.internals) {
            if (!internals.markerCountForNode(findFirstTextNode(srcNode), "spelling")) {
                setTimeout(waitUntilSelectedAndSpellchecked, 0);
                return;
            }
        }
    }
    document.execCommand("Copy");
    stepHelper();
}

function stepHelper()
{
    auxNode = document.getElementById('helper');
    var textToType = 'good';
    typeText(auxNode, textToType);
    var textNode = findFirstTextNode(auxNode);
    if (!textNode || textNode.textContent != textToType) {
        setTimeout(stepHelper, 0);
        return;
    }
    stepPaste();
}

function stepPaste()
{
    dstNode = document.getElementById('destination');
    dstNode.focus();
    document.execCommand("Paste");
    check();
}

function check()
{
    if (window.internals) {
        if (!internals.markerCountForNode(findFirstTextNode(dstNode), "spelling")) {
            setTimeout(check, 0);
            return;
        }
    } else {
        if (dstNode.scrollTop > 0) {
            dstNode.scrollTop = dstNode.scrollTop - 1;
            setTimeout(check, 0);
            return;
        }
    }

    PerfTestRunner.measureValueAsync(PerfTestRunner.now() - startTime);
    PerfTestRunner.gc();
    dstNode.innerText = "";
    auxNode.innerText = "";
    setTimeout(test, 0);
}

function done()
{
    srcNode.innerText = "";
    dstNode.innerText = "";
    auxNode.innerText = "";
}

</script>
</body>
</html>
