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

Side by Side Diff: content/browser/accessibility/accessibility_tree_formatter_mac.mm

Issue 13479003: Modify AccessibilityTreeFormatter to build up an internal representation of the tree (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Code cleanup Created 7 years, 8 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/accessibility_tree_formatter.h" 5 #include "content/browser/accessibility/accessibility_tree_formatter.h"
6 6
7 #import <Cocoa/Cocoa.h> 7 #import <Cocoa/Cocoa.h>
8 8
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/stringprintf.h"
11 #include "base/strings/sys_string_conversions.h"
10 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
11 #include "content/browser/accessibility/browser_accessibility_cocoa.h" 13 #include "content/browser/accessibility/browser_accessibility_cocoa.h"
12 #include "content/browser/accessibility/browser_accessibility_mac.h" 14 #include "content/browser/accessibility/browser_accessibility_mac.h"
13 #include "content/browser/accessibility/browser_accessibility_manager.h" 15 #include "content/browser/accessibility/browser_accessibility_manager.h"
14 16
17 using base::SysNSStringToUTF8;
18 using base::SysNSStringToUTF16;
19
15 namespace content { 20 namespace content {
16 21
17 namespace { 22 namespace {
18 23
19 string16 Format(const char *prefix, 24 NSArray* ALL_ATTRIBUTES = [NSArray arrayWithObjects:
20 id value, 25 NSAccessibilityRoleDescriptionAttribute,
21 const char *suffix) { 26 NSAccessibilityTitleAttribute,
22 if (value == nil) 27 NSAccessibilityValueAttribute,
23 return UTF8ToUTF16(""); 28 NSAccessibilityMinValueAttribute,
24 NSString* format_str = 29 NSAccessibilityMaxValueAttribute,
25 [NSString stringWithFormat:@"%s%%@%s", prefix, suffix]; 30 NSAccessibilityValueDescriptionAttribute,
26 NSString* tmp = [NSString stringWithFormat:format_str, value]; 31 NSAccessibilityDescriptionAttribute,
27 return UTF8ToUTF16([tmp cStringUsingEncoding:NSUTF8StringEncoding]); 32 NSAccessibilityHelpAttribute,
33 @"AXInvalid",
34 NSAccessibilityDisclosingAttribute,
35 NSAccessibilityDisclosureLevelAttribute,
36 @"AXAccessKey",
37 @"AXARIAAtomic",
38 @"AXARIABusy",
39 @"AXARIALive",
40 @"AXARIARelevant",
41 NSAccessibilityEnabledAttribute,
42 NSAccessibilityFocusedAttribute,
43 @"AXLoaded",
44 @"AXLoadingProcess",
45 NSAccessibilityNumberOfCharactersAttribute,
46 NSAccessibilityOrientationAttribute,
47 @"AXRequired",
48 NSAccessibilityURLAttribute,
49 NSAccessibilityVisibleCharacterRangeAttribute,
50 @"AXVisited",
51 nil];
52
53 string16 FormatString(std::string prefix,
dmazzoni 2013/04/08 05:46:35 Use a const ref for string arguments, like: const
aboxhall 2013/04/10 03:09:34 I ended up deleting this method, it was silly anyw
54 std::string& value,
55 std::string suffix) {
56 return UTF8ToUTF16(prefix) + UTF8ToUTF16(value) + UTF8ToUTF16(suffix);
28 } 57 }
29 58
30 string16 FormatPosition(BrowserAccessibility* node) { 59 string16 FormatCoordinates(std::string name,
60 std::string x_name,
61 std::string y_name,
62 const DictionaryValue& value) {
63 int x, y;
64 value.GetInteger(x_name, &x);
65 value.GetInteger(y_name, &y);
66 NSString* xy_str =
67 [NSString stringWithFormat:@"%s=(%d, %d)", name.c_str(), x, y];
dmazzoni 2013/04/08 05:46:35 Indent 4 spaces
aboxhall 2013/04/10 03:09:34 Done.
68
69 return SysNSStringToUTF16(xy_str);
70 }
71
72 void PopulatePosition(BrowserAccessibility& node,
73 DictionaryValue* position) {
31 // The NSAccessibility position of an object is in global coordinates and 74 // The NSAccessibility position of an object is in global coordinates and
32 // based on the lower-left corner of the object. To make this easier and less 75 // based on the lower-left corner of the object. To make this easier and less
33 // confusing, convert it to local window coordinates using the top-left 76 // confusing, convert it to local window coordinates using the top-left
34 // corner when dumping the position. 77 // corner when dumping the position.
35 BrowserAccessibility* root = node->manager()->GetRoot(); 78 BrowserAccessibility* root = node.manager()->GetRoot();
36 BrowserAccessibilityCocoa* cocoa_root = root->ToBrowserAccessibilityCocoa(); 79 BrowserAccessibilityCocoa* cocoa_root = root->ToBrowserAccessibilityCocoa();
37 NSPoint root_position = [[cocoa_root position] pointValue]; 80 NSPoint root_position = [[cocoa_root position] pointValue];
38 NSSize root_size = [[cocoa_root size] sizeValue]; 81 NSSize root_size = [[cocoa_root size] sizeValue];
39 int root_top = -static_cast<int>(root_position.y + root_size.height); 82 int root_top = -static_cast<int>(root_position.y + root_size.height);
40 int root_left = static_cast<int>(root_position.x); 83 int root_left = static_cast<int>(root_position.x);
41 84
42 BrowserAccessibilityCocoa* cocoa_node = node->ToBrowserAccessibilityCocoa(); 85 BrowserAccessibilityCocoa* cocoa_node = node.ToBrowserAccessibilityCocoa();
43 NSPoint node_position = [[cocoa_node position] pointValue]; 86 NSPoint node_position = [[cocoa_node position] pointValue];
44 NSSize node_size = [[cocoa_node size] sizeValue]; 87 NSSize node_size = [[cocoa_node size] sizeValue];
45 88
46 NSString* position_str = 89 position->SetInteger("x", static_cast<int>(node_position.x - root_left));
47 [NSString stringWithFormat:@"position=(%d, %d)", 90 position->SetInteger("y",
48 static_cast<int>(node_position.x - root_left), 91 static_cast<int>(-node_position.y - node_size.height - root_top));
49 static_cast<int>(
50 -node_position.y - node_size.height - root_top)];
51 return UTF8ToUTF16([position_str cStringUsingEncoding:NSUTF8StringEncoding]);
52 } 92 }
53 93
54 string16 FormatSize(BrowserAccessibility* node) { 94 void PopulateSize(BrowserAccessibility& node, DictionaryValue* size) {
55 BrowserAccessibilityCocoa* cocoa_node = node->ToBrowserAccessibilityCocoa(); 95 BrowserAccessibilityCocoa* cocoa_node = node.ToBrowserAccessibilityCocoa();
56 NSSize node_size = [[cocoa_node size] sizeValue]; 96 NSSize node_size = [[cocoa_node size] sizeValue];
57 NSString* size_str = 97 size->SetInteger("height", static_cast<int>(node_size.height));
58 [NSString stringWithFormat:@"size=(%d, %d)", 98 size->SetInteger("width", static_cast<int>(node_size.width));
59 static_cast<int>(node_size.width),
60 static_cast<int>(node_size.height)];
61 return UTF8ToUTF16([size_str cStringUsingEncoding:NSUTF8StringEncoding]);
62 } 99 }
63 100
64 } // namespace 101 } // namespace
65 102
66 void AccessibilityTreeFormatter::Initialize() {} 103 void AccessibilityTreeFormatter::Initialize() {}
67 104
68 string16 AccessibilityTreeFormatter::ToString(BrowserAccessibility* node, 105 void AccessibilityTreeFormatter::AddProperties(BrowserAccessibility* node,
69 char* prefix) { 106 DictionaryValue* dict) {
70 StartLine();
71 NSArray* requestedAttributes = [NSArray arrayWithObjects:
72 NSAccessibilityRoleDescriptionAttribute,
73 NSAccessibilityTitleAttribute,
74 NSAccessibilityValueAttribute,
75 NSAccessibilityMinValueAttribute,
76 NSAccessibilityMaxValueAttribute,
77 NSAccessibilityValueDescriptionAttribute,
78 NSAccessibilityDescriptionAttribute,
79 NSAccessibilityHelpAttribute,
80 @"AXInvalid",
81 NSAccessibilityDisclosingAttribute,
82 NSAccessibilityDisclosureLevelAttribute,
83 @"AXAccessKey",
84 @"AXARIAAtomic",
85 @"AXARIABusy",
86 @"AXARIALive",
87 @"AXARIARelevant",
88 NSAccessibilityEnabledAttribute,
89 NSAccessibilityFocusedAttribute,
90 @"AXLoaded",
91 @"AXLoadingProcess",
92 NSAccessibilityNumberOfCharactersAttribute,
93 NSAccessibilityOrientationAttribute,
94 @"AXRequired",
95 NSAccessibilityURLAttribute,
96 NSAccessibilityVisibleCharacterRangeAttribute,
97 @"AXVisited",
98 nil];
99
100 NSArray* defaultAttributes = [NSArray arrayWithObjects:
101 NSAccessibilityTitleAttribute,
102 NSAccessibilityValueAttribute,
103 nil];
104
105 BrowserAccessibilityCocoa* cocoa_node = node->ToBrowserAccessibilityCocoa(); 107 BrowserAccessibilityCocoa* cocoa_node = node->ToBrowserAccessibilityCocoa();
106 NSArray* supportedAttributes = [cocoa_node accessibilityAttributeNames]; 108 NSArray* supportedAttributes = [cocoa_node accessibilityAttributeNames];
107 109
108 Add(true, 110 std::string role = SysNSStringToUTF8(
109 Format("", [cocoa_node accessibilityAttributeValue: 111 [cocoa_node accessibilityAttributeValue:NSAccessibilityRoleAttribute]);
110 NSAccessibilityRoleAttribute], 112 dict->SetString(SysNSStringToUTF8(NSAccessibilityRoleAttribute), role);
111 "")); 113
112 Add(false, 114 NSString* subrole =
113 Format("subrole=", [cocoa_node accessibilityAttributeValue: 115 [cocoa_node accessibilityAttributeValue:NSAccessibilitySubroleAttribute];
114 NSAccessibilitySubroleAttribute], 116 if (subrole != nil) {
115 "")); 117 dict->SetString(SysNSStringToUTF8(NSAccessibilitySubroleAttribute),
116 for (NSString* requestedAttribute in requestedAttributes) { 118 SysNSStringToUTF8(subrole));
119 }
120
121 for (NSString* requestedAttribute in ALL_ATTRIBUTES) {
117 if (![supportedAttributes containsObject:requestedAttribute]) { 122 if (![supportedAttributes containsObject:requestedAttribute]) {
118 continue; 123 continue;
119 } 124 }
120 NSString* methodName = 125 id value = [cocoa_node accessibilityAttributeValue:requestedAttribute];
121 [cocoa_node methodNameForAttribute:requestedAttribute]; 126 if (value != nil) {
122 Add([defaultAttributes containsObject:requestedAttribute], 127 dict->SetString(
123 Format([[NSString stringWithFormat:@"%@='", methodName] 128 SysNSStringToUTF8(requestedAttribute),
124 cStringUsingEncoding:NSUTF8StringEncoding], 129 SysNSStringToUTF16([NSString stringWithFormat:@"%@", value]));
125 [cocoa_node accessibilityAttributeValue: 130 }
126 requestedAttribute],
127 "'"));
128 } 131 }
129 Add(false, FormatPosition(node)); 132 DictionaryValue* position = new DictionaryValue;
130 Add(false, FormatSize(node)); 133 PopulatePosition(*node, position);
134 dict->Set("position", position);
135 DictionaryValue* size = new DictionaryValue;
136 PopulateSize(*node, size);
137 dict->Set("size", size);
138 }
131 139
132 return ASCIIToUTF16(prefix) + FinishLine() + ASCIIToUTF16("\n"); 140 string16 AccessibilityTreeFormatter::ToString(DictionaryValue* dict,
141 const string16& indent) {
142 string16 line;
143 NSArray* defaultAttributes =
144 [NSArray arrayWithObjects:NSAccessibilityTitleAttribute,
145 NSAccessibilityValueAttribute,
146 nil];
147 std::string s_value;
148 dict->GetString(SysNSStringToUTF8(NSAccessibilityRoleAttribute), &s_value);
149 WriteAttribute(true, FormatString("", s_value, ""), &line);
150
151 if (dict->GetString(SysNSStringToUTF8(NSAccessibilitySubroleAttribute),
dmazzoni 2013/04/08 05:46:35 Put SysNSStringToUTF8(NSAccessibilitySubroleAttrib
aboxhall 2013/04/10 03:09:34 Done.
152 &s_value)) {
153 WriteAttribute(
154 false,
155 FormatString((SysNSStringToUTF8(NSAccessibilitySubroleAttribute) + "="),
156 s_value,
157 ""),
158 &line);
159 }
160
161 for (NSString* requestedAttribute in ALL_ATTRIBUTES) {
162 if (!dict->GetString(SysNSStringToUTF8(requestedAttribute), &s_value))
163 continue;
164 NSString* prefix = [NSString stringWithFormat:@"%@='", requestedAttribute];
165 WriteAttribute([defaultAttributes containsObject:requestedAttribute],
166 FormatString(SysNSStringToUTF8(prefix),
167 s_value,
168 "'"),
169 &line);
170 }
171 DictionaryValue* d_value;
172 if (dict->GetDictionary("position", &d_value)) {
173 WriteAttribute(false,
174 FormatCoordinates("position", "x", "y", *d_value),
175 &line);
176 }
177 if (dict->GetDictionary("size", &d_value)) {
178 WriteAttribute(false,
179 FormatCoordinates("size", "width", "height", *d_value),
180 &line);
181 }
182
183 return indent + line + ASCIIToUTF16("\n");
133 } 184 }
134 185
135 // static 186 // static
136 const base::FilePath::StringType 187 const base::FilePath::StringType
137 AccessibilityTreeFormatter::GetActualFileSuffix() { 188 AccessibilityTreeFormatter::GetActualFileSuffix() {
138 return FILE_PATH_LITERAL("-actual-mac.txt"); 189 return FILE_PATH_LITERAL("-actual-mac.txt");
139 } 190 }
140 191
141 // static 192 // static
142 const base::FilePath::StringType 193 const base::FilePath::StringType
(...skipping 10 matching lines...) Expand all
153 const std::string AccessibilityTreeFormatter::GetAllowString() { 204 const std::string AccessibilityTreeFormatter::GetAllowString() {
154 return "@MAC-ALLOW:"; 205 return "@MAC-ALLOW:";
155 } 206 }
156 207
157 // static 208 // static
158 const std::string AccessibilityTreeFormatter::GetDenyString() { 209 const std::string AccessibilityTreeFormatter::GetDenyString() {
159 return "@MAC-DENY:"; 210 return "@MAC-DENY:";
160 } 211 }
161 212
162 } // namespace content 213 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698