зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1286598 - make sure an accessible tree is updated on DOM tree removals, r=yzen
This commit is contained in:
Родитель
97d3593afc
Коммит
499efe0f10
|
@ -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>
|
Загрузка…
Ссылка в новой задаче