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

<!-- Example 1: controls a list -->
<input type="text" role="combobox" id="combobox1" aria-controls="list1" aria-label="Combobox1">
<div role="list" id="list1" aria-label="List1">
<div role="listitem" id="item1_1">item1</div>
<div role="listitem" id="item1_2">item2</div>
</div>

<!-- Example 2: owns a listbox -->
<input type="text" role="combobox" id="combobox2" aria-owns="listbox2" aria-label="Combobox2">
<div role="listbox" id="listbox2" aria-label="Listbox2">
<div role="option" id="option2_1">item1</div>
<div role="option" id="option2_2">item2</div>
</div>

<!-- Example 3: owns a grid -->
<input type="text" role="combobox" id="combobox3" aria-owns="grid3" aria-label="Combobox3">
<div role="grid" id="grid3" aria-label="Grid3">
<div role="row" id="row3_1">
<div role="gridcell" id="gridcell3_1">cell1</div>
</div>
</div>

<!-- Example 3: owns a tree -->
<input type="text" role="combobox" id="combobox4" aria-owns="tree4" aria-label="Combobox4">
<div role="tree" id="tree4" aria-label="Tree4">
<div role="treeitem" id="treeitem4_1">treeitem1</div>
<div role="treeitem" id="treeitem4_2">treeitem2</div>
</div>

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

<script>

    description("This tests variations of the comboboxes and elements it can control and own. Then verifies the active-descendant is reflected correctly.");

    if (window.accessibilityController) {
        window.jsTestIsAsync = true;
        var selectedChildrenChangeCount = 0;

        window.accessibilityController.addNotificationListener(function (target, notification) {
            if (notification == "AXSelectedChildrenChanged" || notification == "AXSelectedRowsChanged") {
                selectedChildrenChangeCount++;
                var targetString = platformValueForW3CName(target);
                debug("Received " + notification + " for " + targetString);
                if (selectedChildrenChangeCount == 4) {
                    accessibilityController.removeNotificationListener();
                    finishJSTest(); 
                }
            }
        });

        // Example 1: aria-controls a list.
        document.getElementById("combobox1").focus();
        var list = accessibilityController.accessibleElementById("list1");
        shouldBe("list.selectedChildrenCount", "0");
        // Set active-descendant, verify notification is sent and that list has correct selected children.
        document.getElementById("combobox1").setAttribute("aria-activedescendant", "item1_1");
        var listitem1 = accessibilityController.accessibleElementById("item1_1");
        shouldBe("list.selectedChildrenCount", "1");
        shouldBeTrue("list.selectedChildAtIndex(0).isEqual(listitem1)");

        // Example 2: aria-owns a listbox.
        document.getElementById("combobox2").focus();
        var listbox = accessibilityController.accessibleElementById("listbox2");
        shouldBe("listbox.selectedChildrenCount", "0");
        // Set active-descendant, verify notification is sent and that list has correct selected children.
        document.getElementById("combobox2").setAttribute("aria-activedescendant", "option2_1");
        var option2_1 = accessibilityController.accessibleElementById("option2_1");
        shouldBe("listbox.selectedChildrenCount", "1");
        shouldBeTrue("listbox.selectedChildAtIndex(0).isEqual(option2_1)");

        // Example 3: aria-owns a grid.
        document.getElementById("combobox3").focus();
        var grid = accessibilityController.accessibleElementById("grid3");
        shouldBe("grid.selectedChildrenCount", "0");
        // Set active-descendant, verify notification is sent and that list has correct selected children.
        document.getElementById("combobox3").setAttribute("aria-activedescendant", "row3_1");
        var row3_1 = accessibilityController.accessibleElementById("row3_1");
        shouldBe("grid.selectedChildrenCount", "1");
        shouldBeTrue("grid.selectedChildAtIndex(0).isEqual(row3_1)");

        // Example 4: aria-owns a tree.
        document.getElementById("combobox4").focus();
        var tree = accessibilityController.accessibleElementById("tree4");
        shouldBe("tree.selectedChildrenCount", "0");
        // Set active-descendant, verify notification is sent and that list has correct selected children.
        document.getElementById("combobox4").setAttribute("aria-activedescendant", "treeitem4_1");
        var treeitem4_1 = accessibilityController.accessibleElementById("treeitem4_1");
        shouldBe("tree.selectedChildrenCount", "1");
        shouldBeTrue("tree.selectedChildAtIndex(0).isEqual(treeitem4_1)");
    }

</script>

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

