| 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 <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 return GetData().state; | 181 return GetData().state; |
| 182 } | 182 } |
| 183 | 183 |
| 184 const BrowserAccessibility::HtmlAttributes& | 184 const BrowserAccessibility::HtmlAttributes& |
| 185 BrowserAccessibility::GetHtmlAttributes() const { | 185 BrowserAccessibility::GetHtmlAttributes() const { |
| 186 return GetData().html_attributes; | 186 return GetData().html_attributes; |
| 187 } | 187 } |
| 188 | 188 |
| 189 gfx::Rect BrowserAccessibility::GetLocalBoundsRect() const { | 189 gfx::Rect BrowserAccessibility::GetLocalBoundsRect() const { |
| 190 gfx::Rect bounds = GetLocation(); | 190 gfx::Rect bounds = GetLocation(); |
| 191 FixEmptyBounds(&bounds); |
| 191 return ElementBoundsToLocalBounds(bounds); | 192 return ElementBoundsToLocalBounds(bounds); |
| 192 } | 193 } |
| 193 | 194 |
| 194 gfx::Rect BrowserAccessibility::GetGlobalBoundsRect() const { | 195 gfx::Rect BrowserAccessibility::GetGlobalBoundsRect() const { |
| 195 gfx::Rect bounds = GetLocalBoundsRect(); | 196 gfx::Rect bounds = GetLocalBoundsRect(); |
| 196 | 197 |
| 197 // Adjust the bounds by the top left corner of the containing view's bounds | 198 // Adjust the bounds by the top left corner of the containing view's bounds |
| 198 // in screen coordinates. | 199 // in screen coordinates. |
| 199 bounds.Offset(manager_->GetViewBounds().OffsetFromOrigin()); | 200 bounds.Offset(manager_->GetViewBounds().OffsetFromOrigin()); |
| 200 | 201 |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 ui::AXNode* parent = node_->parent(); | 689 ui::AXNode* parent = node_->parent(); |
| 689 if (parent) | 690 if (parent) |
| 690 return manager_->GetFromAXNode(parent); | 691 return manager_->GetFromAXNode(parent); |
| 691 | 692 |
| 692 if (!manager_->delegate()) | 693 if (!manager_->delegate()) |
| 693 return NULL; | 694 return NULL; |
| 694 | 695 |
| 695 return manager_->delegate()->AccessibilityGetParentFrame(); | 696 return manager_->delegate()->AccessibilityGetParentFrame(); |
| 696 } | 697 } |
| 697 | 698 |
| 699 void BrowserAccessibility::FixEmptyBounds(gfx::Rect* bounds) const |
| 700 { |
| 701 if (bounds->width() > 0 && bounds->height() > 0) |
| 702 return; |
| 703 |
| 704 for (size_t i = 0; i < InternalChildCount(); ++i) { |
| 705 // Compute the bounds of each child - this calls FixEmptyBounds |
| 706 // recursively if necessary. |
| 707 BrowserAccessibility* child = InternalGetChild(i); |
| 708 gfx::Rect child_bounds = child->GetLocalBoundsRect(); |
| 709 |
| 710 // Ignore children that don't have valid bounds themselves. |
| 711 if (child_bounds.width() == 0 || child_bounds.height() == 0) |
| 712 continue; |
| 713 |
| 714 // For the first valid child, just set the bounds to that child's bounds. |
| 715 if (bounds->width() == 0 || bounds->height() == 0) { |
| 716 *bounds = child_bounds; |
| 717 continue; |
| 718 } |
| 719 |
| 720 // Union each additional child's bounds. |
| 721 bounds->Union(child_bounds); |
| 722 } |
| 723 } |
| 724 |
| 698 gfx::Rect BrowserAccessibility::ElementBoundsToLocalBounds(gfx::Rect bounds) | 725 gfx::Rect BrowserAccessibility::ElementBoundsToLocalBounds(gfx::Rect bounds) |
| 699 const { | 726 const { |
| 700 // Walk up the parent chain. Every time we encounter a Web Area, offset | 727 // Walk up the parent chain. Every time we encounter a Web Area, offset |
| 701 // based on the scroll bars and then offset based on the origin of that | 728 // based on the scroll bars and then offset based on the origin of that |
| 702 // nested web area. | 729 // nested web area. |
| 703 BrowserAccessibility* parent = GetParentForBoundsCalculation(); | 730 BrowserAccessibility* parent = GetParentForBoundsCalculation(); |
| 704 bool need_to_offset_web_area = | 731 bool need_to_offset_web_area = |
| 705 (GetRole() == ui::AX_ROLE_WEB_AREA || | 732 (GetRole() == ui::AX_ROLE_WEB_AREA || |
| 706 GetRole() == ui::AX_ROLE_ROOT_WEB_AREA); | 733 GetRole() == ui::AX_ROLE_ROOT_WEB_AREA); |
| 707 while (parent) { | 734 while (parent) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 729 } | 756 } |
| 730 need_to_offset_web_area = true; | 757 need_to_offset_web_area = true; |
| 731 } | 758 } |
| 732 parent = parent->GetParentForBoundsCalculation(); | 759 parent = parent->GetParentForBoundsCalculation(); |
| 733 } | 760 } |
| 734 | 761 |
| 735 return bounds; | 762 return bounds; |
| 736 } | 763 } |
| 737 | 764 |
| 738 } // namespace content | 765 } // namespace content |
| OLD | NEW |