<!DOCTYPE html>
<html>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<!--
First, we build the following AXTree:
AXObject, role="alert", DOM
++AXObject, role="checkbox", DOM
++AXVirtualObject, role="button", AccessibleNode
++++AXVirtualObject, role="radio", AccessibleNode
Then, we remove |AXObject, role="checkbox"| to trigger childrenChanged on
|AXObject, role="alert"| which will detach all its children. We then access
|AXVirtualObject, role="radio"| which will attempt to recompute its parent
chain. We should end up with the following AXTree:
AXObject, role="alert", DOM
++AXVirtualObject, role="button", AccessibleNode
++++AXVirtualObject, role="radio", AccessibleNode
-->
<div id="main" role="alert">
<div role="checkbox" id="checkbox">checkbox</div>
</div>
<script>
test(function() {
var main = document.getElementById("main");
var checkbox = document.getElementById("checkbox");
var button_accNode = new AccessibleNode();
button_accNode.role = "button";
var radio_accNode = new AccessibleNode();
radio_accNode.role = "radio";
main.accessibleNode.appendChild(button_accNode);
button_accNode.appendChild(radio_accNode);
var axMain = accessibilityController.accessibleElementById("main");
assert_equals(axMain.role, "AXRole: AXAlert");
assert_equals(axMain.childrenCount, 2);
var axButton = axMain.childAtIndex(1);
assert_equals(axButton.role, "AXRole: AXButton");
var axRadio = axButton.childAtIndex(0);
assert_equals(axRadio.role, "AXRole: AXRadioButton");
// Remove checkbox will cause ChildrenChanged called on axMain, which will
// remove all its children in the AXObjectCache.
checkbox.remove();
assert_equals(axMain.childrenCount, 1);
axButton = axMain.childAtIndex(0);
assert_equals(axButton.role, "AXRole: AXButton");
// Try to fetch axRadio, since its detached from its parent axMain, we need
// to recompute its parent. Make sure no DCHECK or crash occurs.
axRadio = axButton.childAtIndex(0);
assert_equals(axRadio.role, "AXRole: AXRadioButton");
// Walk up axRadio's parent chain to validate we have correctly reparented
// detached nodes.
axButton = axRadio.parentElement();
assert_equals(axButton.role, "AXRole: AXButton");
axMain = axButton.parentElement();
assert_equals(axMain.role, "AXRole: AXAlert");
// Validate that axMain's parent is the body element.
assert_equals(axMain.parentElement().role, "AXRole: AXGenericContainer");
});
</script>
</body>
</html>