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

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

Issue 1939303002: Enable accessible name of a control to include multiple <label> elements. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Don't modify visited set when computing aria-labelledby Created 4 years, 6 months 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 4ee9228e6fad4586fd15b2573edf91227fc9e4ff..f65f6070890e62a03c70356fe5823a0d01b0f8f0 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
@@ -52,6 +52,7 @@
#include "core/html/HTMLTableRowElement.h"
#include "core/html/HTMLTableSectionElement.h"
#include "core/html/HTMLTextAreaElement.h"
+#include "core/html/LabelsNodeList.h"
#include "core/html/parser/HTMLParserIdioms.h"
#include "core/html/shadow/MediaControlElements.h"
#include "core/layout/LayoutBlockFlow.h"
@@ -645,24 +646,6 @@ bool AXNodeObject::isGenericFocusableElement() const
return true;
}
-HTMLLabelElement* AXNodeObject::labelForElement(const Element* element) const
-{
- if (!element->isHTMLElement() || !toHTMLElement(element)->isLabelable())
- return 0;
-
- const AtomicString& id = element->getIdAttribute();
- if (!id.isEmpty()) {
- if (HTMLLabelElement* labelFor = element->treeScope().labelElementForId(id))
- return labelFor;
- }
-
- HTMLLabelElement* labelWrappedElement = Traversal<HTMLLabelElement>::firstAncestor(*element);
- if (labelWrappedElement && labelWrappedElement->control() == toLabelableElement(element))
- return labelWrappedElement;
-
- return 0;
-}
-
AXObject* AXNodeObject::menuButtonForMenu() const
{
Element* menuItem = menuItemElementForMenu();
@@ -1669,7 +1652,7 @@ String AXNodeObject::textAlternative(bool recursive, bool inAriaLabelledByTraver
nameFrom = AXNameFromUninitialized;
- if (foundTextAlternative) {
+ if (nameSources && foundTextAlternative) {
for (size_t i = 0; i < nameSources->size(); ++i) {
if (!(*nameSources)[i].text.isNull() && !(*nameSources)[i].superseded) {
NameSource& nameSource = (*nameSources)[i];
@@ -1763,9 +1746,8 @@ bool AXNodeObject::nameFromLabelElement() const
HTMLElement* htmlElement = nullptr;
if (getNode()->isHTMLElement())
htmlElement = toHTMLElement(getNode());
- if (htmlElement && htmlElement->isLabelable()) {
- HTMLLabelElement* label = labelForElement(htmlElement);
- if (label)
+ if (htmlElement && isLabelableElement(htmlElement)) {
+ if (toLabelableElement(htmlElement)->labels() && toLabelableElement(htmlElement)->labels()->length() > 0)
return true;
}
@@ -2232,39 +2214,41 @@ String AXNodeObject::nativeTextAlternative(AXObjectSet& visited, AXNameFrom& nam
HTMLElement* htmlElement = nullptr;
if (getNode()->isHTMLElement())
htmlElement = toHTMLElement(getNode());
+
if (htmlElement && htmlElement->isLabelable()) {
- // label
nameFrom = AXNameFromRelatedElement;
if (nameSources) {
nameSources->append(NameSource(*foundTextAlternative));
nameSources->last().type = nameFrom;
nameSources->last().nativeSource = AXTextFromNativeHTMLLabel;
}
- HTMLLabelElement* label = labelForElement(htmlElement);
- if (label) {
- AXObject* labelAXObject = axObjectCache().getOrCreate(label);
- // Avoid an infinite loop for label wrapped
- if (labelAXObject && !visited.contains(labelAXObject)) {
- textAlternative = recursiveTextAlternative(*labelAXObject, false, visited);
- if (relatedObjects) {
- localRelatedObjects.append(new NameSourceRelatedObject(labelAXObject, textAlternative));
- *relatedObjects = localRelatedObjects;
- localRelatedObjects.clear();
+ LabelsNodeList* labels = toLabelableElement(htmlElement)->labels();
+ if (labels && labels->length() > 0) {
+ HeapVector<Member<Element>> labelElements;
+ for (unsigned labelIndex = 0; labelIndex < labels->length(); ++labelIndex) {
+ Element* label = labels->item(labelIndex);
+ if (nameSources) {
+ if (label->getAttribute(forAttr) == htmlElement->getIdAttribute())
+ nameSources->last().nativeSource = AXTextFromNativeHTMLLabelFor;
+ else
+ nameSources->last().nativeSource = AXTextFromNativeHTMLLabelWrapped;
}
+ labelElements.append(label);
+ }
+ textAlternative = textFromElements(false, visited, labelElements, relatedObjects);
+ if (!textAlternative.isNull()) {
+ *foundTextAlternative = true;
if (nameSources) {
NameSource& source = nameSources->last();
source.relatedObjects = *relatedObjects;
source.text = textAlternative;
- if (label->getAttribute(forAttr) == htmlElement->getIdAttribute())
- source.nativeSource = AXTextFromNativeHTMLLabelFor;
- else
- source.nativeSource = AXTextFromNativeHTMLLabelWrapped;
- *foundTextAlternative = true;
} else {
return textAlternative;
}
+ } else if (nameSources) {
+ nameSources->last().invalid = true;
}
}
}

Powered by Google App Engine
This is Rietveld 408576698