Index: content/browser/accessibility/browser_accessibility_win.cc |
diff --git a/content/browser/accessibility/browser_accessibility_win.cc b/content/browser/accessibility/browser_accessibility_win.cc |
index 5c318b29e1c7de1041fc3a12a90404645cc80052..fc566807d1ef290ee834661b88c08895c1aa4827 100644 |
--- a/content/browser/accessibility/browser_accessibility_win.cc |
+++ b/content/browser/accessibility/browser_accessibility_win.cc |
@@ -903,9 +903,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_groupPosition( |
if (!group_level || !similar_items_in_group || !position_in_group) |
return E_INVALIDARG; |
- if (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION && |
- GetParent() && |
- GetParent()->GetRole() == ui::AX_ROLE_LIST_BOX) { |
+ if (IsListBoxOptionOrMenuListOption()) { |
*group_level = 0; |
*similar_items_in_group = GetParent()->PlatformChildCount(); |
*position_in_group = GetIndexInParent() + 1; |
@@ -2996,13 +2994,13 @@ void BrowserAccessibilityWin::UpdateStep1ComputeWinAttributes() { |
IntAttributeToIA2(ui::AX_ATTR_HIERARCHICAL_LEVEL, "level"); |
// Expose the set size and position in set for listbox options. |
- if (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION && |
- GetParent() && |
- GetParent()->GetRole() == ui::AX_ROLE_LIST_BOX) { |
+ if (IsListBoxOptionOrMenuListOption()) { |
win_attributes_->ia2_attributes.push_back( |
L"setsize:" + base::IntToString16(GetParent()->PlatformChildCount())); |
win_attributes_->ia2_attributes.push_back( |
- L"setsize:" + base::IntToString16(GetIndexInParent() + 1)); |
+ L"posinset:" + base::IntToString16(GetIndexInParent() + 1)); |
+ win_attributes_->ia2_attributes.push_back( |
+ L"tag:option"); |
} |
if (ia_role() == ROLE_SYSTEM_CHECKBUTTON || |
@@ -3184,9 +3182,9 @@ void BrowserAccessibilityWin::UpdateStep1ComputeWinAttributes() { |
// WebKit stores the main accessible text in the "value" - swap it so |
// that it's the "name". |
if (name.empty() && |
- (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION || |
- GetRole() == ui::AX_ROLE_STATIC_TEXT || |
- GetRole() == ui::AX_ROLE_LIST_MARKER)) { |
+ (GetRole() == ui::AX_ROLE_STATIC_TEXT || |
+ GetRole() == ui::AX_ROLE_LIST_MARKER || |
+ IsListBoxOptionOrMenuListOption())) { |
base::string16 tmp = value; |
value = name; |
name = tmp; |
@@ -3303,10 +3301,22 @@ void BrowserAccessibilityWin::UpdateStep3FireEvents(bool is_subtree_creation) { |
bool is_selected_now = (ia_state() & STATE_SYSTEM_SELECTED) != 0; |
bool was_selected_before = |
(old_win_attributes_->ia_state & STATE_SYSTEM_SELECTED) != 0; |
- if (is_selected_now && !was_selected_before) { |
- manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONADD, this); |
- } else if (!is_selected_now && was_selected_before) { |
- manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONREMOVE, this); |
+ if (is_selected_now || was_selected_before) { |
+ bool multiselect = false; |
+ if (GetParent() && GetParent()->HasState(ui::AX_STATE_MULTISELECTABLE)) |
+ multiselect = true; |
+ |
+ if (multiselect) { |
je_julie(Not used)
2015/04/06 10:31:48
Do we need this variable? it doesn't seem to be us
|
+ // In a multi-select box, fire SELECTIONADD and SELECTIONREMOVE events. |
+ if (is_selected_now && !was_selected_before) { |
+ manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONADD, this); |
+ } else if (!is_selected_now && was_selected_before) { |
+ manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONREMOVE, this); |
+ } |
+ } else if (is_selected_now && !was_selected_before) { |
+ // In a single-select box, only fire SELECTION events. |
+ manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTION, this); |
+ } |
} |
// Fire an event if this container object has scrolled. |
@@ -3466,7 +3476,7 @@ base::string16 BrowserAccessibilityWin::GetValueText() { |
} |
base::string16 BrowserAccessibilityWin::TextForIAccessibleText() { |
- if (IsEditableText()) |
+ if (IsEditableText() || GetRole() == ui::AX_ROLE_MENU_LIST_OPTION) |
return value(); |
return (GetRole() == ui::AX_ROLE_STATIC_TEXT) ? name() : hypertext(); |
} |
@@ -3592,6 +3602,26 @@ BrowserAccessibilityWin* BrowserAccessibilityWin::GetFromID(int32 id) { |
return manager()->GetFromID(id)->ToBrowserAccessibilityWin(); |
} |
+bool BrowserAccessibilityWin::IsListBoxOptionOrMenuListOption() { |
+ if (!GetParent()) |
+ return false; |
+ |
+ int32 role = GetRole(); |
+ int32 parent_role = GetParent()->GetRole(); |
+ |
+ if (role == ui::AX_ROLE_LIST_BOX_OPTION && |
+ parent_role == ui::AX_ROLE_LIST_BOX) { |
+ return true; |
+ } |
+ |
+ if (role == ui::AX_ROLE_MENU_LIST_OPTION && |
+ parent_role == ui::AX_ROLE_MENU_LIST_POPUP) { |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
void BrowserAccessibilityWin::InitRoleAndState() { |
int32 ia_role = 0; |
int32 ia_state = 0; |
@@ -3914,10 +3944,12 @@ void BrowserAccessibilityWin::InitRoleAndState() { |
ia2_role = IA2_ROLE_RADIO_MENU_ITEM; |
break; |
case ui::AX_ROLE_MENU_LIST_POPUP: |
- ia_role = ROLE_SYSTEM_CLIENT; |
+ ia_role = ROLE_SYSTEM_LIST; |
+ ia2_state &= ~(IA2_STATE_EDITABLE); |
break; |
case ui::AX_ROLE_MENU_LIST_OPTION: |
ia_role = ROLE_SYSTEM_LISTITEM; |
+ ia2_state &= ~(IA2_STATE_EDITABLE); |
if (ia_state & STATE_SYSTEM_SELECTABLE) { |
ia_state |= STATE_SYSTEM_FOCUSABLE; |
if (HasState(ui::AX_STATE_FOCUSED)) |