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

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

Issue 1012383002: Removes direct checking node on AXLayoutObject::determineAccessibilityRole. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Update nits Created 5 years, 8 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
« no previous file with comments | « Source/modules/accessibility/AXNodeObject.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/modules/accessibility/AXNodeObject.cpp
diff --git a/Source/modules/accessibility/AXNodeObject.cpp b/Source/modules/accessibility/AXNodeObject.cpp
index c9294b0ff1f2039b98b16582f4c5c83e50ccc39a..1fa16411ed7d52a077007f1f04ca976a7f09c867 100644
--- a/Source/modules/accessibility/AXNodeObject.cpp
+++ b/Source/modules/accessibility/AXNodeObject.cpp
@@ -271,16 +271,33 @@ bool AXNodeObject::computeHasInheritedPresentationalRole() const
return isRequiredOwnedElement(parent, roleValue(), curNode);
}
+bool AXNodeObject::isDescendantOfElementType(const HTMLQualifiedName& tagName) const
+{
+ if (!node())
+ return false;
+
+ for (Element* parent = node()->parentElement(); parent; parent = parent->parentElement()) {
+ if (parent->hasTagName(tagName))
+ return true;
+ }
+ return false;
+}
+
AccessibilityRole AXNodeObject::determineAccessibilityRoleUtil()
{
if (!node())
return UnknownRole;
- if (node()->isLink())
+ // HTMLAnchorElement sets isLink only when it has hrefAttr.
+ // We assume that it is also LinkRole if it has event listners even though it doesn't have hrefAttr.
+ if (node()->isLink() || (isHTMLAnchorElement(*node()) && isClickable()))
return LinkRole;
+
if (isHTMLButtonElement(*node()))
return buttonRoleType();
+
if (isHTMLDetailsElement(*node()))
return DetailsRole;
+
if (isHTMLSummaryElement(*node())) {
if (node()->parentNode() && isHTMLDetailsElement(node()->parentNode()))
return DisclosureTriangleRole;
@@ -328,42 +345,115 @@ AccessibilityRole AXNodeObject::determineAccessibilityRoleUtil()
return TimeRole;
return TextFieldRole;
}
+
if (isHTMLSelectElement(*node())) {
HTMLSelectElement& selectElement = toHTMLSelectElement(*node());
return selectElement.multiple() ? ListBoxRole : PopUpButtonRole;
}
+
if (isHTMLTextAreaElement(*node()))
return TextFieldRole;
+
if (headingLevel())
return HeadingRole;
+
if (isHTMLDivElement(*node()))
return DivRole;
+
if (isHTMLMeterElement(*node()))
return MeterRole;
+
if (isHTMLOutputElement(*node()))
return StatusRole;
+
if (isHTMLParagraphElement(*node()))
return ParagraphRole;
+
if (isHTMLLabelElement(*node()))
return LabelRole;
+
+ if (isHTMLLegendElement(*node()))
+ return LegendRole;
+
if (isHTMLRubyElement(*node()))
return RubyRole;
+
if (isHTMLDListElement(*node()))
return DescriptionListRole;
- if (node()->isElementNode() && node()->hasTagName(blockquoteTag))
+
+ if (node()->hasTagName(ddTag))
+ return DescriptionListDetailRole;
+
+ if (node()->hasTagName(dtTag))
+ return DescriptionListTermRole;
+
+ if (node()->nodeName() == "math")
+ return MathRole;
+
+ if (node()->hasTagName(rpTag) || node()->hasTagName(rtTag))
+ return AnnotationRole;
+
+ if (isHTMLFormElement(*node()))
+ return FormRole;
+
+ if (node()->hasTagName(articleTag))
+ return ArticleRole;
+
+ if (node()->hasTagName(mainTag))
+ return MainRole;
+
+ if (node()->hasTagName(navTag))
+ return NavigationRole;
+
+ if (node()->hasTagName(asideTag))
+ return ComplementaryRole;
+
+ if (node()->hasTagName(preTag))
+ return PreRole;
+
+ if (node()->hasTagName(sectionTag))
+ return RegionRole;
+
+ if (node()->hasTagName(addressTag))
+ return ContentInfoRole;
+
+ if (isHTMLDialogElement(*node()))
+ return DialogRole;
+
+ // The HTML element should not be exposed as an element. That's what the LayoutView element does.
+ if (isHTMLHtmlElement(*node()))
+ return IgnoredRole;
+
+ if (isHTMLIFrameElement(*node())) {
+ const AtomicString& ariaRole = getAttribute(roleAttr);
+ if (ariaRole == "none" || ariaRole == "presentation")
+ return IframePresentationalRole;
+ return IframeRole;
+ }
+
+ // There should only be one banner/contentInfo per page. If header/footer are being used within an article or section
+ // then it should not be exposed as whole page's banner/contentInfo
+ if (node()->hasTagName(headerTag) && !isDescendantOfElementType(articleTag) && !isDescendantOfElementType(sectionTag))
+ return BannerRole;
+
+ if (node()->hasTagName(footerTag) && !isDescendantOfElementType(articleTag) && !isDescendantOfElementType(sectionTag))
+ return FooterRole;
+
+ if (node()->hasTagName(blockquoteTag))
return BlockquoteRole;
- if (node()->isElementNode() && node()->hasTagName(captionTag))
+
+ if (node()->hasTagName(captionTag))
return CaptionRole;
- if (node()->isElementNode() && node()->hasTagName(figcaptionTag))
+
+ if (node()->hasTagName(figcaptionTag))
return FigcaptionRole;
- if (node()->isElementNode() && node()->hasTagName(figureTag))
+
+ if (node()->hasTagName(figureTag))
return FigureRole;
- if (isHTMLAnchorElement(*node()) && isClickable())
- return LinkRole;
- if (isHTMLIFrameElement(*node()))
- return IframeRole;
+
if (isEmbeddedObject())
return EmbeddedObjectRole;
+
return UnknownRole;
}
« no previous file with comments | « Source/modules/accessibility/AXNodeObject.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698