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

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

Powered by Google App Engine
This is Rietveld 408576698