Chromium Code Reviews| 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 |