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

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: Lazy initialize ALL_ATTRIBUTES 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::StringPrintf;
18 using base::SysNSStringToUTF8;
19 using base::SysNSStringToUTF16;
20 using std::string;
21
15 namespace content { 22 namespace content {
16 23
17 namespace { 24 namespace {
18 25
19 string16 Format(const char *prefix, 26 NSArray* ALL_ATTRIBUTES = nil;
dmazzoni 2013/04/18 23:05:14 I think all caps should only be for constants - ho
aboxhall 2013/04/19 18:09:50 Done.
20 id value,
21 const char *suffix) {
22 if (value == nil)
23 return UTF8ToUTF16("");
24 NSString* format_str =
25 [NSString stringWithFormat:@"%s%%@%s", prefix, suffix];
26 NSString* tmp = [NSString stringWithFormat:format_str, value];
27 return UTF8ToUTF16([tmp cStringUsingEncoding:NSUTF8StringEncoding]);
28 }
29 27
30 string16 FormatPosition(BrowserAccessibility* node) { 28 const char* kPositionDictAttr = "position";
29 const char* kXCoordDictAttr = "x";
30 const char* kYCoordDictAttr = "y";
31 const char* kSizeDictAttr = "size";
32 const char* kWidthDictAttr = "width";
33 const char* kHeightDictAttr = "height";
34
35 scoped_ptr<DictionaryValue> PopulatePosition(const BrowserAccessibility& node) {
36 scoped_ptr<DictionaryValue> position(new DictionaryValue);
31 // The NSAccessibility position of an object is in global coordinates and 37 // 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 38 // 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 39 // confusing, convert it to local window coordinates using the top-left
34 // corner when dumping the position. 40 // corner when dumping the position.
35 BrowserAccessibility* root = node->manager()->GetRoot(); 41 BrowserAccessibility* root = node.manager()->GetRoot();
36 BrowserAccessibilityCocoa* cocoa_root = root->ToBrowserAccessibilityCocoa(); 42 BrowserAccessibilityCocoa* cocoa_root = root->ToBrowserAccessibilityCocoa();
37 NSPoint root_position = [[cocoa_root position] pointValue]; 43 NSPoint root_position = [[cocoa_root position] pointValue];
38 NSSize root_size = [[cocoa_root size] sizeValue]; 44 NSSize root_size = [[cocoa_root size] sizeValue];
39 int root_top = -static_cast<int>(root_position.y + root_size.height); 45 int root_top = -static_cast<int>(root_position.y + root_size.height);
40 int root_left = static_cast<int>(root_position.x); 46 int root_left = static_cast<int>(root_position.x);
41 47
42 BrowserAccessibilityCocoa* cocoa_node = node->ToBrowserAccessibilityCocoa(); 48 BrowserAccessibilityCocoa* cocoa_node =
49 const_cast<BrowserAccessibility*>(&node)->ToBrowserAccessibilityCocoa();
43 NSPoint node_position = [[cocoa_node position] pointValue]; 50 NSPoint node_position = [[cocoa_node position] pointValue];
44 NSSize node_size = [[cocoa_node size] sizeValue]; 51 NSSize node_size = [[cocoa_node size] sizeValue];
45 52
46 NSString* position_str = 53 position->SetInteger(kXCoordDictAttr,
47 [NSString stringWithFormat:@"position=(%d, %d)", 54 static_cast<int>(node_position.x - root_left));
48 static_cast<int>(node_position.x - root_left), 55 position->SetInteger(kYCoordDictAttr,
49 static_cast<int>( 56 static_cast<int>(-node_position.y - node_size.height - root_top));
50 -node_position.y - node_size.height - root_top)]; 57 return position.Pass();
51 return UTF8ToUTF16([position_str cStringUsingEncoding:NSUTF8StringEncoding]);
52 } 58 }
53 59
54 string16 FormatSize(BrowserAccessibility* node) { 60 scoped_ptr<DictionaryValue>
55 BrowserAccessibilityCocoa* cocoa_node = node->ToBrowserAccessibilityCocoa(); 61 PopulateSize(const BrowserAccessibilityCocoa* cocoa_node) {
62 scoped_ptr<DictionaryValue> size(new DictionaryValue);
56 NSSize node_size = [[cocoa_node size] sizeValue]; 63 NSSize node_size = [[cocoa_node size] sizeValue];
57 NSString* size_str = 64 size->SetInteger(kHeightDictAttr, static_cast<int>(node_size.height));
58 [NSString stringWithFormat:@"size=(%d, %d)", 65 size->SetInteger(kWidthDictAttr, static_cast<int>(node_size.width));
59 static_cast<int>(node_size.width), 66 return size.Pass();
60 static_cast<int>(node_size.height)];
61 return UTF8ToUTF16([size_str cStringUsingEncoding:NSUTF8StringEncoding]);
62 } 67 }
63 68
64 } // namespace 69 } // namespace
65 70
66 void AccessibilityTreeFormatter::Initialize() {} 71 void AccessibilityTreeFormatter::Initialize() {
72 if (ALL_ATTRIBUTES == nil) {
73 ALL_ATTRIBUTES = [NSArray arrayWithObjects:
74 NSAccessibilityRoleDescriptionAttribute,
75 NSAccessibilityTitleAttribute,
76 NSAccessibilityValueAttribute,
77 NSAccessibilityMinValueAttribute,
78 NSAccessibilityMaxValueAttribute,
79 NSAccessibilityValueDescriptionAttribute,
80 NSAccessibilityDescriptionAttribute,
81 NSAccessibilityHelpAttribute,
82 @"AXInvalid",
83 NSAccessibilityDisclosingAttribute,
84 NSAccessibilityDisclosureLevelAttribute,
85 @"AXAccessKey",
86 @"AXARIAAtomic",
87 @"AXARIABusy",
88 @"AXARIALive",
89 @"AXARIARelevant",
90 NSAccessibilityEnabledAttribute,
91 NSAccessibilityFocusedAttribute,
92 @"AXLoaded",
93 @"AXLoadingProcess",
94 NSAccessibilityNumberOfCharactersAttribute,
95 NSAccessibilityOrientationAttribute,
96 @"AXRequired",
97 NSAccessibilityURLAttribute,
98 NSAccessibilityVisibleCharacterRangeAttribute,
99 @"AXVisited",
100 nil];
101 }
102 }
67 103
68 string16 AccessibilityTreeFormatter::ToString(BrowserAccessibility* node, 104 void AccessibilityTreeFormatter::AddProperties(const BrowserAccessibility& node,
69 char* prefix) { 105 DictionaryValue* dict) {
70 StartLine(); 106 BrowserAccessibilityCocoa* cocoa_node =
71 NSArray* requestedAttributes = [NSArray arrayWithObjects: 107 const_cast<BrowserAccessibility*>(&node)->ToBrowserAccessibilityCocoa();
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();
106 NSArray* supportedAttributes = [cocoa_node accessibilityAttributeNames]; 108 NSArray* supportedAttributes = [cocoa_node accessibilityAttributeNames];
107 109
108 Add(true, 110 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 dict->Set(kPositionDictAttr, PopulatePosition(node).release());
130 Add(false, FormatSize(node)); 133 dict->Set(kSizeDictAttr, PopulateSize(cocoa_node).release());
134 }
131 135
132 return ASCIIToUTF16(prefix) + FinishLine() + ASCIIToUTF16("\n"); 136 string16 AccessibilityTreeFormatter::ToString(const DictionaryValue& dict,
137 const string16& indent) {
138 string16 line;
139 NSArray* defaultAttributes =
140 [NSArray arrayWithObjects:NSAccessibilityTitleAttribute,
141 NSAccessibilityValueAttribute,
142 nil];
143 string s_value;
144 dict.GetString(SysNSStringToUTF8(NSAccessibilityRoleAttribute), &s_value);
145 WriteAttribute(true, UTF8ToUTF16(s_value), &line);
146
147 string subroleAttribute = SysNSStringToUTF8(NSAccessibilitySubroleAttribute);
148 if (dict.GetString(subroleAttribute, &s_value)) {
149 WriteAttribute(false,
150 StringPrintf("%s=%s",
151 subroleAttribute.c_str(), s_value.c_str()),
152 &line);
153 }
154
155 for (NSString* requestedAttribute in ALL_ATTRIBUTES) {
156 string requestedAttributeUTF8 = SysNSStringToUTF8(requestedAttribute);
157 if (!dict.GetString(requestedAttributeUTF8, &s_value))
158 continue;
159 WriteAttribute([defaultAttributes containsObject:requestedAttribute],
160 StringPrintf("%s='%s'",
161 requestedAttributeUTF8.c_str(),
162 s_value.c_str()),
163 &line);
164 }
165 const DictionaryValue* d_value = NULL;
166 if (dict.GetDictionary(kPositionDictAttr, &d_value)) {
167 WriteAttribute(false,
168 FormatCoordinates(kPositionDictAttr,
169 kXCoordDictAttr, kYCoordDictAttr,
170 *d_value),
171 &line);
172 }
173 if (dict.GetDictionary(kSizeDictAttr, &d_value)) {
174 WriteAttribute(false,
175 FormatCoordinates(kSizeDictAttr,
176 kWidthDictAttr, kHeightDictAttr, *d_value),
177 &line);
178 }
179
180 return indent + line + ASCIIToUTF16("\n");
133 } 181 }
134 182
135 // static 183 // static
136 const base::FilePath::StringType 184 const base::FilePath::StringType
137 AccessibilityTreeFormatter::GetActualFileSuffix() { 185 AccessibilityTreeFormatter::GetActualFileSuffix() {
138 return FILE_PATH_LITERAL("-actual-mac.txt"); 186 return FILE_PATH_LITERAL("-actual-mac.txt");
139 } 187 }
140 188
141 // static 189 // static
142 const base::FilePath::StringType 190 const base::FilePath::StringType
143 AccessibilityTreeFormatter::GetExpectedFileSuffix() { 191 AccessibilityTreeFormatter::GetExpectedFileSuffix() {
144 return FILE_PATH_LITERAL("-expected-mac.txt"); 192 return FILE_PATH_LITERAL("-expected-mac.txt");
145 } 193 }
146 194
147 // static 195 // static
148 const std::string AccessibilityTreeFormatter::GetAllowEmptyString() { 196 const string AccessibilityTreeFormatter::GetAllowEmptyString() {
149 return "@MAC-ALLOW-EMPTY:"; 197 return "@MAC-ALLOW-EMPTY:";
150 } 198 }
151 199
152 // static 200 // static
153 const std::string AccessibilityTreeFormatter::GetAllowString() { 201 const string AccessibilityTreeFormatter::GetAllowString() {
154 return "@MAC-ALLOW:"; 202 return "@MAC-ALLOW:";
155 } 203 }
156 204
157 // static 205 // static
158 const std::string AccessibilityTreeFormatter::GetDenyString() { 206 const string AccessibilityTreeFormatter::GetDenyString() {
159 return "@MAC-DENY:"; 207 return "@MAC-DENY:";
160 } 208 }
161 209
162 } // namespace content 210 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698