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

Unified Diff: ui/views/accessibility/native_view_accessibility.cc

Issue 2119413004: a11y: Exclude children of nested keyboard accessible controls from a11y tree. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments. Created 4 years, 1 month 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: ui/views/accessibility/native_view_accessibility.cc
diff --git a/ui/views/accessibility/native_view_accessibility.cc b/ui/views/accessibility/native_view_accessibility.cc
index 7c960348478b020d7b0bfeed5adf0f50f45e5d70..098b04b860832a0ea07ed09cc4a4d4edca8c46bb 100644
--- a/ui/views/accessibility/native_view_accessibility.cc
+++ b/ui/views/accessibility/native_view_accessibility.cc
@@ -13,6 +13,25 @@
namespace views {
+#if defined(OS_MACOSX)
+namespace {
+
+bool IsAccessibilityFocusableWhenEnabled(View* view) {
+ return view->focus_behavior() != View::FocusBehavior::NEVER &&
+ view->IsDrawn();
+}
+
+bool ViewHasFocusableAncestor(View* view) {
+ while ((view = view->parent())) {
+ if (IsAccessibilityFocusableWhenEnabled(view))
+ return true;
+ }
+ return false;
+}
+
+} // namespace
+#endif
+
#if !defined(PLATFORM_HAS_NATIVE_VIEW_ACCESSIBILITY_IMPL)
// static
NativeViewAccessibility* NativeViewAccessibility::Create(View* view) {
@@ -80,13 +99,22 @@ const ui::AXNodeData& NativeViewAccessibility::GetData() {
base::UTF16ToUTF8(description));
if (view_->IsAccessibilityFocusable())
- data_.state |= (1 << ui::AX_STATE_FOCUSABLE);
+ data_.AddStateFlag(ui::AX_STATE_FOCUSABLE);
if (!view_->enabled())
- data_.state |= (1 << ui::AX_STATE_DISABLED);
+ data_.AddStateFlag(ui::AX_STATE_DISABLED);
if (!view_->visible())
- data_.state |= (1 << ui::AX_STATE_INVISIBLE);
+ data_.AddStateFlag(ui::AX_STATE_INVISIBLE);
+
+#if defined(OS_MACOSX)
dmazzoni 2016/11/30 23:12:44 I'd prefer to find a solution that works for all p
Patti Lor 2016/12/01 01:12:07 See next comment.
+ // Make sure this element is ignored if there's a focusable parent. All
+ // keyboard focusable elements should be leaf nodes in the accessibility tree.
+ // Exceptions to this rule will themselves be accessibility focusable.
+ if (!IsAccessibilityFocusableWhenEnabled(view_) &&
+ ViewHasFocusableAncestor(view_))
+ data_.role = ui::AX_ROLE_UNKNOWN;
dmazzoni 2016/11/30 23:12:44 Rather than setting the role to unknown, what if w
Patti Lor 2016/12/01 01:12:07 Yes - this was my approach in patchset 8. Removing
+#endif
return data_;
}
@@ -140,7 +168,7 @@ gfx::NativeViewAccessible NativeViewAccessibility::GetParent() {
}
gfx::Vector2d NativeViewAccessibility::GetGlobalCoordinateOffset() {
- return gfx::Vector2d(0, 0); // location is already in screen coordinates.
+ return gfx::Vector2d(0, 0); // Location is already in screen coordinates.
}
gfx::NativeViewAccessible NativeViewAccessibility::HitTestSync(int x, int y) {
@@ -163,9 +191,9 @@ gfx::NativeViewAccessible NativeViewAccessibility::HitTestSync(int x, int y) {
if (!view_->HitTestPoint(point))
return nullptr;
- // Check if the point is within any of the immediate children of this
- // view. We don't have to search further because AXPlatformNode will
- // do a recursive hit test if we return anything other than |this| or NULL.
+ // Check if the point is within any of the immediate children of this view. We
+ // don't have to search further because AXPlatformNodeWin will do a recursive
dmazzoni 2016/11/30 23:12:44 Is this specific only to AXPlatformNodeWin?
Patti Lor 2016/12/01 01:12:07 Yes, AFAICT, HitTestSync is only used for Windows
+ // hit test if we return anything other than GetNativeObject() or nullptr.
for (int i = view_->child_count() - 1; i >= 0; --i) {
View* child_view = view_->child_at(i);
if (!child_view->visible())

Powered by Google App Engine
This is Rietveld 408576698