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/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 Loading... | |
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 |
OLD | NEW |