diff options
author | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-23 22:13:54 +0000 |
---|---|---|
committer | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-23 22:13:54 +0000 |
commit | d61ef69258a7dea51a481af0cd62edff6a7e786f (patch) | |
tree | 79fd1923e5885d995a5f5d523c533503ee81af39 /content/browser/accessibility | |
parent | db5fd5f0bfe88fd8a72b4fc8902752d26bf773f2 (diff) | |
download | chromium_src-d61ef69258a7dea51a481af0cd62edff6a7e786f.zip chromium_src-d61ef69258a7dea51a481af0cd62edff6a7e786f.tar.gz chromium_src-d61ef69258a7dea51a481af0cd62edff6a7e786f.tar.bz2 |
Add 13 more accessibility tests and fix bugs encountered.
See bug for more info. Adds tests for 13 more html tags,
aria roles, and aria attributes, and attempts to fix the
code so that as many of those tests pass as possible.
BUG=170574
Review URL: https://chromiumcodereview.appspot.com/11971032
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@178396 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/accessibility')
7 files changed, 186 insertions, 40 deletions
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.h b/content/browser/accessibility/browser_accessibility_cocoa.h index 79b39ae..3e91deb 100644 --- a/content/browser/accessibility/browser_accessibility_cocoa.h +++ b/content/browser/accessibility/browser_accessibility_cocoa.h @@ -10,6 +10,7 @@ #import "base/memory/scoped_nsobject.h" #import "content/browser/accessibility/browser_accessibility_delegate_mac.h" #include "content/browser/accessibility/browser_accessibility.h" +#include "content/common/accessibility_node_data.h" // BrowserAccessibilityCocoa is a cocoa wrapper around the BrowserAccessibility // object. The renderer converts webkit's accessibility tree into a @@ -32,6 +33,10 @@ // Invalidate children for a non-ignored ancestor (including self). - (void)childrenChanged; +// Convenience method to get the internal, cross-platform role +// from browserAccessibility_. +- (content::AccessibilityNodeData::Role)internalRole; + // Children is an array of BrowserAccessibility objects, representing // the accessibility children of this object. @property(nonatomic, readonly) NSArray* children; diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm index b877ea6..62ccb02 100644 --- a/content/browser/accessibility/browser_accessibility_cocoa.mm +++ b/content/browser/accessibility/browser_accessibility_cocoa.mm @@ -162,6 +162,7 @@ RoleMap BuildRoleMap() { { AccessibilityNodeData::ROLE_SPLIT_GROUP, NSAccessibilitySplitGroupRole }, { AccessibilityNodeData::ROLE_STATIC_TEXT, NSAccessibilityStaticTextRole }, { AccessibilityNodeData::ROLE_STATUS, NSAccessibilityGroupRole }, + { AccessibilityNodeData::ROLE_SVG_ROOT, NSAccessibilityGroupRole }, { AccessibilityNodeData::ROLE_SYSTEM_WIDE, NSAccessibilityUnknownRole }, { AccessibilityNodeData::ROLE_TAB, NSAccessibilityRadioButtonRole }, { AccessibilityNodeData::ROLE_TAB_LIST, NSAccessibilityTabGroupRole }, @@ -271,6 +272,10 @@ NSDictionary* attributeToMethodNameMap = nil; { NSAccessibilityChildrenAttribute, @"children" }, { NSAccessibilityColumnsAttribute, @"columns" }, { NSAccessibilityDescriptionAttribute, @"description" }, + { NSAccessibilityDisclosingAttribute, @"disclosing" }, + { NSAccessibilityDisclosedByRowAttribute, @"disclosedByRow" }, + { NSAccessibilityDisclosureLevelAttribute, @"disclosureLevel" }, + { NSAccessibilityDisclosedRowsAttribute, @"disclosedRows" }, { NSAccessibilityEnabledAttribute, @"enabled" }, { NSAccessibilityFocusedAttribute, @"focused" }, { NSAccessibilityHelpAttribute, @"help" }, @@ -459,6 +464,42 @@ NSDictionary* attributeToMethodNameMap = nil; return @""; } +- (NSNumber*)disclosing { + if ([self internalRole] == AccessibilityNodeData::ROLE_TREE_ITEM) { + return [NSNumber numberWithBool: + GetState(browserAccessibility_, AccessibilityNodeData::STATE_EXPANDED)]; + } else { + return nil; + } +} + +- (id)disclosedByRow { + // The row that contains this row. + // It should be the same as the first parent that is a treeitem. + return nil; +} + +- (id)disclosureLevel { + AccessibilityNodeData::Role role = [self internalRole]; + if (role == AccessibilityNodeData::ROLE_ROW || + role == AccessibilityNodeData::ROLE_TREE_ITEM) { + int level = 0; + browserAccessibility_->GetIntAttribute( + AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, &level); + // Mac disclosureLevel is 0-based, but web levels are 1-based. + if (level > 0) + level--; + return [NSNumber numberWithInt:level]; + } else { + return nil; + } +} + +- (id)disclosedRows { + // The rows that are considered inside this row. + return nil; +} + - (NSNumber*)enabled { return [NSNumber numberWithBool: !GetState(browserAccessibility_, @@ -524,9 +565,7 @@ NSDictionary* attributeToMethodNameMap = nil; - (NSString*)orientation { // We present a spin button as a vertical slider, with a role description // of "spin button". - AccessibilityNodeData::Role internal_role = - static_cast<AccessibilityNodeData::Role>(browserAccessibility_->role()); - if (internal_role == AccessibilityNodeData::ROLE_SPIN_BUTTON) + if ([self internalRole] == AccessibilityNodeData::ROLE_SPIN_BUTTON) return NSAccessibilityVerticalOrientationValue; if (GetState(browserAccessibility_, AccessibilityNodeData::STATE_VERTICAL)) @@ -567,13 +606,15 @@ NSDictionary* attributeToMethodNameMap = nil; GetState(browserAccessibility_, AccessibilityNodeData::STATE_REQUIRED)]; } -// Returns a string indicating the role of this object. -- (NSString*)role { - AccessibilityNodeData::Role browserAccessibilityRole = - static_cast<AccessibilityNodeData::Role>( browserAccessibility_->role()); +// Returns an enum indicating the role from browserAccessibility_. +- (AccessibilityNodeData::Role)internalRole { + return static_cast<AccessibilityNodeData::Role>( + browserAccessibility_->role()); +} - // Roles that we only determine at runtime. - return NativeRoleFromAccessibilityNodeDataRole(browserAccessibilityRole); +// Returns a string indicating the NSAccessibility role of this object. +- (NSString*)role { + return NativeRoleFromAccessibilityNodeDataRole([self internalRole]); } // Returns a string indicating the role description of this object. @@ -602,9 +643,7 @@ NSDictionary* attributeToMethodNameMap = nil; [role isEqualToString:NSAccessibilityRadioButtonRole]) { const std::vector<std::pair<string16, string16> >& htmlAttributes = browserAccessibility_->html_attributes(); - AccessibilityNodeData::Role browserAccessibilityRole = - static_cast<AccessibilityNodeData::Role>(browserAccessibility_->role()); - + AccessibilityNodeData::Role browserAccessibilityRole = [self internalRole]; if ((browserAccessibilityRole != AccessibilityNodeData::ROLE_GROUP && browserAccessibilityRole != AccessibilityNodeData::ROLE_LIST_ITEM) || browserAccessibilityRole == AccessibilityNodeData::ROLE_TAB) { @@ -618,9 +657,7 @@ NSDictionary* attributeToMethodNameMap = nil; } } - AccessibilityNodeData::Role internal_role = - static_cast<AccessibilityNodeData::Role>(browserAccessibility_->role()); - switch(internal_role) { + switch([self internalRole]) { case AccessibilityNodeData::ROLE_FOOTER: return base::SysUTF16ToNSString(content_client->GetLocalizedString( IDS_AX_ROLE_FOOTER)); @@ -653,8 +690,7 @@ NSDictionary* attributeToMethodNameMap = nil; // Returns a subrole based upon the role. - (NSString*) subrole { - AccessibilityNodeData::Role browserAccessibilityRole = - static_cast<AccessibilityNodeData::Role>(browserAccessibility_->role()); + AccessibilityNodeData::Role browserAccessibilityRole = [self internalRole]; if (browserAccessibilityRole == AccessibilityNodeData::ROLE_TEXT_FIELD && GetState(browserAccessibility_, AccessibilityNodeData::STATE_PROTECTED)) { return @"AXSecureTextField"; @@ -680,7 +716,7 @@ NSDictionary* attributeToMethodNameMap = nil; - (NSArray*)tabs { NSMutableArray* tabSubtree = [[[NSMutableArray alloc] init] autorelease]; - if (browserAccessibility_->role() == AccessibilityNodeData::ROLE_TAB) + if ([self internalRole] == AccessibilityNodeData::ROLE_TAB) [tabSubtree addObject:self]; for (uint i=0; i < [[self children] count]; ++i) { @@ -724,13 +760,10 @@ NSDictionary* attributeToMethodNameMap = nil; // to approximate Cocoa ax behavior best as we can. NSString* role = [self role]; if ([role isEqualToString:@"AXHeading"]) { - NSString* headingLevel = - NSStringForStringAttribute( - browserAccessibility_->string_attributes(), - AccessibilityNodeData::ATTR_HTML_TAG); - if ([headingLevel length] >= 2) { - return [NSNumber numberWithInt: - [[headingLevel substringFromIndex:1] intValue]]; + int level; + if (browserAccessibility_->GetIntAttribute( + AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, &level)) { + return [NSNumber numberWithInt:level]; } } else if ([role isEqualToString:NSAccessibilityButtonRole]) { // AXValue does not make sense for pure buttons. @@ -759,6 +792,17 @@ NSDictionary* attributeToMethodNameMap = nil; AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &floatValue)) { return [NSNumber numberWithFloat:floatValue]; } + } else if ([role isEqualToString:NSAccessibilityColorWellRole]) { + int r, g, b; + browserAccessibility_->GetIntAttribute( + AccessibilityNodeData::ATTR_COLOR_VALUE_RED, &r); + browserAccessibility_->GetIntAttribute( + AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN, &g); + browserAccessibility_->GetIntAttribute( + AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE, &b); + // This string matches the one returned by a native Mac color well. + return [NSString stringWithFormat:@"rgb %7.5f %7.5f %7.5f 1", + r / 255., g / 255., b / 255.]; } return base::SysUTF16ToNSString(browserAccessibility_->value()); @@ -966,6 +1010,7 @@ NSDictionary* attributeToMethodNameMap = nil; // Specific role attributes. NSString* role = [self role]; + NSString* subrole = [self subrole]; if ([role isEqualToString:NSAccessibilityTableRole]) { [ret addObjectsFromArray:[NSArray arrayWithObjects: NSAccessibilityColumnsAttribute, @@ -996,6 +1041,13 @@ NSDictionary* attributeToMethodNameMap = nil; NSAccessibilityOrientationAttribute, NSAccessibilityValueDescriptionAttribute, nil]]; + } else if ([subrole isEqualToString:NSAccessibilityOutlineRowSubrole]) { + [ret addObjectsFromArray:[NSArray arrayWithObjects: + NSAccessibilityDisclosingAttribute, + NSAccessibilityDisclosedByRowAttribute, + NSAccessibilityDisclosureLevelAttribute, + NSAccessibilityDisclosedRowsAttribute, + nil]]; } // Live regions. diff --git a/content/browser/accessibility/browser_accessibility_win.cc b/content/browser/accessibility/browser_accessibility_win.cc index 52b588f..e59e1b6 100644 --- a/content/browser/accessibility/browser_accessibility_win.cc +++ b/content/browser/accessibility/browser_accessibility_win.cc @@ -2627,18 +2627,12 @@ void BrowserAccessibilityWin::PreInitialize() { InitRoleAndState(); - // Expose headings levels with the "level" attribute. - if (role_ == AccessibilityNodeData::ROLE_HEADING && role_name_.size() == 2 && - IsAsciiDigit(role_name_[1])) { - ia2_attributes_.push_back(string16(L"level:") + role_name_.substr(1)); - } - // Expose the "display" and "tag" attributes. StringAttributeToIA2(AccessibilityNodeData::ATTR_DISPLAY, "display"); StringAttributeToIA2(AccessibilityNodeData::ATTR_HTML_TAG, "tag"); StringAttributeToIA2(AccessibilityNodeData::ATTR_ROLE, "xml-roles"); - // Expose "level" attribute for tree nodes. + // Expose "level" attribute for headings, trees, etc. IntAttributeToIA2(AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, "level"); // Expose the set size and position in set for listbox options. @@ -2651,6 +2645,12 @@ void BrowserAccessibilityWin::PreInitialize() { L"setsize:" + base::IntToString16(index_in_parent_ + 1)); } + if (ia_role_ == ROLE_SYSTEM_CHECKBUTTON || + ia_role_ == ROLE_SYSTEM_RADIOBUTTON || + ia2_role_ == IA2_ROLE_TOGGLE_BUTTON) { + ia2_attributes_.push_back(L"checkable:true"); + } + // Expose live region attributes. StringAttributeToIA2(AccessibilityNodeData::ATTR_LIVE_STATUS, "live"); StringAttributeToIA2(AccessibilityNodeData::ATTR_LIVE_RELEVANT, "relevant"); @@ -2680,6 +2680,17 @@ void BrowserAccessibilityWin::PreInitialize() { ia2_attributes_.push_back(L"valuetext:" + value_); } + // Expose color well value. + if (ia2_role_ == IA2_ROLE_COLOR_CHOOSER) { + int r, g, b; + GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_RED, &r); + GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN, &g); + GetIntAttribute(AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE, &b); + value_ = base::IntToString16((r * 100) / 255) + L"% red " + + base::IntToString16((g * 100) / 255) + L"% green " + + base::IntToString16((b * 100) / 255) + L"% blue"; + } + // Expose table cell index. if (ia_role_ == ROLE_SYSTEM_CELL) { BrowserAccessibility* table = parent(); @@ -3367,13 +3378,23 @@ void BrowserAccessibilityWin::InitRoleAndState() { case AccessibilityNodeData::ROLE_SPLITTER: ia_role_ = ROLE_SYSTEM_SEPARATOR; break; + case AccessibilityNodeData::ROLE_SVG_ROOT: + ia_role_ = ROLE_SYSTEM_GRAPHIC; + break; case AccessibilityNodeData::ROLE_TAB: ia_role_ = ROLE_SYSTEM_PAGETAB; break; - case AccessibilityNodeData::ROLE_TABLE: - ia_role_ = ROLE_SYSTEM_TABLE; - ia_state_ |= STATE_SYSTEM_READONLY; + case AccessibilityNodeData::ROLE_TABLE: { + string16 aria_role; + GetStringAttribute(AccessibilityNodeData::ATTR_ROLE, &aria_role); + if (aria_role == L"treegrid") { + ia_role_ = ROLE_SYSTEM_OUTLINE; + } else { + ia_role_ = ROLE_SYSTEM_TABLE; + ia_state_ |= STATE_SYSTEM_READONLY; + } break; + } case AccessibilityNodeData::ROLE_TABLE_HEADER_CONTAINER: ia_role_ = ROLE_SYSTEM_GROUPING; ia2_role_ = IA2_ROLE_SECTION; diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index abf0672..f9f5577 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc @@ -256,6 +256,10 @@ IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityAriaInvalid) { RunTest(FILE_PATH_LITERAL("aria-invalid.html")); } +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityAriaLevel) { + RunTest(FILE_PATH_LITERAL("aria-level.html")); +} + IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityAriaMenu) { RunTest(FILE_PATH_LITERAL("aria-menu.html")); } @@ -266,6 +270,11 @@ IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, } IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, + AccessibilityAriaPressed) { + RunTest(FILE_PATH_LITERAL("aria-pressed.html")); +} + +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityAriaProgressbar) { RunTest(FILE_PATH_LITERAL("aria-progressbar.html")); } @@ -275,6 +284,20 @@ IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, RunTest(FILE_PATH_LITERAL("toolbar.html")); } +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, + AccessibilityAriaValueMin) { + RunTest(FILE_PATH_LITERAL("aria-valuemin.html")); +} + +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, + AccessibilityAriaValueMax) { + RunTest(FILE_PATH_LITERAL("aria-valuemax.html")); +} + +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityArticle) { + RunTest(FILE_PATH_LITERAL("article.html")); +} + IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityAWithImg) { RunTest(FILE_PATH_LITERAL("a-with-img.html")); } @@ -304,11 +327,19 @@ IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityDiv) { RunTest(FILE_PATH_LITERAL("div.html")); } +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityDl) { + RunTest(FILE_PATH_LITERAL("dl.html")); +} + IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityContenteditableDescendants) { RunTest(FILE_PATH_LITERAL("contenteditable-descendants.html")); } +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityEm) { + RunTest(FILE_PATH_LITERAL("em.html")); +} + IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityFooter) { RunTest(FILE_PATH_LITERAL("footer.html")); } @@ -317,15 +348,27 @@ IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityForm) { RunTest(FILE_PATH_LITERAL("form.html")); } +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityHeading) { + RunTest(FILE_PATH_LITERAL("heading.html")); +} + IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityHR) { RunTest(FILE_PATH_LITERAL("hr.html")); } +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityInputButton) { + RunTest(FILE_PATH_LITERAL("input-button.html")); +} + IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityInputButtonInMenu) { RunTest(FILE_PATH_LITERAL("input-button-in-menu.html")); } +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityInputColor) { + RunTest(FILE_PATH_LITERAL("input-color.html")); +} + IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityInputImageButtonInMenu) { RunTest(FILE_PATH_LITERAL("input-image-button-in-menu.html")); @@ -356,10 +399,22 @@ IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilitySelect) { RunTest(FILE_PATH_LITERAL("select.html")); } +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilitySpan) { + RunTest(FILE_PATH_LITERAL("span.html")); +} + IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilitySpinButton) { RunTest(FILE_PATH_LITERAL("spinbutton.html")); } +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilitySvg) { + RunTest(FILE_PATH_LITERAL("svg.html")); +} + +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityTab) { + RunTest(FILE_PATH_LITERAL("tab.html")); +} + IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityToggleButton) { RunTest(FILE_PATH_LITERAL("togglebutton.html")); diff --git a/content/browser/accessibility/dump_accessibility_tree_helper.cc b/content/browser/accessibility/dump_accessibility_tree_helper.cc index 1e52bca..e03486d 100644 --- a/content/browser/accessibility/dump_accessibility_tree_helper.cc +++ b/content/browser/accessibility/dump_accessibility_tree_helper.cc @@ -66,6 +66,8 @@ void DumpAccessibilityTreeHelper::StartLine() { void DumpAccessibilityTreeHelper::Add( bool include_by_default, const string16& attr) { + if (attr.empty()) + return; if (!MatchesFilters(attr, include_by_default)) return; if (!line_.empty()) diff --git a/content/browser/accessibility/dump_accessibility_tree_helper_mac.mm b/content/browser/accessibility/dump_accessibility_tree_helper_mac.mm index f351f96..0a317f2 100644 --- a/content/browser/accessibility/dump_accessibility_tree_helper_mac.mm +++ b/content/browser/accessibility/dump_accessibility_tree_helper_mac.mm @@ -18,10 +18,12 @@ string16 Format(BrowserAccessibility* node, SEL selector, const char *suffix) { BrowserAccessibilityCocoa* cocoa_node = node->ToBrowserAccessibilityCocoa(); + NSString* value = [cocoa_node performSelector:selector]; + if (!value) + return string16(); NSString* format_str = [NSString stringWithFormat:@"%s%%@%s", prefix, suffix]; - NSString* tmp = [NSString stringWithFormat:format_str, - [cocoa_node performSelector:selector]]; + NSString* tmp = [NSString stringWithFormat:format_str, value]; return UTF8ToUTF16([tmp cStringUsingEncoding:NSUTF8StringEncoding]); } } @@ -45,6 +47,9 @@ string16 DumpAccessibilityTreeHelper::ToString(BrowserAccessibility* node, Add(false, Format(node, "description='", @selector(description), "'")); Add(false, Format(node, "help='", @selector(help), "'")); Add(false, Format(node, "invalid='", @selector(invalid), "'")); + Add(false, Format(node, "disclosing='", @selector(disclosing), "'")); + Add(false, Format(node, "disclosureLevel='", @selector(disclosureLevel), + "'")); return ASCIIToUTF16(prefix) + FinishLine() + ASCIIToUTF16("\n"); } diff --git a/content/browser/accessibility/dump_accessibility_tree_helper_win.cc b/content/browser/accessibility/dump_accessibility_tree_helper_win.cc index 4d22472..17a1cfc 100644 --- a/content/browser/accessibility/dump_accessibility_tree_helper_win.cc +++ b/content/browser/accessibility/dump_accessibility_tree_helper_win.cc @@ -33,11 +33,16 @@ string16 DumpAccessibilityTreeHelper::ToString( VARIANT variant_self; variant_self.vt = VT_I4; variant_self.lVal = CHILDID_SELF; - CComBSTR msaa_name_variant; - HRESULT hresult = acc_obj->get_accName(variant_self, &msaa_name_variant); + CComBSTR msaa_variant; + HRESULT hresult = acc_obj->get_accName(variant_self, &msaa_variant); string16 name; if (S_OK == hresult) - name = msaa_name_variant.m_str; + name = msaa_variant.m_str; + + hresult = acc_obj->get_accValue(variant_self, &msaa_variant); + string16 value; + if (S_OK == hresult) + value = msaa_variant.m_str; // Get state strings. std::vector<string16> state_strings; @@ -56,6 +61,7 @@ string16 DumpAccessibilityTreeHelper::ToString( StartLine(); Add(true, IAccessible2RoleToString(acc_obj->ia2_role())); Add(true, L"name='" + name + L"'"); + Add(false, L"value='" + value + L"'"); for (std::vector<string16>::const_iterator it = state_strings.begin(); it != state_strings.end(); ++it) { |