OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/accessibility/browser_accessibility.h" | 5 #include "content/browser/accessibility/browser_accessibility.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 BrowserAccessibility::GetHtmlAttributes() const { | 177 BrowserAccessibility::GetHtmlAttributes() const { |
178 return GetData().html_attributes; | 178 return GetData().html_attributes; |
179 } | 179 } |
180 | 180 |
181 gfx::Rect BrowserAccessibility::GetLocalBoundsRect() const { | 181 gfx::Rect BrowserAccessibility::GetLocalBoundsRect() const { |
182 gfx::Rect bounds = GetLocation(); | 182 gfx::Rect bounds = GetLocation(); |
183 | 183 |
184 // Walk up the parent chain. Every time we encounter a Web Area, offset | 184 // Walk up the parent chain. Every time we encounter a Web Area, offset |
185 // based on the scroll bars and then offset based on the origin of that | 185 // based on the scroll bars and then offset based on the origin of that |
186 // nested web area. | 186 // nested web area. |
187 BrowserAccessibility* parent = GetParent(); | 187 BrowserAccessibility* parent = GetParentForBoundsCalculation(); |
188 bool need_to_offset_web_area = | 188 bool need_to_offset_web_area = |
189 (GetRole() == ui::AX_ROLE_WEB_AREA || | 189 (GetRole() == ui::AX_ROLE_WEB_AREA || |
190 GetRole() == ui::AX_ROLE_ROOT_WEB_AREA); | 190 GetRole() == ui::AX_ROLE_ROOT_WEB_AREA); |
191 while (parent) { | 191 while (parent) { |
192 if (need_to_offset_web_area && | 192 if (need_to_offset_web_area && |
193 parent->GetLocation().width() > 0 && | 193 parent->GetLocation().width() > 0 && |
194 parent->GetLocation().height() > 0) { | 194 parent->GetLocation().height() > 0) { |
195 bounds.Offset(parent->GetLocation().x(), parent->GetLocation().y()); | 195 bounds.Offset(parent->GetLocation().x(), parent->GetLocation().y()); |
196 need_to_offset_web_area = false; | 196 need_to_offset_web_area = false; |
197 } | 197 } |
198 | 198 |
199 // On some platforms, we don't want to take the root scroll offsets | 199 // On some platforms, we don't want to take the root scroll offsets |
200 // into account. | 200 // into account. |
201 if (parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && | 201 if (parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && |
202 !manager()->UseRootScrollOffsetsWhenComputingBounds()) { | 202 !manager()->UseRootScrollOffsetsWhenComputingBounds()) { |
203 break; | 203 break; |
204 } | 204 } |
205 | 205 |
206 if (parent->GetRole() == ui::AX_ROLE_WEB_AREA || | 206 if (parent->GetRole() == ui::AX_ROLE_WEB_AREA || |
207 parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA) { | 207 parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA) { |
208 int sx = 0; | 208 int sx = 0; |
209 int sy = 0; | 209 int sy = 0; |
210 if (parent->GetIntAttribute(ui::AX_ATTR_SCROLL_X, &sx) && | 210 if (parent->GetIntAttribute(ui::AX_ATTR_SCROLL_X, &sx) && |
211 parent->GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &sy)) { | 211 parent->GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &sy)) { |
212 bounds.Offset(-sx, -sy); | 212 bounds.Offset(-sx, -sy); |
213 } | 213 } |
214 need_to_offset_web_area = true; | 214 need_to_offset_web_area = true; |
215 } | 215 } |
216 parent = parent->GetParent(); | 216 parent = parent->GetParentForBoundsCalculation(); |
217 } | 217 } |
218 | 218 |
219 return bounds; | 219 return bounds; |
220 } | 220 } |
221 | 221 |
222 gfx::Rect BrowserAccessibility::GetGlobalBoundsRect() const { | 222 gfx::Rect BrowserAccessibility::GetGlobalBoundsRect() const { |
223 gfx::Rect bounds = GetLocalBoundsRect(); | 223 gfx::Rect bounds = GetLocalBoundsRect(); |
224 | 224 |
225 // Adjust the bounds by the top left corner of the containing view's bounds | 225 // Adjust the bounds by the top left corner of the containing view's bounds |
226 // in screen coordinates. | 226 // in screen coordinates. |
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 int BrowserAccessibility::GetStaticTextLenRecursive() const { | 716 int BrowserAccessibility::GetStaticTextLenRecursive() const { |
717 if (GetRole() == ui::AX_ROLE_STATIC_TEXT) | 717 if (GetRole() == ui::AX_ROLE_STATIC_TEXT) |
718 return static_cast<int>(GetStringAttribute(ui::AX_ATTR_VALUE).size()); | 718 return static_cast<int>(GetStringAttribute(ui::AX_ATTR_VALUE).size()); |
719 | 719 |
720 int len = 0; | 720 int len = 0; |
721 for (size_t i = 0; i < InternalChildCount(); ++i) | 721 for (size_t i = 0; i < InternalChildCount(); ++i) |
722 len += InternalGetChild(i)->GetStaticTextLenRecursive(); | 722 len += InternalGetChild(i)->GetStaticTextLenRecursive(); |
723 return len; | 723 return len; |
724 } | 724 } |
725 | 725 |
| 726 BrowserAccessibility* BrowserAccessibility::GetParentForBoundsCalculation() |
| 727 const { |
| 728 if (!node_ || !manager_) |
| 729 return NULL; |
| 730 ui::AXNode* parent = node_->parent(); |
| 731 if (parent) |
| 732 return manager_->GetFromAXNode(parent); |
| 733 |
| 734 if (!manager_->delegate()) |
| 735 return NULL; |
| 736 |
| 737 BrowserAccessibility* host_node = |
| 738 manager_->delegate()->AccessibilityGetParentFrame(); |
| 739 if (!host_node) |
| 740 return NULL; |
| 741 |
| 742 return host_node; |
| 743 } |
| 744 |
726 } // namespace content | 745 } // namespace content |
OLD | NEW |