Bug 1286598 - make sure an accessible tree is updated on DOM tree removals, r=yzen

This commit is contained in:
Alexander Surkov 2016-07-20 09:40:55 -04:00
Родитель 97d3593afc
Коммит 499efe0f10
3 изменённых файлов: 163 добавлений и 3 удалений

Просмотреть файл

@ -1130,10 +1130,26 @@ DocAccessible::ContentInserted(nsIDocument* aDocument, nsIContent* aContainer,
}
void
DocAccessible::ContentRemoved(nsIDocument* aDocument, nsIContent* aContainer,
nsIContent* aChild, int32_t /* unused */,
nsIContent* aPreviousSibling)
DocAccessible::ContentRemoved(nsIDocument* aDocument,
nsIContent* aContainerNode,
nsIContent* aChildNode, int32_t /* unused */,
nsIContent* aPreviousSiblingNode)
{
#ifdef A11Y_LOG
if (logging::IsEnabled(logging::eTree)) {
logging::MsgBegin("TREE", "DOM content removed; doc: %p", this);
logging::Node("container node", aContainerNode);
logging::Node("content node", aChildNode);
logging::MsgEnd();
}
#endif
// This one and content removal notification from layout may result in
// double processing of same subtrees. If it pops up in profiling, then
// consider reusing a document node cache to reject these notifications early.
Accessible* container = GetAccessibleOrContainer(aContainerNode);
if (container) {
UpdateTreeOnRemoval(container, aChildNode);
}
}
void

Просмотреть файл

@ -14,6 +14,7 @@ support-files =
[test_bug1100602.html]
[test_bug1175913.html]
[test_bug1189277.html]
[test_bug1276857.html]
[test_canvas.html]
[test_colorpicker.xul]
[test_contextmenu.xul]

Просмотреть файл

@ -0,0 +1,143 @@
<!DOCTYPE html>
<html>
<head>
<title>DOM mutations test</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 type="application/javascript"
src="../events.js"></script>
<script type="application/javascript">
function runTest()
{
// children change will recreate the table
this.eventSeq = [
new invokerChecker(EVENT_REORDER, getNode('c1'))
];
this.invoke = function runTest_invoke() {
var tree = {
SECTION: [ // c1
{ TEXT_LEAF: [] }, // Some text
{ TEXT_CONTAINER: [
{ TEXT_LEAF: [] } // something with ..
] },
{ TEXT_LEAF: [] } // More text
]
};
testAccessibleTree('c1', tree);
getNode('c1_t').querySelector('span').remove();
};
this.finalCheck = function runTest_finalCheck() {
var tree = {
SECTION: [ // c1
{ TEXT_LEAF: [] }, // Some text
{ TEXT_LEAF: [] } // More text
]
};
testAccessibleTree('c1', tree);
};
this.getID = function runTest_getID()
{
return 'child DOM node is removed before the layout notifies the a11y about parent removal/show';
};
}
function runShadowTest()
{
// children change will recreate the table
this.eventSeq = [
new invokerChecker(EVENT_REORDER, 'c2')
];
this.invoke = function runShadowTest_invoke() {
var tree = {
SECTION: [ // c2
{ TEXT_LEAF: [] }, // Some text
{ TEXT_CONTAINER: [
{ TEXT_LEAF: [] } // something with ..
] },
{ TEXT_LEAF: [] } // More text
]
};
testAccessibleTree('c2', tree);
gShadowRoot.firstElementChild.querySelector('span').remove();
};
this.finalCheck = function runShadowTest_finalCheck() {
var tree = {
SECTION: [ // c2
{ TEXT_LEAF: [] }, // Some text
{ TEXT_LEAF: [] } // More text
]
};
testAccessibleTree('c2', tree);
};
this.getID = function runShadowTest_getID() {
return 'child DOM node is removed before the layout notifies the a11y about parent removal/show in shadow DOM';
};
}
//enableLogging("tree");
//gA11yEventDumpToConsole = true;
var gQueue = null;
function doTest()
{
gQueue = new eventQueue();
gQueue.push(new runTest());
gQueue.push(new runShadowTest());
gQueue.invoke(); // will call SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addA11yLoadEvent(doTest);
</script>
</head>
<body>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
</pre>
<div id="c1">
<div id="c1_t" style="display: table" role="presentation">
Some text
<span style="display: table-cell">something with accessibles goes here</span>
More text
</div>
</div>
<template id="tmpl">
<div style="display: table" role="presentation">
Some text
<span style="display: table-cell">something with accessibles goes here</span>
More text
</div>
</template>
<div id="c2"><div id="c2_c" role="presentation"></div></div>
<script>
var gShadowRoot = document.getElementById('c2_c').createShadowRoot();
var tmpl = document.getElementById('tmpl');
gShadowRoot.appendChild(document.importNode(tmpl.content, true));
</script>
</body>
</html>