bug 852150 - handle removal of accessibles when reframe root doesn't have an accessible more correctly r=surkov

This commit is contained in:
Trevor Saunders 2013-03-25 19:46:22 -04:00
parent f6274d24c5
commit 5c16f8ec62
3 changed files with 86 additions and 3 deletions

View File

@ -1739,10 +1739,33 @@ DocAccessible::UpdateTree(Accessible* aContainer, nsIContent* aChildNode,
if (child) {
updateFlags |= UpdateTreeInternal(child, aIsInsert, reorderEvent);
} else {
TreeWalker walker(aContainer, aChildNode, true);
if (aIsInsert) {
TreeWalker walker(aContainer, aChildNode, true);
while ((child = walker.NextChild()))
updateFlags |= UpdateTreeInternal(child, aIsInsert, reorderEvent);
while ((child = walker.NextChild()))
updateFlags |= UpdateTreeInternal(child, aIsInsert, reorderEvent);
} else {
// aChildNode may not coorespond to a particular accessible, to handle
// this we go through all the children of aContainer. Then if a child
// has aChildNode as an ancestor, or does not have the node for
// aContainer as an ancestor remove that child of aContainer. Note that
// when we are called aChildNode may already have been removed
// from the DOM so we can't expect it to have a parent or what was it's
// parent to have it as a child.
nsINode* containerNode = aContainer->GetNode();
for (uint32_t idx = 0; idx < aContainer->ContentChildCount();) {
Accessible* child = aContainer->ContentChildAt(idx);
nsINode* childNode = child->GetContent();
while (childNode != aChildNode && childNode != containerNode &&
(childNode = childNode->GetParentNode()));
if (childNode != containerNode) {
updateFlags |= UpdateTreeInternal(child, false, reorderEvent);
} else {
idx++;
}
}
}
}
// Content insertion/removal is not cause of accessible tree change.

View File

@ -30,6 +30,7 @@ MOCHITEST_A11Y_FILES =\
test_optgroup.html \
test_recreation.html \
test_select.html \
test_bug852150.xhtml \
test_textleaf.html \
test_visibility.html \
test_whitespace.html \

View File

@ -0,0 +1,59 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Canvas subdom mutation</title>
<link rel="stylesheet" type="text/css"
href="chrome://mochikit/content/tests/SimpleTest/test.css" />
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript"
src="../common.js"></script>
<script type="application/javascript"
src="../role.js"></script>
<script>
<![CDATA[
function doTest()
{
var the_displayNone = getNode("the_displaynone");
var the_table = getNode("the_table");
var the_row = getNode("the_row");
ok(isAccessible(the_table), "table should be accessible");
the_displayNone.appendChild(the_table);
ok(!isAccessible(the_table), "table in display none tree shouldn't be accessible");
setTimeout(function() {
document.body.removeChild(the_row);
// make sure no accessibles have stuck around.
ok(!isAccessible(the_row), "row shouldn't be accessible");
ok(!isAccessible(the_table), "table shouldn't be accessible");
ok(!isAccessible(the_displayNone), "display none things shouldn't be accessible");
SimpleTest.finish();
}, 0);
}
SimpleTest.waitForExplicitFinish();
addA11yLoadEvent(doTest);
]]>
</script>
</head>
<body>
<a target="_blank"
title="test accessible removal when reframe root isn't accessible"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=852150">
Mozilla Bug 852150
</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
</pre>
<div id="the_displaynone" style="display: none;"></div>
<table id="the_table"></table>
<tr id="the_row"></tr>
</body>
</html>