<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta charset="utf-8"> 
<script src="../../resources/js-test-pre.js"></script>
</head>
<style>
.userselect { user-select: none; -webkit-user-select: none; }
</style>
<body id="body">

<div id="text" tabindex="0">word1 test</div>
<span id="span">Thisis</span>longword I<span>'ll try.</span>
Test Content<span id="target" contenteditable="true">editable is working.</span>

<div id="text2">
c <img src="#" aria-label="blah" style="background-color: #aaaaaa; width: 100px; height: 100px;">d
</div>

<div class="userselect" id="text3">can't select</div>

<div id="text4">
巧克力是食物吗？
</div>
<div id="text4a">
كيف حالك؟
</div>

<pre id="text5">
both   spaces
line breaks
</pre>

<div id="text6">
some<br>text
</div>

<div id="text7">
test audio <audio controls><source src="test.mp3" type="audio/mpeg"></audio>file
</div>

<p id="text8">
<strong>Edit</strong>
text
</p>

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

<script>

    description("This tests that word navigation is working correctly.");
    
    if (window.accessibilityController) {
        
        var text = accessibilityController.accessibleElementById("text");
        // Get the actual text node.
        text = text.childAtIndex(0);
        
        // Check that we can get the word range. Land at "w" in "word1 test".
        var textMarkerRange = text.textMarkerRangeForElement(text);
        var startMarker = text.startTextMarkerForTextMarkerRange(textMarkerRange);
        var currentMarker = advanceAndVerify(startMarker, 1, text);
        
        // Check that we are at the end of paragraph, so right word should be empty
        currentMarker = advanceAndVerify(currentMarker, 9, text);
        
        // Check the case with span
        // At "T" in "Thisis", should return the word as "Thisislongword".
        currentMarker = advanceAndVerify(currentMarker, 1, text);
        // At " " before "I", the word should be "I'll".
        currentMarker = advanceAndVerify(currentMarker, 14, text);
        // At " " before "try", the word should excludes "."
        currentMarker = advanceAndVerify(currentMarker, 5, text);
        
        // Check the case with contenteditable
        // At "e" in "editable", the word should NOT include "Content" before it.
        currentMarker = advanceAndVerify(currentMarker, 18, text);
        
        // Check the case with replaced node, the replaced node should be considered a word.
        var text2 = accessibilityController.accessibleElementById("text2");
        textMarkerRange = text2.textMarkerRangeForElement(text2);
        currentMarker = text2.startTextMarkerForTextMarkerRange(textMarkerRange);
        currentMarker = advanceAndVerify(currentMarker, 2, text2);
        currentMarker = advanceAndVerify(currentMarker, 1, text2);
        
        // Check user-select:none is also working.
        var text3 = accessibilityController.accessibleElementById("text3");
        textMarkerRange = text3.textMarkerRangeForElement(text3);
        currentMarker = text3.startTextMarkerForTextMarkerRange(textMarkerRange);
        currentMarker = advanceAndVerify(currentMarker, 1, text3);
        
        // Check multi-language, Chinese here.
        var text4 = accessibilityController.accessibleElementById("text4");
        textMarkerRange = text4.textMarkerRangeForElement(text4);
        currentMarker = text4.startTextMarkerForTextMarkerRange(textMarkerRange);
        // Make sure when we are at the beginning of line, it won't go to previous node.
        currentMarker = advanceAndVerify(currentMarker, 0, text4);
        currentMarker = advanceAndVerify(currentMarker, 2, text4);
        currentMarker = advanceAndVerify(currentMarker, 1, text4);
        currentMarker = advanceAndVerify(currentMarker, 1, text4);
        // And Arabic
        var text4a = accessibilityController.accessibleElementById("text4a");
        textMarkerRange = text4a.textMarkerRangeForElement(text4a);
        currentMarker = text4a.startTextMarkerForTextMarkerRange(textMarkerRange);
        currentMarker = advanceAndVerify(currentMarker, 3, text4a);
        currentMarker = advanceAndVerify(currentMarker, 1, text4a);
        
        // Check text in pre tag with line breaks.
        var text5 = accessibilityController.accessibleElementById("text5");
        textMarkerRange = text5.textMarkerRangeForElement(text5);
        currentMarker = text5.startTextMarkerForTextMarkerRange(textMarkerRange);
        // At "h" in "both", right word should be "   ".
        currentMarker = advanceAndVerify(currentMarker, 4, text5);
        // At the end of first line, right word should be new line.
        currentMarker = advanceAndVerify(currentMarker, 9, text5);
        
        // Check text with br tag in it.
        var text6 = accessibilityController.accessibleElementById("text6");
        textMarkerRange = text6.textMarkerRangeForElement(text6);
        currentMarker = text6.startTextMarkerForTextMarkerRange(textMarkerRange);
        currentMarker = advanceAndVerify(currentMarker, 4, text6);
        currentMarker = advanceAndVerify(currentMarker, 1, text6);
        
        // Check <audio> element.
        var text7 = accessibilityController.accessibleElementById("text7");
        textMarkerRange = text7.textMarkerRangeForElement(text7);
        currentMarker = text7.startTextMarkerForTextMarkerRange(textMarkerRange);
        currentMarker = advanceAndVerify(currentMarker, 11, text7);
        currentMarker = advanceAndVerify(currentMarker, 1, text7);
        currentMarker = advanceAndVerify(currentMarker, 1, text7);
        
        // For node with text node children, we should treat the visual space as word boundary.
        var text8 = accessibilityController.accessibleElementById("text8");
        textMarkerRange = text8.textMarkerRangeForElement(text8);
        currentMarker = text8.startTextMarkerForTextMarkerRange(textMarkerRange);
        currentMarker = advanceAndVerify(currentMarker, 4, text8);
        
        // Check the word marker runs from start to end, and backwards.
        // Make sure it won't hang.
        verifyDocument(text);
        
        function advanceAndVerify(currentMarker, offset, obj) {
            var previousMarker = currentMarker;
            for (var i = 0; i < offset; i++) {
                previousMarker = currentMarker;
                currentMarker = obj.nextTextMarker(previousMarker);
            }
            verifyWordRangeForTextMarker(previousMarker, currentMarker, obj);
            return currentMarker;
        }
        
        function replaceAttachmentInString(str) {
            var newline = '\n';
            str =  str.replace(String.fromCharCode(65532), "[ATTACHMENT]");
            str = str.replace(newline, "'line break'");
            return str;
        }
        
        function verifyWordRangeForTextMarker(preMarker, textMarker, obj) {
            var markerRange = obj.textMarkerRangeForMarkers(preMarker, textMarker);
            var currentCharacter = replaceAttachmentInString(obj.stringForTextMarkerRange(markerRange));
            debug("Current character is: " + currentCharacter);
            
            var previousWordRange = obj.leftWordTextMarkerRangeForTextMarker(textMarker);
            var nextWordRange = obj.rightWordTextMarkerRangeForTextMarker(textMarker);
            var preWord = replaceAttachmentInString(obj.stringForTextMarkerRange(previousWordRange));
            var nextWord = replaceAttachmentInString(obj.stringForTextMarkerRange(nextWordRange));
            debug("Left word is: " + preWord);
            debug("Right word is: " + nextWord);
            
            var preWordStart = obj.previousWordStartTextMarkerForTextMarker(textMarker);
            var nextWordEnd = obj.nextWordEndTextMarkerForTextMarker(textMarker);
            var preAndNextWordRange = obj.textMarkerRangeForMarkers(preWordStart, nextWordEnd);
            var preAndNextWord = replaceAttachmentInString(obj.stringForTextMarkerRange(preAndNextWordRange));
            debug("Pre word start to next word end: " + preAndNextWord + "\n");
        }
        
        function verifyDocument(obj) {
            var start = obj.startTextMarker;
            
            // Going forward.
            debug("Test going forward.");
            var current = start;
            var endWord = "file";
            var currWord = "";
            while(currWord != endWord) {
                var nextWordRange = obj.rightWordTextMarkerRangeForTextMarker(current);
                currWord = obj.stringForTextMarkerRange(nextWordRange);
                current = obj.nextWordEndTextMarkerForTextMarker(current);
            }
            debug("End word: " + replaceAttachmentInString(currWord));
            
            // Going backwards.
            debug("\nTest going backwards.");
            var startWord = "word1";
            currWord = ""; 
            while(currWord != startWord) {
                var previousWordRange = obj.leftWordTextMarkerRangeForTextMarker(current);
                currWord = obj.stringForTextMarkerRange(previousWordRange);
                current = obj.previousWordStartTextMarkerForTextMarker(current);
            }
            debug("Start word: " + replaceAttachmentInString(currWord));
        }
    }

</script>

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