Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(712)

Unified Diff: third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp

Issue 1477043003: Handle aria-owns and presentational children in AX name calc. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@garaventa_visibility_hidden
Patch Set: Better solution to handle both aria-owns and role=presentation in name calc Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
diff --git a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
index 96bdd2579a833fc65c58ac72478832d680bde08a..36f47d6b5b19b3972c90f28efe693be5ea44ff9c 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
@@ -1474,7 +1474,7 @@ static bool isInSameNonInlineBlockFlow(LayoutObject* r1, LayoutObject* r2)
AXObject* AXNodeObject::findChildWithTagName(const HTMLQualifiedName& tagName) const
{
- for (AXObject* child = rawFirstChild(); child; child = child->rawFirstSibling()) {
+ for (AXObject* child = rawFirstChild(); child; child = child->rawNextSibling()) {
Node* childNode = child->node();
if (childNode && childNode->hasTagName(tagName))
return child;
@@ -1543,7 +1543,7 @@ String AXNodeObject::textAlternative(bool recursive, bool inAriaLabelledByTraver
else if (isHTMLBRElement(node))
textAlternative = String("\n");
else
- textAlternative = textFromDescendants(visited);
+ textAlternative = textFromDescendants(visited, false);
if (!textAlternative.isEmpty()) {
if (nameSources) {
@@ -1589,11 +1589,26 @@ String AXNodeObject::textAlternative(bool recursive, bool inAriaLabelledByTraver
return String();
}
-String AXNodeObject::textFromDescendants(AXObjectSet& visited) const
+String AXNodeObject::textFromDescendants(AXObjectSet& visited, bool recursive) const
aboxhall 2015/12/14 22:40:37 Could 'recursive' be renamed to something like 'in
dmazzoni 2015/12/14 22:51:06 This is the same as textAlternative so based on ou
{
+ if (!canHaveChildren() && recursive)
+ return String();
+
StringBuilder accumulatedText;
AXObject* previous = nullptr;
- for (AXObject* child = rawFirstChild(); child; child = child->rawFirstSibling()) {
+
+ AXObjectVector children;
+
+ HeapVector<Member<AXObject>> ownedChildren;
+ computeAriaOwnsChildren(ownedChildren);
+ for (AXObject* obj = rawFirstChild(); obj; obj = obj->rawNextSibling()) {
aboxhall 2015/12/14 22:40:37 Where else do we conflate "native" and aria-owned
dmazzoni 2015/12/14 22:51:06 Great question, I just searched the code and there
+ if (!axObjectCache().isAriaOwned(obj))
+ children.append(obj);
+ }
+ for (const auto& ownedChild : ownedChildren)
+ children.append(ownedChild);
+
+ for (AXObject* child : children) {
// Skip hidden children
if (child->isInertOrAriaHidden())
continue;
@@ -1608,7 +1623,11 @@ String AXNodeObject::textFromDescendants(AXObjectSet& visited) const
accumulatedText.append(' ');
}
- String result = recursiveTextAlternative(*child, false, visited);
+ String result;
+ if (child->isPresentational())
+ result = child->textFromDescendants(visited, true);
+ else
+ result = recursiveTextAlternative(*child, false, visited);
accumulatedText.append(result);
previous = child;
}
@@ -1745,7 +1764,7 @@ AXObject* AXNodeObject::rawFirstChild() const
return axObjectCache().getOrCreate(firstChild);
}
-AXObject* AXNodeObject::rawFirstSibling() const
+AXObject* AXNodeObject::rawNextSibling() const
{
if (!node())
return 0;
@@ -2081,7 +2100,7 @@ void AXNodeObject::updateAccessibilityRole()
childrenChanged();
}
-void AXNodeObject::computeAriaOwnsChildren(HeapVector<Member<AXObject>>& ownedChildren)
+void AXNodeObject::computeAriaOwnsChildren(HeapVector<Member<AXObject>>& ownedChildren) const
{
if (!hasAttribute(aria_ownsAttr))
return;
@@ -2606,7 +2625,7 @@ String AXNodeObject::description(AXNameFrom nameFrom, AXDescriptionFrom& descrip
}
AXObjectSet visited;
- description = textFromDescendants(visited);
+ description = textFromDescendants(visited, false);
if (!description.isEmpty()) {
if (descriptionSources) {

Powered by Google App Engine
This is Rietveld 408576698