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

<div>
<a href="" id="one">one</a>
<a href="" id="two">two</a>
</div>

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

<script>

    description("This tests that tabbing between links includes a relevant accessibilityObject in the userInfo when on the boundary between an ignored accessibilityObject and an unignored accessibilityObject.");

    var axTextChangeElement = 0;
    var webArea = 0;
    var changeElementOne = 0;
    var changeElementTwo = 0;
    var linkTwo = 0;
    var linkOne = 0;
    var count = 0;

    function ancestorWithRole(axElement, role) {
        var ancestor = axElement;
        while (ancestor) {
            if (ancestor.role == role)
                break;
            ancestor = ancestor.parentElement();
        }
        return ancestor;
    }

    function notificationCallback(notification, userInfo) {
        if (notification == "AXSelectedTextChanged") {
            count++;
            if (count == 1) {
                changeElementOne = userInfo["AXTextChangeElement"];
                linkTwo = accessibilityController.accessibleElementById("two");
                shouldBe("ancestorWithRole(changeElementOne, \"AXRole: AXLink\").isEqual(linkTwo)", "true");
            } else if (count == 2) {
                changeElementTwo = userInfo["AXTextChangeElement"];
                linkOne = accessibilityController.accessibleElementById("one");
                shouldBe("ancestorWithRole(changeElementTwo, \"AXRole: AXLink\").isEqual(linkOne)", "true");
                webArea.removeNotificationListener();
                finishJSTest();
            }
        }
    }

    if (window.accessibilityController) {
        jsTestIsAsync = true;
        testRunner.overridePreference("WebKitTabToLinksPreferenceKey", 1);

        accessibilityController.enableEnhancedAccessibility(true);
        webArea = accessibilityController.rootElement.childAtIndex(0);
        webArea.setBoolAttributeValue("AXCaretBrowsingEnabled", true)

        link = document.getElementById("one");
        link.focus();

        var addedNotification = webArea.addNotificationListener(notificationCallback);
        shouldBe("addedNotification", "true");

        eventSender.keyDown("\t");
        eventSender.keyDown("\t", ["shiftKey"]);
    }

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