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

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

Issue 895233002: Accessibility BoundsForRange needs to take scroll offsets into account. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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
Index: content/browser/accessibility/browser_accessibility.cc
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index 65d805bd3e2c2bf4d02b6eb75d0cdd417a985f3c..13402f5b03c9b37b9278e770d15322df0e9d34c2 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -186,43 +186,7 @@ BrowserAccessibility::GetHtmlAttributes() const {
gfx::Rect BrowserAccessibility::GetLocalBoundsRect() const {
gfx::Rect bounds = GetLocation();
-
- // Walk up the parent chain. Every time we encounter a Web Area, offset
- // based on the scroll bars and then offset based on the origin of that
- // nested web area.
- BrowserAccessibility* parent = GetParentForBoundsCalculation();
- bool need_to_offset_web_area =
- (GetRole() == ui::AX_ROLE_WEB_AREA ||
- GetRole() == ui::AX_ROLE_ROOT_WEB_AREA);
- while (parent) {
- if (need_to_offset_web_area &&
- parent->GetLocation().width() > 0 &&
- parent->GetLocation().height() > 0) {
- bounds.Offset(parent->GetLocation().x(), parent->GetLocation().y());
- need_to_offset_web_area = false;
- }
-
- // On some platforms, we don't want to take the root scroll offsets
- // into account.
- if (parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA &&
- !manager()->UseRootScrollOffsetsWhenComputingBounds()) {
- break;
- }
-
- if (parent->GetRole() == ui::AX_ROLE_WEB_AREA ||
- parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA) {
- int sx = 0;
- int sy = 0;
- if (parent->GetIntAttribute(ui::AX_ATTR_SCROLL_X, &sx) &&
- parent->GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &sy)) {
- bounds.Offset(-sx, -sy);
- }
- need_to_offset_web_area = true;
- }
- parent = parent->GetParentForBoundsCalculation();
- }
-
- return bounds;
+ return ElementBoundsToLocalBounds(bounds);
}
gfx::Rect BrowserAccessibility::GetGlobalBoundsRect() const {
@@ -252,7 +216,7 @@ gfx::Rect BrowserAccessibility::GetLocalBoundsForRange(int start, int len)
}
start -= child_len;
}
- return bounds;
+ return ElementBoundsToLocalBounds(bounds);
}
int end = start + len;
@@ -329,7 +293,7 @@ gfx::Rect BrowserAccessibility::GetLocalBoundsForRange(int start, int len)
bounds.Union(child_overlap_rect);
}
- return bounds;
+ return ElementBoundsToLocalBounds(bounds);
}
gfx::Rect BrowserAccessibility::GetGlobalBoundsForRange(int start, int len)
@@ -711,4 +675,44 @@ BrowserAccessibility* BrowserAccessibility::GetParentForBoundsCalculation()
return manager_->delegate()->AccessibilityGetParentFrame();
}
+gfx::Rect BrowserAccessibility::ElementBoundsToLocalBounds(gfx::Rect bounds)
+ const {
+ // Walk up the parent chain. Every time we encounter a Web Area, offset
+ // based on the scroll bars and then offset based on the origin of that
+ // nested web area.
+ BrowserAccessibility* parent = GetParentForBoundsCalculation();
+ bool need_to_offset_web_area =
+ (GetRole() == ui::AX_ROLE_WEB_AREA ||
+ GetRole() == ui::AX_ROLE_ROOT_WEB_AREA);
+ while (parent) {
+ if (need_to_offset_web_area &&
+ parent->GetLocation().width() > 0 &&
+ parent->GetLocation().height() > 0) {
+ bounds.Offset(parent->GetLocation().x(), parent->GetLocation().y());
+ need_to_offset_web_area = false;
+ }
+
+ // On some platforms, we don't want to take the root scroll offsets
+ // into account.
+ if (parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA &&
+ !manager()->UseRootScrollOffsetsWhenComputingBounds()) {
+ break;
+ }
+
+ if (parent->GetRole() == ui::AX_ROLE_WEB_AREA ||
+ parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA) {
+ int sx = 0;
+ int sy = 0;
+ if (parent->GetIntAttribute(ui::AX_ATTR_SCROLL_X, &sx) &&
+ parent->GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &sy)) {
+ bounds.Offset(-sx, -sy);
+ }
+ need_to_offset_web_area = true;
+ }
+ parent = parent->GetParentForBoundsCalculation();
+ }
+
+ return bounds;
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698