<!DOCTYPE HTML>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>

<style>
.hideAllContainers .container { display: none; }
</style>

<div class="container">
    <ul id="list1" aria-owns="item3">
        <li>One</li>
        <li>Two</li>
    </ul>
    <ul id="list2">
        <li id="item3">Three</li>
        <li>Four</li>
    </ul>
</div>

<script>
test(function(t)
{
    var axList1 = accessibilityController.accessibleElementById("list1");
    assert_equals(axList1.role, "AXRole: AXList");
    assert_equals(axList1.childrenCount, 3);

    var axItem = axList1.childAtIndex(0);
    assert_equals(axList1.childAtIndex(0).name, "One");
    assert_equals(axList1.childAtIndex(1).name, "Two");
    assert_equals(axList1.childAtIndex(2).name, "Three");

    var axList2 = accessibilityController.accessibleElementById("list2");
    assert_equals(axList2.role, "AXRole: AXList");
    assert_equals(axList2.childrenCount, 1);
    assert_equals(axList2.childAtIndex(0).name, "Four");
}, "Aria-owns moves an element from one part of the tree to another.");
</script>

<div class="container">
    <ul id="parent1" aria-owns="child"></ul>
    <ul id="parent2" aria-owns="child"></ul>
    <ul id="parent3">
        <li id="child">Child</li>
    </ul>
</div>

<script>
test(function(t)
{
    var axParent1 = accessibilityController.accessibleElementById("parent1");
    var axParent2 = accessibilityController.accessibleElementById("parent2");
    var axParent3 = accessibilityController.accessibleElementById("parent3");
    var axChild = accessibilityController.accessibleElementById("child");

    // Either parent1 or parent2 should own the child, but either one is okay.
    var axActualParent = axChild.parentElement();
    assert_true(axActualParent.isEqual(axParent1) || axActualParent.isEqual(axParent2));
    if (axActualParent.isEqual(axParent1)) {
        assert_equals(axParent1.childrenCount, 1);
        assert_equals(axParent1.childAtIndex(0).name, "Child");
        assert_equals(axParent2.childrenCount, 0);
    } else {
        assert_equals(axParent1.childrenCount, 0);
        assert_equals(axParent2.childrenCount, 1);
        assert_equals(axParent2.childAtIndex(0).name, "Child");
    }
    assert_equals(axParent3.childrenCount, 0);
}, "If two nodes own (using aria-owns) the same element by id, only one gets to be the owner.");
</script>

<div class="container">
    <div id="xyz" role="group">
        <div id="x" role="group" aria-owns="y"></div>
        <div id="y" role="group" aria-owns="z"></div>
        <div id="z" role="group" aria-owns="x"></div>
    </div>
</div>

<script>
test(function(t)
{
    // Make sure we can walk the whole tree.
    accessibilityController.accessibleElementById("dummy");

    // Since there's no valid resolution to the cycle of aria-owns,
    // just assert that each element's parent is either its real parent
    // or its aria-owned parent, it doesn't matter which one.
    var axXYZ = accessibilityController.accessibleElementById("xyz");
    var axX = accessibilityController.accessibleElementById("x");
    var axY = accessibilityController.accessibleElementById("y");
    var axZ = accessibilityController.accessibleElementById("z");
    assert_true(axX.parentElement().isEqual(axXYZ) ||
                axX.parentElement().isEqual(axZ));
    assert_true(axY.parentElement().isEqual(axXYZ) ||
                axY.parentElement().isEqual(axX));
    assert_true(axZ.parentElement().isEqual(axXYZ) ||
                axZ.parentElement().isEqual(axY));
}, "An aria-owns relationship that would create a cycle is ignored.");
</script>

<div class="container">
    <div id="real-parent" role="group">
        <div id="owns-self" role="group" aria-owns="owns-self"></div>
    </div>
</div>

<script>
test(function(t)
{
    var axRealParent = accessibilityController.accessibleElementById("real-parent");
    var axOwnsSelf  = accessibilityController.accessibleElementById("owns-self");

    assert_true(axOwnsSelf.parentElement().isEqual(axRealParent));
    assert_equals(axOwnsSelf.childrenCount, 0);
}, "An element can't own itself.");
</script>

<div class="container">
    <div id="yancy" role="group">
        <div id="fry" role="group" aria-owns="yancy"></div>
    </div>
</div>

<script>
test(function(t)
{
    var axYancy = accessibilityController.accessibleElementById("yancy");
    var axFry = accessibilityController.accessibleElementById("fry");

    assert_equals(axFry.childrenCount, 0);
    assert_equals(axYancy.childrenCount, 1);
    assert_true(axYancy.childAtIndex(0).isEqual(axFry));
}, "An object cannot use aria-owns to own its own parent.");
</script>

<div class="container">
    <div id="logical_parent" role="group" aria-owns="logical_1 logical_2 logical_3 logical_4">
        <div id="logical_3">3</div>
        <div id="logical_4">4</div>
        <div id="logical_2">2</div>
        <div id="logical_1">1</div>
    </div>
</div>

<script>
test(function(t)
{
    var axLogicalParent = accessibilityController.accessibleElementById("logical_parent");

    assert_equals(axLogicalParent.childrenCount, 4);
    assert_equals(axLogicalParent.childAtIndex(0).childAtIndex(0).name, "1");
    assert_equals(axLogicalParent.childAtIndex(1).childAtIndex(0).name, "2");
    assert_equals(axLogicalParent.childAtIndex(2).childAtIndex(0).name, "3");
    assert_equals(axLogicalParent.childAtIndex(3).childAtIndex(0).name, "4");
}, "A parent can use aria-owns to reorder its children into a more logical AX ordering.");
</script>

<div class="container">
    <ul id="dead_parent" aria-owns="orphan"></ul>
    <li id="orphan">Orphan</li>
</div>

<script>
test(function(t)
{
    var axDeadParent = accessibilityController.accessibleElementById(
        "dead_parent");
    assert_equals(axDeadParent.role, "AXRole: AXList");
    assert_equals(axDeadParent.childrenCount, 1);

    var axOrphan = axDeadParent.childAtIndex(0);
    assert_equals(axOrphan.role, "AXRole: AXListItem");
    assert_equals(axOrphan.parentElement().role, "AXRole: AXList");

    var deadParent = document.getElementById("dead_parent");
    deadParent.parentElement.removeChild(deadParent);

    var orphan = document.getElementById("orphan");
    orphan.setAttribute("id", "o2");
    orphan.setAttribute("id", "orphan");
}, "No crash if an aria-owns parent is deleted and the child is re-added.");
</script>

<script>
if (window.testRunner)
    document.body.className = "hideAllContainers";
</script>
