Bug 1427825: Make accessibility use the flattened tree more consistently. r?surkov
MozReview-Commit-ID: 4mFkvqheZOK
--- a/accessible/base/NotificationController.cpp
+++ b/accessible/base/NotificationController.cpp
@@ -675,19 +675,18 @@ NotificationController::WillRefresh(mozi
for (auto iter = mTextHash.Iter(); !iter.Done(); iter.Next()) {
nsCOMPtrHashKey<nsIContent>* entry = iter.Get();
nsIContent* textNode = entry->GetKey();
Accessible* textAcc = mDocument->GetAccessible(textNode);
// If the text node is not in tree or doesn't have a frame, or placed in
// another document, then this case should have been handled already by
// content removal notifications.
- nsINode* containerNode = textNode->GetParentNode();
- if (!containerNode ||
- textNode->GetOwnerDocument() != mDocument->DocumentNode()) {
+ nsINode* containerNode = textNode->GetFlattenedTreeParentNode();
+ if (!containerNode || textNode->OwnerDoc() != mDocument->DocumentNode()) {
MOZ_ASSERT(!textAcc,
"Text node was removed but accessible is kept alive!");
continue;
}
nsIFrame* textFrame = textNode->GetPrimaryFrame();
if (!textFrame) {
MOZ_ASSERT(!textAcc,
--- a/accessible/generic/DocAccessible.cpp
+++ b/accessible/generic/DocAccessible.cpp
@@ -1246,36 +1246,24 @@ DocAccessible::GetAccessibleByUniqueIDIn
}
Accessible*
DocAccessible::GetAccessibleOrContainer(nsINode* aNode) const
{
if (!aNode || !aNode->GetComposedDoc())
return nullptr;
- nsINode* currNode = aNode;
- Accessible* accessible = nullptr;
- while (!(accessible = GetAccessible(currNode))) {
- nsINode* parent = nullptr;
-
- // If this is a content node, try to get a flattened parent content node.
- // This will smartly skip from the shadow root to the host element,
- // over parentless document fragment
- if (currNode->IsContent())
- parent = currNode->AsContent()->GetFlattenedTreeParent();
-
- // Fallback to just get parent node, in case there is no parent content
- // node. Or current node is not a content node.
- if (!parent)
- parent = currNode->GetParentNode();
-
- if (!(currNode = parent)) break;
+ for (nsINode* currNode = aNode; currNode;
+ currNode = currNode->GetFlattenedTreeParentNode()) {
+ if (Accessible* accessible = GetAccessible(currNode)) {
+ return accessible;
+ }
}
- return accessible;
+ return nullptr;
}
Accessible*
DocAccessible::GetAccessibleOrDescendant(nsINode* aNode) const
{
Accessible* acc = GetAccessible(aNode);
if (acc)
return acc;
@@ -2211,17 +2199,18 @@ DocAccessible::PutChildrenBack(nsTArray<
"old parent", owner, "child", child, nullptr);
#endif
// Unset relocated flag to find an insertion point for the child.
child->SetRelocated(false);
nsIContent* content = child->GetContent();
int32_t idxInParent = -1;
- Accessible* origContainer = AccessibleOrTrueContainer(content->GetParentNode());
+ Accessible* origContainer =
+ AccessibleOrTrueContainer(content->GetFlattenedTreeParentNode());
if (origContainer) {
TreeWalker walker(origContainer);
if (walker.Seek(content)) {
Accessible* prevChild = walker.Prev();
if (prevChild) {
idxInParent = prevChild->IndexInParent() + 1;
MOZ_DIAGNOSTIC_ASSERT(origContainer == prevChild->Parent(), "Broken tree");
origContainer = prevChild->Parent();