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

Side by Side Diff: content/browser/accessibility/browser_accessibility.cc

Issue 1713723002: Implement accessibility support for CSS-transformed iframes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed another skia dependency Created 4 years, 9 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 unified diff | Download patch
OLDNEW
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
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.
aboxhall 2016/02/24 19:38:21 Why is this true in the case where, e.g., the pare
882 if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA &&
883 GetParent() &&
884 GetParent()->manager() != manager() &&
885 manager()->delegate()) {
aboxhall 2016/02/24 18:46:07 When would this be false?
dmazzoni 2016/02/24 18:53:26 Only in unit tests
886 manager()->delegate()->AccessibilityTransformToRootCoordSpace(&bounds);
887 return bounds;
888 } else if (!GetData().transform.IsIdentity()) {
889 gfx::RectF boundsf(bounds);
890 GetData().transform.TransformRect(&boundsf);
891 return gfx::Rect(boundsf.x(), boundsf.y(),
892 boundsf.width(), boundsf.height());
893 }
894
880 // Walk up the parent chain. Every time we encounter a Web Area, offset 895 // 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 896 // based on the scroll bars and then offset based on the origin of that
882 // nested web area. 897 // nested web area.
883 BrowserAccessibility* parent = GetParent(); 898 BrowserAccessibility* parent = GetParent();
884 bool need_to_offset_web_area = 899 bool need_to_offset_web_area =
885 (GetRole() == ui::AX_ROLE_WEB_AREA || 900 (GetRole() == ui::AX_ROLE_WEB_AREA ||
886 GetRole() == ui::AX_ROLE_ROOT_WEB_AREA); 901 GetRole() == ui::AX_ROLE_ROOT_WEB_AREA);
887 while (parent) { 902 while (parent) {
903 bool parent_is_in_different_tree = parent->manager() != manager();
904
888 if (need_to_offset_web_area && 905 if (need_to_offset_web_area &&
889 parent->GetLocation().width() > 0 && 906 parent->GetLocation().width() > 0 &&
890 parent->GetLocation().height() > 0) { 907 parent->GetLocation().height() > 0 &&
908 parent->GetData().transform.IsIdentity() &&
909 !parent_is_in_different_tree) {
891 bounds.Offset(parent->GetLocation().x(), parent->GetLocation().y()); 910 bounds.Offset(parent->GetLocation().x(), parent->GetLocation().y());
892 need_to_offset_web_area = false; 911 need_to_offset_web_area = false;
893 } 912 }
894 913
895 // On some platforms, we don't want to take the root scroll offsets 914 // On some platforms, we don't want to take the root scroll offsets
896 // into account. 915 // into account.
897 if (parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && 916 if (parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA &&
898 !manager()->UseRootScrollOffsetsWhenComputingBounds()) { 917 !manager()->UseRootScrollOffsetsWhenComputingBounds()) {
899 break; 918 break;
900 } 919 }
901 920
902 if (parent->GetRole() == ui::AX_ROLE_WEB_AREA || 921 if (parent->GetRole() == ui::AX_ROLE_WEB_AREA ||
903 parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA) { 922 parent->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA) {
904 int sx = 0; 923 int sx = 0;
905 int sy = 0; 924 int sy = 0;
906 if (parent->GetIntAttribute(ui::AX_ATTR_SCROLL_X, &sx) && 925 if (parent->GetIntAttribute(ui::AX_ATTR_SCROLL_X, &sx) &&
907 parent->GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &sy)) { 926 parent->GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &sy)) {
908 bounds.Offset(-sx, -sy); 927 bounds.Offset(-sx, -sy);
909 } 928 }
910 need_to_offset_web_area = true; 929 need_to_offset_web_area = true;
930
931 if (parent_is_in_different_tree && manager()->delegate()) {
932 manager()->delegate()->AccessibilityTransformToRootCoordSpace(&bounds);
933 break;
934 } else if (!parent->GetData().transform.IsIdentity()) {
935 gfx::RectF boundsf(bounds);
936 parent->GetData().transform.TransformRect(&boundsf);
937 bounds = gfx::Rect(boundsf.x(), boundsf.y(),
938 boundsf.width(), boundsf.height());
939 need_to_offset_web_area = false;
940 }
911 } 941 }
942
912 parent = parent->GetParent(); 943 parent = parent->GetParent();
913 } 944 }
914 945
915 return bounds; 946 return bounds;
916 } 947 }
917 948
918 } // namespace content 949 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698