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

Unified Diff: content/browser/accessibility/accessibility_tree_formatter_mac.mm

Issue 175613002: Include relationship ARIA objects in serialized accessibility tree (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reuse MAYBE(x) for failing android test Created 6 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | content/browser/accessibility/browser_accessibility_cocoa.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 230cd8d3ff544ab55fccabac8ae7db387b58ffc1..f9321ee14b381a89df9c0628e2f7739ec06197d9 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_mac.mm
+++ b/content/browser/accessibility/accessibility_tree_formatter_mac.mm
@@ -83,6 +83,49 @@ bool IsRangeValue(id value) {
return 0 == strcmp([value objCType], @encode(NSRange));
}
+scoped_ptr<base::Value> PopulateObject(id value);
+
+scoped_ptr<base::ListValue> PopulateArray(NSArray* array) {
+ scoped_ptr<base::ListValue> list(new base::ListValue);
+ for (NSUInteger i = 0; i < [array count]; i++)
+ list->Append(PopulateObject([array objectAtIndex:i]).release());
+ return list.Pass();
+}
+
+scoped_ptr<base::StringValue> StringForBrowserAccessibility(
+ BrowserAccessibilityCocoa* obj) {
+ NSString* description = [obj role];
+ id value = [obj value];
+ id roleDescription = [obj roleDescription];
+ if (value != nil && ![value isEqualToString:@""]) {
+ description = [NSString stringWithFormat:@"%@ %@", description, value];
+ } else if ([description isEqualToString:NSAccessibilityGroupRole] &&
+ roleDescription != nil &&
+ ![roleDescription isEqualToString:@""]) {
+ description = [NSString stringWithFormat:@"%@ %@",
+ description, roleDescription];
+ }
+ return scoped_ptr<base::StringValue>(
+ new base::StringValue(SysNSStringToUTF16(description))).Pass();
+}
+
+scoped_ptr<base::Value> PopulateObject(id value) {
+ if ([value isKindOfClass:[NSArray class]])
+ return scoped_ptr<base::Value>(PopulateArray((NSArray*) value));
+ if (IsRangeValue(value))
+ return scoped_ptr<base::Value>(PopulateRange([value rangeValue]));
+ if ([value isKindOfClass:[BrowserAccessibilityCocoa class]]) {
+ std::string str;
+ StringForBrowserAccessibility(value)->GetAsString(&str);
+ return scoped_ptr<base::Value>(StringForBrowserAccessibility(
+ (BrowserAccessibilityCocoa*) value));
+ }
+
+ return scoped_ptr<base::Value>(
+ new base::StringValue(
+ SysNSStringToUTF16([NSString stringWithFormat:@"%@", value]))).Pass();
+}
+
NSArray* BuildAllAttributesArray() {
NSArray* array = [NSArray arrayWithObjects:
NSAccessibilityRoleDescriptionAttribute,
@@ -111,9 +154,11 @@ NSArray* BuildAllAttributesArray() {
NSAccessibilityOrientationAttribute,
@"AXRequired",
NSAccessibilityRowIndexRangeAttribute,
+ NSAccessibilityTitleUIElementAttribute,
NSAccessibilityURLAttribute,
NSAccessibilityVisibleCharacterRangeAttribute,
@"AXVisited",
+ @"AXLinkedUIElements",
nil];
return [array retain];
}
@@ -143,18 +188,13 @@ void AccessibilityTreeFormatter::AddProperties(const BrowserAccessibility& node,
CR_DEFINE_STATIC_LOCAL(NSArray*, all_attributes, (BuildAllAttributesArray()));
for (NSString* requestedAttribute in all_attributes) {
- if (![supportedAttributes containsObject:requestedAttribute]) {
+ if (![supportedAttributes containsObject:requestedAttribute])
continue;
- }
id value = [cocoa_node accessibilityAttributeValue:requestedAttribute];
- if (IsRangeValue(value)) {
+ if (value != nil) {
dict->Set(
SysNSStringToUTF8(requestedAttribute),
- PopulateRange([value rangeValue]).release());
- } else if (value != nil) {
- dict->SetString(
- SysNSStringToUTF8(requestedAttribute),
- SysNSStringToUTF16([NSString stringWithFormat:@"%@", value]));
+ PopulateObject(value).release());
}
}
dict->Set(kPositionDictAttr, PopulatePosition(node).release());
@@ -184,10 +224,18 @@ base::string16 AccessibilityTreeFormatter::ToString(
CR_DEFINE_STATIC_LOCAL(NSArray*, all_attributes, (BuildAllAttributesArray()));
for (NSString* requestedAttribute in all_attributes) {
string requestedAttributeUTF8 = SysNSStringToUTF8(requestedAttribute);
- const base::DictionaryValue* d_value;
- if (dict.GetDictionary(requestedAttributeUTF8, &d_value)) {
+ if (dict.GetString(requestedAttributeUTF8, &s_value)) {
+ WriteAttribute([defaultAttributes containsObject:requestedAttribute],
+ StringPrintf("%s='%s'",
+ requestedAttributeUTF8.c_str(),
+ s_value.c_str()),
+ &line);
+ continue;
+ }
+ const base::Value* value;
+ if (dict.Get(requestedAttributeUTF8, &value)) {
std::string json_value;
- base::JSONWriter::Write(d_value, &json_value);
+ base::JSONWriter::Write(value, &json_value);
WriteAttribute(
[defaultAttributes containsObject:requestedAttribute],
StringPrintf("%s=%s",
@@ -195,13 +243,6 @@ base::string16 AccessibilityTreeFormatter::ToString(
json_value.c_str()),
&line);
}
- if (!dict.GetString(requestedAttributeUTF8, &s_value))
- continue;
- WriteAttribute([defaultAttributes containsObject:requestedAttribute],
- StringPrintf("%s='%s'",
- requestedAttributeUTF8.c_str(),
- s_value.c_str()),
- &line);
}
const base::DictionaryValue* d_value = NULL;
if (dict.GetDictionary(kPositionDictAttr, &d_value)) {
« no previous file with comments | « no previous file | content/browser/accessibility/browser_accessibility_cocoa.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698