<!DOCTYPE HTML>
<html>
<body>
<script src="../resources/js-test.js"></script>

<div id="container">

  <div>
    <label id="label1" for="control1">Label 1</label>
    <input id="control1" type="text">
  </div>

  <div>
    <label id="label2">
      Label 2
      <input id="control2" type="text">
    </label>
  </div>

  <div>
    <label id="label3">Label 3</label>
    <input id="control3" type="text">
  </div>

  <div>
    <input id="control4" type="text">
  </div>

  <div>
    <label id="label5">
      Label 5
    </label>
    <input id="control5" type="text">
  </div>

  <div>
    <label id="label6b" for="control6">Label 6b</label>
    <label id="label6c" for="control6">Label 6c</label>
    <input id="control6" type="text">
  </div>
</div>

<div id="console"></div>
<script>
description("This tests that titleUIElement works correctly even when things change dynamically.");

if (window.testRunner && window.accessibilityController) {
    testRunner.dumpAsText();

    function hasTitleUIElement(axElement) {
        var label1 = accessibilityController.accessibleElementById("label1");
        var titleUIElement = axElement.nameElementAtIndex(0);
        if (titleUIElement == null)
            return false;
        return titleUIElement.role == label1.role;
    }

    function createLabelWithIdAndForAttribute(id, forAttributeValue) {
        var labelElement = document.createElement("label");
        labelElement.id = id;
        labelElement.setAttribute("for", forAttributeValue);
        labelElement.innerText = "Label for " + forAttributeValue;
        return labelElement;
    }

    function reparentNodeIntoContainer(node, container) {
        node.parentElement.removeChild(node);
        container.appendChild(node);
    }

    function axElement(id) {
        return accessibilityController.accessibleElementById(id);
    }

    shouldBe("axElement('control1').nameElementAtIndex(0).isEqual(axElement('label1'))", "true");

    shouldBe("axElement('control2').nameElementAtIndex(0).isEqual(axElement('label2'))", "true");

    // Test changing the "for" attribute dynamically.
    shouldBe("hasTitleUIElement(axElement('control3'))", "false");
    shouldBe("document.getElementById('label3').setAttribute('for', 'control3'); axElement('control3').nameElementAtIndex(0).isEqual(axElement('label3'))", "true");

    // Test unattached label element that's subsequently attached.
    var label4Element = document.createElement("label");
    label4Element.id = "label4";
    label4Element.setAttribute("for", "control4");
    label4Element.innerText = "Label 4";
    shouldBe("var label4Element = createLabelWithIdAndForAttribute('label4', 'control4'); hasTitleUIElement(axElement('control4'))", "false");
    shouldBe("document.getElementById('container').appendChild(label4Element); hasTitleUIElement(axElement('control4'))", "true");
    shouldBe("axElement('control4').nameElementAtIndex(0).isEqual(axElement('label4'))", "true");

    // Test what happens when the label is detached.
    shouldBe("label4Element.parentElement.removeChild(label4Element); hasTitleUIElement(axElement('control4'))", "false");

    // Test label that gets a control reparented into it.
    shouldBe("hasTitleUIElement(axElement('control5'))", "false");

    shouldBe("reparentNodeIntoContainer(document.getElementById('control5'), document.getElementById('label5')); axElement('control5').nameElementAtIndex(0) != null", "true");
    shouldBe("axElement('control5').nameElementAtIndex(0).isEqual(axElement('label5'))", "true");

    // Make sure the first label is returned, even as labels are added and removed.
    shouldBe("axElement('control6').nameElementAtIndex(0).isEqual(axElement('label6b'))", "true");
    shouldBe("newLabel6Element = createLabelWithIdAndForAttribute('label6a', 'control6'); document.body.insertBefore(newLabel6Element, document.body.firstChild); axElement('control6').nameElementAtIndex(0).isEqual(axElement('label6a'))", "true");
    shouldBe("document.body.removeChild(newLabel6Element); axElement('control6').nameElementAtIndex(0).isEqual(axElement('label6b'))", "true");

    document.getElementById('container').style.display = 'none';
}

</script>

</body>
</html>
