Index: content/browser/accessibility/browser_accessibility_manager.cc |
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc |
index a6963b55e8f0fd3415368e4cfc77d40f01bd300a..84c2ec0ef056f5e4416e8332ae710f787aa7e28c 100644 |
--- a/content/browser/accessibility/browser_accessibility_manager.cc |
+++ b/content/browser/accessibility/browser_accessibility_manager.cc |
@@ -387,12 +387,18 @@ |
if (event_type == ui::AX_EVENT_FOCUS || |
event_type == ui::AX_EVENT_BLUR) { |
if (osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_HIDDEN && |
- osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_JUST_APPEARED) { |
+ osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_JUST_APPEARED) |
osk_state_ = OSK_ALLOWED; |
- } |
- |
- // We already handled all focus events above. |
- continue; |
+ |
+ bool is_menu_list_option = |
+ node->data().role == ui::AX_ROLE_MENU_LIST_OPTION; |
+ |
+ // Skip all focus events other than ones on menu list options; |
+ // we've already handled them, above. Menu list options are a weird |
+ // exception because the menu list itself has focus but we need to fire |
+ // focus events on the individual options. |
+ if (!is_menu_list_option) |
+ continue; |
} |
// Fire the native event. |
@@ -483,35 +489,19 @@ |
node); |
} |
-BrowserAccessibility* BrowserAccessibilityManager::GetActiveDescendant( |
+BrowserAccessibility* BrowserAccessibilityManager::GetActiveDescendantFocus( |
BrowserAccessibility* focus) { |
if (!focus) |
- return nullptr; |
- |
- int32_t active_descendant_id; |
- BrowserAccessibility* active_descendant = nullptr; |
+ return NULL; |
+ |
+ int active_descendant_id; |
if (focus->GetIntAttribute(ui::AX_ATTR_ACTIVEDESCENDANT_ID, |
&active_descendant_id)) { |
- active_descendant = focus->manager()->GetFromID(active_descendant_id); |
- } |
- |
- if (focus->GetRole() == ui::AX_ROLE_POP_UP_BUTTON) { |
- BrowserAccessibility* child = focus->InternalGetChild(0); |
- if (child && child->GetRole() == ui::AX_ROLE_MENU_LIST_POPUP) { |
- // The active descendant is found on the menu list popup, i.e. on the |
- // actual list and not on the button that opens it. |
- // If there is no active descendant, focus should stay on the button so |
- // that Windows screen readers would enable their virtual cursor. |
- if (child->GetIntAttribute(ui::AX_ATTR_ACTIVEDESCENDANT_ID, |
- &active_descendant_id)) { |
- active_descendant = child->manager()->GetFromID(active_descendant_id); |
- } |
- } |
- } |
- |
- if (active_descendant) |
- return active_descendant; |
- |
+ BrowserAccessibility* active_descendant = |
+ focus->manager()->GetFromID(active_descendant_id); |
+ if (active_descendant) |
+ return active_descendant; |
+ } |
return focus; |
} |
@@ -531,9 +521,6 @@ |
BrowserAccessibilityManager* focused_manager = nullptr; |
if (focused_tree_id) |
focused_manager =BrowserAccessibilityManager::FromID(focused_tree_id); |
- |
- // BrowserAccessibilityManager::FromID(focused_tree_id) may return nullptr |
- // if the tree is not created or has been destroyed. |
if (!focused_manager) |
focused_manager = root_manager; |