<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="resources/atk-helpers.js"></script>
</head>

<body>

<!-- Suspected "a" element in several different configurations. -->

<div>
  <a id="id1" href="x" style="display:block;">
    <span style="display:block;">one</span>
  </a>
</div>

<div>
  <div>before</div>
  <a id="id2" href="x" style="display:block;">
    <span style="display:block;">two</span>
  </a>
</div>

<a id="id3" href="x" style="display:block;"><span style="display:block;">three</span></a>

<div>
  <a id="id4" href="x" style="display:block;">
    before,
    <span style="display:block;">four</span>
    ,after
  </a>
</div>

<div>
  <div>before</div>
  <a id="id5" href="x" style="display:block;"><span style="display:block;">five</span>
    ,after
  </a>
</div>

<a id="id6" href="x" style="display:block;">before,<span style="display:block;">six</span></a>

<a id="id7" href="x" style="display:block;">no span here</a>

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

<script>
var caretMovedData;

function stripNonWhite(s)
{
    var s2 = "";
    var i;
    for(i = 0; i < s.length; i++)
        if (s[i] != ' ' && s[i] != '\n')
            s2 += s[i];
    return s2.replace(/<\\n>/g, "");
}

function globalListener(object, name, offset)
{
    var role = object.role.replace('AXRole: AX', '');
    if (name == 'AXTextCaretMoved') {
        caretMovedData += role + '|' + offset;
    }
}

if (window.internals)
    internals.settings.setCaretBrowsingEnabled(true);
if (window.testRunner)
    testRunner.dumpAsText();

if (window.accessibilityController) {
    var i, linkText, accText, id;
    accessibilityController.addNotificationListener(globalListener)
    for (i = 1; i <= 7; i++) {
        id = 'id' + i;
        elem = accessibilityController.accessibleElementById(id);
        linkText = stripNonWhite(document.links[id].textContent);
        accText = stripNonWhite(elem.stringValue);
        shouldBeEqualToString("accText", "AXValue:" + linkText);
        caretMovedData = '';
        shouldBe("setCaretOffset(elem, 1)", "true");
        shouldBeEqualToString("caretMovedData", "Link|1");
    }
}

description('This tests that text inside "a" block inside "span" block is accessible.');

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