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

Unified Diff: content/browser/accessibility/browser_accessibility_win.cc

Issue 2119643002: Attempted to fix crash in BrowserAccessibilityWin::RemoveBidirectionalRelation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changed attributes to target_ids. Created 4 years, 6 months 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
« no previous file with comments | « no previous file | content/browser/accessibility/browser_accessibility_win_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 e82b7b39fb8ebd7659ccdc5c8004e30b90f82232..3439cafbf16cbdb7956af76a1d835071e2a1bb62 100644
--- a/content/browser/accessibility/browser_accessibility_win.cc
+++ b/content/browser/accessibility/browser_accessibility_win.cc
@@ -222,8 +222,8 @@ BrowserAccessibilityWin::BrowserAccessibilityWin()
}
BrowserAccessibilityWin::~BrowserAccessibilityWin() {
- for (size_t i = 0; i < relations_.size(); ++i)
- relations_[i]->Release();
+ for (BrowserAccessibilityRelation* relation : relations_)
+ relation->Release();
}
//
@@ -4454,6 +4454,10 @@ bool BrowserAccessibilityWin::IsListBoxOptionOrMenuListOption() {
void BrowserAccessibilityWin::AddRelation(const base::string16& relation_type,
int target_id) {
+ // Reflexive relations don't need to be exposed through IA2.
+ if (target_id == GetId())
+ return;
+
CComObject<BrowserAccessibilityRelation>* relation;
HRESULT hr =
CComObject<BrowserAccessibilityRelation>::CreateInstance(&relation);
@@ -4471,6 +4475,16 @@ void BrowserAccessibilityWin::AddBidirectionalRelations(
if (!HasIntListAttribute(attribute))
return;
+ const std::vector<int32_t>& target_ids = GetIntListAttribute(attribute);
+ // Reflexive relations don't need to be exposed through IA2.
+ std::vector<int32_t> filtered_target_ids;
+ int32_t current_id = GetId();
+ std::copy_if(target_ids.begin(), target_ids.end(),
+ std::back_inserter(filtered_target_ids),
+ [current_id](int32_t id) { return id != current_id; });
+ if (filtered_target_ids.empty())
+ return;
+
CComObject<BrowserAccessibilityRelation>* relation;
HRESULT hr =
CComObject<BrowserAccessibilityRelation>::CreateInstance(&relation);
@@ -4478,7 +4492,7 @@ void BrowserAccessibilityWin::AddBidirectionalRelations(
relation->AddRef();
relation->Initialize(this, relation_type);
- for (int target_id : GetIntListAttribute(attribute)) {
+ for (int target_id : filtered_target_ids) {
BrowserAccessibilityWin* target =
GetFromID(static_cast<int32_t>(target_id));
if (!target || !target->instance_active())
@@ -4527,10 +4541,11 @@ void BrowserAccessibilityWin::RemoveBidirectionalRelationsOfType(
GetFromID(static_cast<int32_t>(target_id));
if (!target || !target->instance_active())
continue;
+ DCHECK_NE(target, this);
target->RemoveTargetFromRelation(reverse_relation_type, GetId());
}
- relation->Release();
iter = relations_.erase(iter);
+ relation->Release();
} else {
++iter;
}
@@ -4548,8 +4563,8 @@ void BrowserAccessibilityWin::RemoveTargetFromRelation(
relation->RemoveTarget(target_id);
}
if (relation->get_target_ids().empty()) {
- relation->Release();
iter = relations_.erase(iter);
+ relation->Release();
} else {
++iter;
}
« no previous file with comments | « no previous file | content/browser/accessibility/browser_accessibility_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698