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..4376e9bfeadb650787aae6bc6d424d509c13a280 100644 |
--- a/content/browser/accessibility/accessibility_tree_formatter_mac.mm |
+++ b/content/browser/accessibility/accessibility_tree_formatter_mac.mm |
@@ -7,129 +7,180 @@ |
#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::SysNSStringToUTF8; |
+using base::SysNSStringToUTF16; |
+ |
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 = [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]; |
+ |
+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
|
+ std::string& value, |
+ std::string suffix) { |
+ return UTF8ToUTF16(prefix) + UTF8ToUTF16(value) + UTF8ToUTF16(suffix); |
+} |
+ |
+string16 FormatCoordinates(std::string name, |
+ std::string x_name, |
+ std::string y_name, |
+ const DictionaryValue& value) { |
+ int x, y; |
+ value.GetInteger(x_name, &x); |
+ value.GetInteger(y_name, &y); |
+ NSString* xy_str = |
+ [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.
|
+ |
+ return SysNSStringToUTF16(xy_str); |
} |
-string16 FormatPosition(BrowserAccessibility* node) { |
+void PopulatePosition(BrowserAccessibility& node, |
+ DictionaryValue* position) { |
// 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 = 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("x", static_cast<int>(node_position.x - root_left)); |
+ position->SetInteger("y", |
+ static_cast<int>(-node_position.y - node_size.height - root_top)); |
} |
-string16 FormatSize(BrowserAccessibility* node) { |
- BrowserAccessibilityCocoa* cocoa_node = node->ToBrowserAccessibilityCocoa(); |
+void PopulateSize(BrowserAccessibility& node, DictionaryValue* size) { |
+ BrowserAccessibilityCocoa* cocoa_node = node.ToBrowserAccessibilityCocoa(); |
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("height", static_cast<int>(node_size.height)); |
+ size->SetInteger("width", static_cast<int>(node_size.width)); |
} |
} // 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]; |
- |
+void AccessibilityTreeFormatter::AddProperties(BrowserAccessibility* node, |
+ DictionaryValue* dict) { |
BrowserAccessibilityCocoa* cocoa_node = 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) { |
+ std::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])); |
+ } |
+ } |
+ DictionaryValue* position = new DictionaryValue; |
+ PopulatePosition(*node, position); |
+ dict->Set("position", position); |
+ DictionaryValue* size = new DictionaryValue; |
+ PopulateSize(*node, size); |
+ dict->Set("size", size); |
+} |
+ |
+string16 AccessibilityTreeFormatter::ToString(DictionaryValue* dict, |
+ const string16& indent) { |
+ string16 line; |
+ NSArray* defaultAttributes = |
+ [NSArray arrayWithObjects:NSAccessibilityTitleAttribute, |
+ NSAccessibilityValueAttribute, |
+ nil]; |
+ std::string s_value; |
+ dict->GetString(SysNSStringToUTF8(NSAccessibilityRoleAttribute), &s_value); |
+ WriteAttribute(true, FormatString("", s_value, ""), &line); |
+ |
+ if (dict->GetString(SysNSStringToUTF8(NSAccessibilitySubroleAttribute), |
dmazzoni
2013/04/08 05:46:35
Put SysNSStringToUTF8(NSAccessibilitySubroleAttrib
aboxhall
2013/04/10 03:09:34
Done.
|
+ &s_value)) { |
+ WriteAttribute( |
+ false, |
+ FormatString((SysNSStringToUTF8(NSAccessibilitySubroleAttribute) + "="), |
+ s_value, |
+ ""), |
+ &line); |
+ } |
+ |
+ for (NSString* requestedAttribute in ALL_ATTRIBUTES) { |
+ if (!dict->GetString(SysNSStringToUTF8(requestedAttribute), &s_value)) |
+ continue; |
+ NSString* prefix = [NSString stringWithFormat:@"%@='", requestedAttribute]; |
+ WriteAttribute([defaultAttributes containsObject:requestedAttribute], |
+ FormatString(SysNSStringToUTF8(prefix), |
+ s_value, |
+ "'"), |
+ &line); |
+ } |
+ DictionaryValue* d_value; |
+ if (dict->GetDictionary("position", &d_value)) { |
+ WriteAttribute(false, |
+ FormatCoordinates("position", "x", "y", *d_value), |
+ &line); |
+ } |
+ if (dict->GetDictionary("size", &d_value)) { |
+ WriteAttribute(false, |
+ FormatCoordinates("size", "width", "height", *d_value), |
+ &line); |
} |
- Add(false, FormatPosition(node)); |
- Add(false, FormatSize(node)); |
- return ASCIIToUTF16(prefix) + FinishLine() + ASCIIToUTF16("\n"); |
+ return indent + line + ASCIIToUTF16("\n"); |
} |
// static |