<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="../../editing/editing.js" language="JavaScript" type="text/JavaScript" ></script>
<script id="ui-script" type="text/plain">
    (function() {
        uiController.retrieveSpeakSelectionContent(function() {
            uiController.uiScriptComplete(uiController.accessibilitySpeakSelectionContent);
        });
    })();
</script>
</head>

<body onload="runTest();">
<p id="result">This test has to run in iOS WebKitTestRunner.</p>

<input type="text" id="myText" value="Text outside iframe">
<iframe id="frame" srcdoc="<html><body><input id='myText2' type='text' value='Text inside iframe'><span tabindex=0 id='myText3'>text3</span></body></html>"></iframe>

<p id="description"></p>
<div id="console"></div>

<script>
    description("This tests that accessibility speak selection content is correct.");

    if (window.testRunner)
        window.jsTestIsAsync = true;

    function runTest() {
        var input1 = document.getElementById("myText");
        selectInputContent(input1);
        if (testRunner.runUIScript) {
            var uiScript = document.getElementById('ui-script').text;
            testRunner.runUIScript(uiScript, function(result) {
                debug("Content: " + result);
                testInsideFrame(document.getElementById('frame').contentWindow.document);
            });
        }
    }
    
    function testInsideFrame(iframeDocument) {
        var input2 = iframeDocument.getElementById("myText2");
        selectInputContent(input2);
        if (testRunner.runUIScript) {
            var uiScript = document.getElementById('ui-script').text;
            testRunner.runUIScript(uiScript, function(result) {
                debug("Content: " + result);
                testNonInputInsideFrame(iframeDocument);
            });
        }
    }
    
    function testNonInputInsideFrame(iframeDocument) {
        var text3 =  iframeDocument.getElementById("myText3");
        var text3Obj = accessibilityController.accessibleElementById("myText3");
        selectElementContent(text3, text3Obj, 5);
        if (testRunner.runUIScript) {
            var uiScript = document.getElementById('ui-script').text;
            testRunner.runUIScript(uiScript, function(result) {
                debug("Content: " + result);
                finishJSTest();
            });
        }
    }
    
    function selectInputContent(input) {
        input.focus();
        input.selectionStart = 0;
        input.selectionEnd = 100;
    }
    
    function selectElementContent(element, elementObj, length) {
        element.focus();
        setSelectionCommand(element, 0, element, 0);
        for (var i = 0; i < length; i++)
            elementObj.increaseTextSelection;
    }
    
</script>

<script src="../../resources/js-test-post.js"></script>
</body>
</html>