Chromium Code Reviews| Index: content/browser/accessibility/accessibility_tree_formatter_mac.mm |
| diff --git a/content/browser/accessibility/accessibility_tree_formatter_mac.mm b/content/browser/accessibility/accessibility_tree_formatter_mac.mm |
| index f5f1964867bc3149c6f98da3f41a29d7d2abaf8b..df972a088dc7f1a81d018c2eade8cf28683da132 100644 |
| --- a/content/browser/accessibility/accessibility_tree_formatter_mac.mm |
| +++ b/content/browser/accessibility/accessibility_tree_formatter_mac.mm |
| @@ -7,129 +7,177 @@ |
| #import <Cocoa/Cocoa.h> |
| #include "base/files/file_path.h" |
| +#include "base/stringprintf.h" |
| +#include "base/strings/sys_string_conversions.h" |
| #include "base/utf_string_conversions.h" |
| #include "content/browser/accessibility/browser_accessibility_cocoa.h" |
| #include "content/browser/accessibility/browser_accessibility_mac.h" |
| #include "content/browser/accessibility/browser_accessibility_manager.h" |
| +using base::StringPrintf; |
| +using base::SysNSStringToUTF8; |
| +using base::SysNSStringToUTF16; |
| +using std::string; |
| + |
| namespace content { |
| namespace { |
| -string16 Format(const char *prefix, |
| - id value, |
| - const char *suffix) { |
| - if (value == nil) |
| - return UTF8ToUTF16(""); |
| - NSString* format_str = |
| - [NSString stringWithFormat:@"%s%%@%s", prefix, suffix]; |
| - NSString* tmp = [NSString stringWithFormat:format_str, value]; |
| - return UTF8ToUTF16([tmp cStringUsingEncoding:NSUTF8StringEncoding]); |
| -} |
| +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.
|
| + |
| +const char* kPositionDictAttr = "position"; |
| +const char* kXCoordDictAttr = "x"; |
| +const char* kYCoordDictAttr = "y"; |
| +const char* kSizeDictAttr = "size"; |
| +const char* kWidthDictAttr = "width"; |
| +const char* kHeightDictAttr = "height"; |
| -string16 FormatPosition(BrowserAccessibility* node) { |
| +scoped_ptr<DictionaryValue> PopulatePosition(const BrowserAccessibility& node) { |
| + scoped_ptr<DictionaryValue> position(new DictionaryValue); |
| // The NSAccessibility position of an object is in global coordinates and |
| // based on the lower-left corner of the object. To make this easier and less |
| // confusing, convert it to local window coordinates using the top-left |
| // corner when dumping the position. |
| - BrowserAccessibility* root = node->manager()->GetRoot(); |
| + BrowserAccessibility* root = node.manager()->GetRoot(); |
| BrowserAccessibilityCocoa* cocoa_root = root->ToBrowserAccessibilityCocoa(); |
| NSPoint root_position = [[cocoa_root position] pointValue]; |
| NSSize root_size = [[cocoa_root size] sizeValue]; |
| int root_top = -static_cast<int>(root_position.y + root_size.height); |
| int root_left = static_cast<int>(root_position.x); |
| - BrowserAccessibilityCocoa* cocoa_node = node->ToBrowserAccessibilityCocoa(); |
| + BrowserAccessibilityCocoa* cocoa_node = |
| + const_cast<BrowserAccessibility*>(&node)->ToBrowserAccessibilityCocoa(); |
| NSPoint node_position = [[cocoa_node position] pointValue]; |
| NSSize node_size = [[cocoa_node size] sizeValue]; |
| - NSString* position_str = |
| - [NSString stringWithFormat:@"position=(%d, %d)", |
| - static_cast<int>(node_position.x - root_left), |
| - static_cast<int>( |
| - -node_position.y - node_size.height - root_top)]; |
| - return UTF8ToUTF16([position_str cStringUsingEncoding:NSUTF8StringEncoding]); |
| + position->SetInteger(kXCoordDictAttr, |
| + static_cast<int>(node_position.x - root_left)); |
| + position->SetInteger(kYCoordDictAttr, |
| + static_cast<int>(-node_position.y - node_size.height - root_top)); |
| + return position.Pass(); |
| } |
| -string16 FormatSize(BrowserAccessibility* node) { |
| - BrowserAccessibilityCocoa* cocoa_node = node->ToBrowserAccessibilityCocoa(); |
| +scoped_ptr<DictionaryValue> |
| +PopulateSize(const BrowserAccessibilityCocoa* cocoa_node) { |
| + scoped_ptr<DictionaryValue> size(new DictionaryValue); |
| NSSize node_size = [[cocoa_node size] sizeValue]; |
| - NSString* size_str = |
| - [NSString stringWithFormat:@"size=(%d, %d)", |
| - static_cast<int>(node_size.width), |
| - static_cast<int>(node_size.height)]; |
| - return UTF8ToUTF16([size_str cStringUsingEncoding:NSUTF8StringEncoding]); |
| + size->SetInteger(kHeightDictAttr, static_cast<int>(node_size.height)); |
| + size->SetInteger(kWidthDictAttr, static_cast<int>(node_size.width)); |
| + return size.Pass(); |
| } |
| } // namespace |
| -void AccessibilityTreeFormatter::Initialize() {} |
| - |
| -string16 AccessibilityTreeFormatter::ToString(BrowserAccessibility* node, |
| - char* prefix) { |
| - StartLine(); |
| - NSArray* requestedAttributes = [NSArray arrayWithObjects: |
| - NSAccessibilityRoleDescriptionAttribute, |
| - NSAccessibilityTitleAttribute, |
| - NSAccessibilityValueAttribute, |
| - NSAccessibilityMinValueAttribute, |
| - NSAccessibilityMaxValueAttribute, |
| - NSAccessibilityValueDescriptionAttribute, |
| - NSAccessibilityDescriptionAttribute, |
| - NSAccessibilityHelpAttribute, |
| - @"AXInvalid", |
| - NSAccessibilityDisclosingAttribute, |
| - NSAccessibilityDisclosureLevelAttribute, |
| - @"AXAccessKey", |
| - @"AXARIAAtomic", |
| - @"AXARIABusy", |
| - @"AXARIALive", |
| - @"AXARIARelevant", |
| - NSAccessibilityEnabledAttribute, |
| - NSAccessibilityFocusedAttribute, |
| - @"AXLoaded", |
| - @"AXLoadingProcess", |
| - NSAccessibilityNumberOfCharactersAttribute, |
| - NSAccessibilityOrientationAttribute, |
| - @"AXRequired", |
| - NSAccessibilityURLAttribute, |
| - NSAccessibilityVisibleCharacterRangeAttribute, |
| - @"AXVisited", |
| - nil]; |
| - |
| - NSArray* defaultAttributes = [NSArray arrayWithObjects: |
| - NSAccessibilityTitleAttribute, |
| - NSAccessibilityValueAttribute, |
| - nil]; |
| - |
| - BrowserAccessibilityCocoa* cocoa_node = node->ToBrowserAccessibilityCocoa(); |
| +void AccessibilityTreeFormatter::Initialize() { |
| + if (ALL_ATTRIBUTES == nil) { |
| + ALL_ATTRIBUTES = [NSArray arrayWithObjects: |
| + NSAccessibilityRoleDescriptionAttribute, |
| + NSAccessibilityTitleAttribute, |
| + NSAccessibilityValueAttribute, |
| + NSAccessibilityMinValueAttribute, |
| + NSAccessibilityMaxValueAttribute, |
| + NSAccessibilityValueDescriptionAttribute, |
| + NSAccessibilityDescriptionAttribute, |
| + NSAccessibilityHelpAttribute, |
| + @"AXInvalid", |
| + NSAccessibilityDisclosingAttribute, |
| + NSAccessibilityDisclosureLevelAttribute, |
| + @"AXAccessKey", |
| + @"AXARIAAtomic", |
| + @"AXARIABusy", |
| + @"AXARIALive", |
| + @"AXARIARelevant", |
| + NSAccessibilityEnabledAttribute, |
| + NSAccessibilityFocusedAttribute, |
| + @"AXLoaded", |
| + @"AXLoadingProcess", |
| + NSAccessibilityNumberOfCharactersAttribute, |
| + NSAccessibilityOrientationAttribute, |
| + @"AXRequired", |
| + NSAccessibilityURLAttribute, |
| + NSAccessibilityVisibleCharacterRangeAttribute, |
| + @"AXVisited", |
| + nil]; |
| + } |
| +} |
| + |
| +void AccessibilityTreeFormatter::AddProperties(const BrowserAccessibility& node, |
| + DictionaryValue* dict) { |
| + BrowserAccessibilityCocoa* cocoa_node = |
| + const_cast<BrowserAccessibility*>(&node)->ToBrowserAccessibilityCocoa(); |
| NSArray* supportedAttributes = [cocoa_node accessibilityAttributeNames]; |
| - Add(true, |
| - Format("", [cocoa_node accessibilityAttributeValue: |
| - NSAccessibilityRoleAttribute], |
| - "")); |
| - Add(false, |
| - Format("subrole=", [cocoa_node accessibilityAttributeValue: |
| - NSAccessibilitySubroleAttribute], |
| - "")); |
| - for (NSString* requestedAttribute in requestedAttributes) { |
| + string role = SysNSStringToUTF8( |
| + [cocoa_node accessibilityAttributeValue:NSAccessibilityRoleAttribute]); |
| + dict->SetString(SysNSStringToUTF8(NSAccessibilityRoleAttribute), role); |
| + |
| + NSString* subrole = |
| + [cocoa_node accessibilityAttributeValue:NSAccessibilitySubroleAttribute]; |
| + if (subrole != nil) { |
| + dict->SetString(SysNSStringToUTF8(NSAccessibilitySubroleAttribute), |
| + SysNSStringToUTF8(subrole)); |
| + } |
| + |
| + for (NSString* requestedAttribute in ALL_ATTRIBUTES) { |
| if (![supportedAttributes containsObject:requestedAttribute]) { |
| continue; |
| } |
| - NSString* methodName = |
| - [cocoa_node methodNameForAttribute:requestedAttribute]; |
| - Add([defaultAttributes containsObject:requestedAttribute], |
| - Format([[NSString stringWithFormat:@"%@='", methodName] |
| - cStringUsingEncoding:NSUTF8StringEncoding], |
| - [cocoa_node accessibilityAttributeValue: |
| - requestedAttribute], |
| - "'")); |
| + id value = [cocoa_node accessibilityAttributeValue:requestedAttribute]; |
| + if (value != nil) { |
| + dict->SetString( |
| + SysNSStringToUTF8(requestedAttribute), |
| + SysNSStringToUTF16([NSString stringWithFormat:@"%@", value])); |
| + } |
| + } |
| + dict->Set(kPositionDictAttr, PopulatePosition(node).release()); |
| + dict->Set(kSizeDictAttr, PopulateSize(cocoa_node).release()); |
| +} |
| + |
| +string16 AccessibilityTreeFormatter::ToString(const DictionaryValue& dict, |
| + const string16& indent) { |
| + string16 line; |
| + NSArray* defaultAttributes = |
| + [NSArray arrayWithObjects:NSAccessibilityTitleAttribute, |
| + NSAccessibilityValueAttribute, |
| + nil]; |
| + string s_value; |
| + dict.GetString(SysNSStringToUTF8(NSAccessibilityRoleAttribute), &s_value); |
| + WriteAttribute(true, UTF8ToUTF16(s_value), &line); |
| + |
| + string subroleAttribute = SysNSStringToUTF8(NSAccessibilitySubroleAttribute); |
| + if (dict.GetString(subroleAttribute, &s_value)) { |
| + WriteAttribute(false, |
| + StringPrintf("%s=%s", |
| + subroleAttribute.c_str(), s_value.c_str()), |
| + &line); |
| + } |
| + |
| + for (NSString* requestedAttribute in ALL_ATTRIBUTES) { |
| + string requestedAttributeUTF8 = SysNSStringToUTF8(requestedAttribute); |
| + if (!dict.GetString(requestedAttributeUTF8, &s_value)) |
| + continue; |
| + WriteAttribute([defaultAttributes containsObject:requestedAttribute], |
| + StringPrintf("%s='%s'", |
| + requestedAttributeUTF8.c_str(), |
| + s_value.c_str()), |
| + &line); |
| + } |
| + const DictionaryValue* d_value = NULL; |
| + if (dict.GetDictionary(kPositionDictAttr, &d_value)) { |
| + WriteAttribute(false, |
| + FormatCoordinates(kPositionDictAttr, |
| + kXCoordDictAttr, kYCoordDictAttr, |
| + *d_value), |
| + &line); |
| + } |
| + if (dict.GetDictionary(kSizeDictAttr, &d_value)) { |
| + WriteAttribute(false, |
| + FormatCoordinates(kSizeDictAttr, |
| + kWidthDictAttr, kHeightDictAttr, *d_value), |
| + &line); |
| } |
| - Add(false, FormatPosition(node)); |
| - Add(false, FormatSize(node)); |
| - return ASCIIToUTF16(prefix) + FinishLine() + ASCIIToUTF16("\n"); |
| + return indent + line + ASCIIToUTF16("\n"); |
| } |
| // static |
| @@ -145,17 +193,17 @@ AccessibilityTreeFormatter::GetExpectedFileSuffix() { |
| } |
| // static |
| -const std::string AccessibilityTreeFormatter::GetAllowEmptyString() { |
| +const string AccessibilityTreeFormatter::GetAllowEmptyString() { |
| return "@MAC-ALLOW-EMPTY:"; |
| } |
| // static |
| -const std::string AccessibilityTreeFormatter::GetAllowString() { |
| +const string AccessibilityTreeFormatter::GetAllowString() { |
| return "@MAC-ALLOW:"; |
| } |
| // static |
| -const std::string AccessibilityTreeFormatter::GetDenyString() { |
| +const string AccessibilityTreeFormatter::GetDenyString() { |
| return "@MAC-DENY:"; |
| } |