Chromium Code Reviews| 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 88c5c8254a951210390b272d1ba3c65483f47732..4e2d2e8ab315a0bc46f3df8d6b3965b06efbb110 100644 |
| --- a/content/browser/accessibility/browser_accessibility_win.cc |
| +++ b/content/browser/accessibility/browser_accessibility_win.cc |
| @@ -3526,11 +3526,20 @@ void BrowserAccessibilityWin::UpdateStep1ComputeWinAttributes() { |
| relations_[i]->Release(); |
| relations_.clear(); |
| - // Handle title UI element. |
| - AddRelations(ui::AX_ATTR_CONTROLS_IDS, IA2_RELATION_CONTROLLER_FOR); |
| - AddRelations(ui::AX_ATTR_DESCRIBEDBY_IDS, IA2_RELATION_DESCRIBED_BY); |
| - AddRelations(ui::AX_ATTR_FLOWTO_IDS, IA2_RELATION_FLOWS_TO); |
| - AddRelations(ui::AX_ATTR_LABELLEDBY_IDS, IA2_RELATION_LABELLED_BY); |
| + AddBidirectionalRelations(IA2_RELATION_CONTROLLER_FOR, |
| + IA2_RELATION_CONTROLLED_BY, |
| + ui::AX_ATTR_CONTROLS_IDS); |
| + AddBidirectionalRelations(IA2_RELATION_DESCRIBED_BY, |
| + IA2_RELATION_DESCRIPTION_FOR, |
| + ui::AX_ATTR_DESCRIBEDBY_IDS); |
| + AddBidirectionalRelations(IA2_RELATION_FLOWS_TO, IA2_RELATION_FLOWS_FROM, |
| + ui::AX_ATTR_FLOWTO_IDS); |
| + AddBidirectionalRelations(IA2_RELATION_LABELLED_BY, IA2_RELATION_LABEL_FOR, |
| + ui::AX_ATTR_LABELLEDBY_IDS); |
| + |
| + int member_of_id; |
| + if (GetIntAttribute(ui::AX_ATTR_MEMBER_OF_ID, &member_of_id)) |
| + AddRelation(IA2_RELATION_MEMBER_OF, member_of_id); |
| UpdateRequiredAttributes(); |
| // If this is a web area for a presentational iframe, give it a role of |
| @@ -4436,22 +4445,39 @@ bool BrowserAccessibilityWin::IsListBoxOptionOrMenuListOption() { |
| return false; |
| } |
| -void BrowserAccessibilityWin::AddRelations( |
| - ui::AXIntListAttribute src_attr, |
| - const base::string16& iaccessiblerelation_type) { |
| - if (!HasIntListAttribute(src_attr)) |
| +void BrowserAccessibilityWin::AddRelation(const base::string16& relation_type, |
| + int target_id) { |
| + CComObject<BrowserAccessibilityRelation>* relation; |
| + HRESULT hr = |
| + CComObject<BrowserAccessibilityRelation>::CreateInstance(&relation); |
| + DCHECK(SUCCEEDED(hr)); |
| + relation->AddRef(); |
| + relation->Initialize(this, relation_type); |
| + relation->AddTarget(target_id); |
| + relations_.push_back(relation); |
| +} |
| + |
| +void BrowserAccessibilityWin::AddBidirectionalRelations( |
| + const base::string16& relation_type, |
| + const base::string16& reverse_relation_type, |
| + ui::AXIntListAttribute attribute) { |
| + if (!HasIntListAttribute(attribute)) |
| return; |
| - const std::vector<int32_t>& ids = GetIntListAttribute(src_attr); |
| - for (size_t i = 0; i < ids.size(); ++i) { |
| + for (int target_id : GetIntListAttribute(attribute)) { |
| + BrowserAccessibilityWin* target = |
| + GetFromID(static_cast<int32_t>(target_id)); |
| + if (!target || !target->instance_active()) |
| + continue; |
| CComObject<BrowserAccessibilityRelation>* relation; |
| HRESULT hr = |
| CComObject<BrowserAccessibilityRelation>::CreateInstance(&relation); |
| DCHECK(SUCCEEDED(hr)); |
| relation->AddRef(); |
| - relation->Initialize(this, iaccessiblerelation_type); |
| - relation->AddTarget(ids[i]); |
| + relation->Initialize(this, relation_type); |
| + relation->AddTarget(target_id); |
| relations_.push_back(relation); |
| + target->AddRelation(reverse_relation_type, target_id); |
|
dmazzoni
2016/06/13 05:41:18
I think this is going to keep adding this reverse
|
| } |
| } |