Index: content/browser/accessibility/browser_accessibility_manager_mac.mm |
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm |
index 1361164af50e99f5959471dad1462b147ec576d6..8f6b21854c5f35cdc3c91512b94f533cdbd21275 100644 |
--- a/content/browser/accessibility/browser_accessibility_manager_mac.mm |
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm |
@@ -44,8 +44,14 @@ ui::AXTreeUpdate BrowserAccessibilityManagerMac::GetEmptyDocument() { |
BrowserAccessibility* BrowserAccessibilityManagerMac::GetFocus( |
BrowserAccessibility* root) { |
- BrowserAccessibility* node = GetActiveDescendantFocus(root); |
- return node; |
+ // On Mac, list boxes should always get focus on the whole list, otherwise |
+ // information about the number of selected items will never be reported. |
+ BrowserAccessibility* node = BrowserAccessibilityManager::GetFocus(root); |
+ if (node && node->GetRole() == ui::AX_ROLE_LIST_BOX) |
+ return node; |
+ |
+ // For other roles, follow the active descendant. |
+ return GetActiveDescendantFocus(root); |
} |
void BrowserAccessibilityManagerMac::NotifyAccessibilityEvent( |
@@ -54,6 +60,15 @@ void BrowserAccessibilityManagerMac::NotifyAccessibilityEvent( |
if (!node->IsNative()) |
return; |
+ if (event_type == ui::AX_EVENT_FOCUS && |
+ node->GetRole() == ui::AX_ROLE_LIST_BOX_OPTION && |
+ node->HasState(ui::AX_STATE_SELECTED) && |
+ node->GetParent() && |
+ node->GetParent()->GetRole() == ui::AX_ROLE_LIST_BOX) { |
+ node = node->GetParent(); |
+ SetFocus(node, false); |
+ } |
+ |
// Refer to AXObjectCache.mm (webkit). |
NSString* event_id = @""; |
switch (event_type) { |
@@ -139,6 +154,7 @@ void BrowserAccessibilityManagerMac::NotifyAccessibilityEvent( |
LOG(WARNING) << "Unknown accessibility event: " << event_type; |
return; |
} |
+ |
BrowserAccessibilityCocoa* native_node = node->ToBrowserAccessibilityCocoa(); |
DCHECK(native_node); |
NSAccessibilityPostNotification(native_node, event_id); |