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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
15 #include "content/browser/accessibility/browser_accessibility_manager.h" | 15 #include "content/browser/accessibility/browser_accessibility_manager.h" |
16 #include "content/common/accessibility_messages.h" | 16 #include "content/common/accessibility_messages.h" |
17 #include "ui/accessibility/ax_text_utils.h" | 17 #include "ui/accessibility/ax_text_utils.h" |
| 18 #include "ui/gfx/geometry/rect_f.h" |
18 | 19 |
19 namespace content { | 20 namespace content { |
20 | 21 |
21 #if !defined(PLATFORM_HAS_NATIVE_ACCESSIBILITY_IMPL) | 22 #if !defined(PLATFORM_HAS_NATIVE_ACCESSIBILITY_IMPL) |
22 // static | 23 // static |
23 BrowserAccessibility* BrowserAccessibility::Create() { | 24 BrowserAccessibility* BrowserAccessibility::Create() { |
24 return new BrowserAccessibility(); | 25 return new BrowserAccessibility(); |
25 } | 26 } |
26 #endif | 27 #endif |
27 | 28 |
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
870 continue; | 871 continue; |
871 } | 872 } |
872 | 873 |
873 // Union each additional child's bounds. | 874 // Union each additional child's bounds. |
874 bounds->Union(child_bounds); | 875 bounds->Union(child_bounds); |
875 } | 876 } |
876 } | 877 } |
877 | 878 |
878 gfx::Rect BrowserAccessibility::ElementBoundsToLocalBounds(gfx::Rect bounds) | 879 gfx::Rect BrowserAccessibility::ElementBoundsToLocalBounds(gfx::Rect bounds) |
879 const { | 880 const { |
| 881 // If this element has a transform, apply it and we're done. |
| 882 if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && |
| 883 GetParent() && |
| 884 GetParent()->manager() != manager() && |
| 885 manager()->delegate()) { |
| 886 manager()->delegate()->AccessibilityTransformToRootCoordSpace(&bounds); |
| 887 return bounds; |
| 888 } else if (GetData().transform.get() && |
| 889 !GetData().transform->IsIdentity()) { |
| 890 gfx::RectF boundsf(bounds); |
| 891 GetData().transform->TransformRect(&boundsf); |
| 892 return gfx::Rect(boundsf.x(), boundsf.y(), |
| 893 boundsf.width(), boundsf.height()); |
| 894 } |
| 895 |
880 // Walk up the parent chain. Every time we encounter a Web Area, offset | 896 // Walk up the parent chain. Every time we encounter a Web Area, offset |
881 // based on the scroll bars and then offset based on the origin of that | 897 // based on the scroll bars and then offset based on the origin of that |
882 // nested web area. | 898 // nested web area. |
883 BrowserAccessibility* parent = GetParent(); | 899 BrowserAccessibility* parent = GetParent(); |
884 bool need_to_offset_web_area = | 900 bool need_to_offset_web_area = |
885 (GetRole() == ui::AX_ROLE_WEB_AREA || | 901 (GetRole() == ui::AX_ROLE_WEB_AREA || |
886 GetRole() == ui::AX_ROLE_ROOT_WEB_AREA); | 902 GetRole() == ui::AX_ROLE_ROOT_WEB_AREA); |
887 while (parent) { | 903 while (parent) { |
| 904 bool parent_is_in_different_tree = parent->manager() != manager(); |
| 905 |
| 906 bool parent_transform_is_identity = !parent->GetData().transform.get() || |
| 907 parent->GetData().transform->IsIdentity(); |
| 908 |
888 if (need_to_offset_web_area && | 909 if (need_to_offset_web_area && |
889 parent->GetLocation().width() > 0 && | 910 parent->GetLocation().width() > 0 && |
890 parent->GetLocation().height() > 0) { | 911 parent->GetLocation().height() > 0 && |
| 912 parent_transform_is_identity && |
| 913 !parent_is_in_different_tree) { |
891 bounds.Offset(parent->GetLocation().x(), parent->GetLocation().y()); | 914 bounds.Offset(parent->GetLocation().x(), parent->GetLocation().y()); |
892 need_to_offset_web_area = false; | 915 need_to_offset_web_area = false; |
893 } | 916 } |
894 | 917 |
895 // On some platforms, we don't want to take the root scroll offsets | 918 // On some platforms, we don't want to take the root scroll offsets |
896 // into account. | 919 // into account. |
897 if (parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && | 920 if (parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && |
898 !manager()->UseRootScrollOffsetsWhenComputingBounds()) { | 921 !manager()->UseRootScrollOffsetsWhenComputingBounds()) { |
899 break; | 922 break; |
900 } | 923 } |
901 | 924 |
902 if (parent->GetRole() == ui::AX_ROLE_WEB_AREA || | 925 if (parent->GetRole() == ui::AX_ROLE_WEB_AREA || |
903 parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA) { | 926 parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA) { |
904 int sx = 0; | 927 int sx = 0; |
905 int sy = 0; | 928 int sy = 0; |
906 if (parent->GetIntAttribute(ui::AX_ATTR_SCROLL_X, &sx) && | 929 if (parent->GetIntAttribute(ui::AX_ATTR_SCROLL_X, &sx) && |
907 parent->GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &sy)) { | 930 parent->GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &sy)) { |
908 bounds.Offset(-sx, -sy); | 931 bounds.Offset(-sx, -sy); |
909 } | 932 } |
910 need_to_offset_web_area = true; | 933 need_to_offset_web_area = true; |
| 934 |
| 935 if (parent_is_in_different_tree && manager()->delegate()) { |
| 936 manager()->delegate()->AccessibilityTransformToRootCoordSpace(&bounds); |
| 937 break; |
| 938 } else if (!parent_transform_is_identity) { |
| 939 gfx::RectF boundsf(bounds); |
| 940 parent->GetData().transform->TransformRect(&boundsf); |
| 941 bounds = gfx::Rect(boundsf.x(), boundsf.y(), |
| 942 boundsf.width(), boundsf.height()); |
| 943 need_to_offset_web_area = false; |
| 944 } |
911 } | 945 } |
| 946 |
912 parent = parent->GetParent(); | 947 parent = parent->GetParent(); |
913 } | 948 } |
914 | 949 |
915 return bounds; | 950 return bounds; |
916 } | 951 } |
917 | 952 |
918 } // namespace content | 953 } // namespace content |
OLD | NEW |