summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authordmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-23 22:13:54 +0000
committerdmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-23 22:13:54 +0000
commitd61ef69258a7dea51a481af0cd62edff6a7e786f (patch)
tree79fd1923e5885d995a5f5d523c533503ee81af39 /content
parentdb5fd5f0bfe88fd8a72b4fc8902752d26bf773f2 (diff)
downloadchromium_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')
-rw-r--r--content/browser/accessibility/browser_accessibility_cocoa.h5
-rw-r--r--content/browser/accessibility/browser_accessibility_cocoa.mm102
-rw-r--r--content/browser/accessibility/browser_accessibility_win.cc41
-rw-r--r--content/browser/accessibility/dump_accessibility_tree_browsertest.cc55
-rw-r--r--content/browser/accessibility/dump_accessibility_tree_helper.cc2
-rw-r--r--content/browser/accessibility/dump_accessibility_tree_helper_mac.mm9
-rw-r--r--content/browser/accessibility/dump_accessibility_tree_helper_win.cc12
-rw-r--r--content/common/accessibility_node_data.cc10
-rw-r--r--content/common/accessibility_node_data.h10
-rw-r--r--content/renderer/accessibility_node_serializer.cc19
-rw-r--r--content/test/data/accessibility/aria-application-expected-mac.txt2
-rw-r--r--content/test/data/accessibility/aria-invalid-expected-mac.txt14
-rw-r--r--content/test/data/accessibility/aria-level-expected-mac.txt21
-rw-r--r--content/test/data/accessibility/aria-level-expected-win.txt21
-rw-r--r--content/test/data/accessibility/aria-level.html43
-rw-r--r--content/test/data/accessibility/aria-pressed-expected-mac.txt5
-rw-r--r--content/test/data/accessibility/aria-pressed-expected-win.txt6
-rw-r--r--content/test/data/accessibility/aria-pressed.html15
-rw-r--r--content/test/data/accessibility/aria-progressbar-expected-mac.txt4
-rw-r--r--content/test/data/accessibility/aria-valuemax-expected-mac.txt5
-rw-r--r--content/test/data/accessibility/aria-valuemax-expected-win.txt5
-rw-r--r--content/test/data/accessibility/aria-valuemax.html15
-rw-r--r--content/test/data/accessibility/aria-valuemin-expected-mac.txt5
-rw-r--r--content/test/data/accessibility/aria-valuemin-expected-win.txt5
-rw-r--r--content/test/data/accessibility/aria-valuemin.html16
-rw-r--r--content/test/data/accessibility/article-expected-mac.txt3
-rw-r--r--content/test/data/accessibility/article-expected-win.txt3
-rw-r--r--content/test/data/accessibility/article.html13
-rw-r--r--content/test/data/accessibility/dl-expected-mac.txt6
-rw-r--r--content/test/data/accessibility/dl-expected-win.txt6
-rw-r--r--content/test/data/accessibility/dl.html12
-rw-r--r--content/test/data/accessibility/em-expected-mac.txt5
-rw-r--r--content/test/data/accessibility/em-expected-win.txt5
-rw-r--r--content/test/data/accessibility/em.html6
-rw-r--r--content/test/data/accessibility/footer-expected-mac.txt4
-rw-r--r--content/test/data/accessibility/heading-expected-mac.txt25
-rw-r--r--content/test/data/accessibility/heading-expected-win.txt25
-rw-r--r--content/test/data/accessibility/heading.html22
-rw-r--r--content/test/data/accessibility/input-button-expected-mac.txt3
-rw-r--r--content/test/data/accessibility/input-button-expected-win.txt3
-rw-r--r--content/test/data/accessibility/input-button-mac-expected.txt3
-rw-r--r--content/test/data/accessibility/input-button.html9
-rw-r--r--content/test/data/accessibility/input-color-expected-mac.txt3
-rw-r--r--content/test/data/accessibility/input-color-expected-win.txt3
-rw-r--r--content/test/data/accessibility/input-color.html10
-rw-r--r--content/test/data/accessibility/list-markers-expected-mac.txt32
-rw-r--r--content/test/data/accessibility/span-expected-mac.txt5
-rw-r--r--content/test/data/accessibility/span-expected-win.txt5
-rw-r--r--content/test/data/accessibility/span.html11
-rw-r--r--content/test/data/accessibility/svg-expected-mac.txt5
-rw-r--r--content/test/data/accessibility/svg-expected-win.txt5
-rw-r--r--content/test/data/accessibility/svg.html18
-rw-r--r--content/test/data/accessibility/tab-expected-mac.txt4
-rw-r--r--content/test/data/accessibility/tab-expected-win.txt4
-rw-r--r--content/test/data/accessibility/tab.html9
-rw-r--r--content/test/data/accessibility/ul-expected-mac.txt20
56 files changed, 653 insertions, 81 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) {
diff --git a/content/common/accessibility_node_data.cc b/content/common/accessibility_node_data.cc
index 01b028b..9eee613 100644
--- a/content/common/accessibility_node_data.cc
+++ b/content/common/accessibility_node_data.cc
@@ -138,6 +138,7 @@ std::string AccessibilityNodeData::DebugString(bool recursive) const {
case ROLE_SPLIT_GROUP: result += " SPLIT_GROUP"; break;
case ROLE_STATIC_TEXT: result += " STATIC_TEXT"; break;
case ROLE_STATUS: result += " STATUS"; break;
+ case ROLE_SVG_ROOT: result += " SVG_ROOT"; break;
case ROLE_SYSTEM_WIDE: result += " SYSTEM_WIDE"; break;
case ROLE_TAB: result += " TAB"; break;
case ROLE_TABLE: result += " TABLE"; break;
@@ -279,6 +280,15 @@ std::string AccessibilityNodeData::DebugString(bool recursive) const {
case ATTR_TITLE_UI_ELEMENT:
result += " title_elem=" + value;
break;
+ case ATTR_COLOR_VALUE_RED:
+ result += " color_value_red=" + value;
+ break;
+ case ATTR_COLOR_VALUE_GREEN:
+ result += " color_value_green=" + value;
+ break;
+ case ATTR_COLOR_VALUE_BLUE:
+ result += " color_value_blue=" + value;
+ break;
}
}
diff --git a/content/common/accessibility_node_data.h b/content/common/accessibility_node_data.h
index bab81e3..d9533fd 100644
--- a/content/common/accessibility_node_data.h
+++ b/content/common/accessibility_node_data.h
@@ -115,6 +115,7 @@ struct CONTENT_EXPORT AccessibilityNodeData {
ROLE_SPLIT_GROUP,
ROLE_STATIC_TEXT,
ROLE_STATUS,
+ ROLE_SVG_ROOT,
ROLE_SYSTEM_WIDE,
ROLE_TAB,
ROLE_TABLE,
@@ -224,6 +225,11 @@ struct CONTENT_EXPORT AccessibilityNodeData {
// Relationships between this element and other elements.
ATTR_TITLE_UI_ELEMENT,
+
+ // Color value for ROLE_COLOR_WELL, each component is 0..255
+ ATTR_COLOR_VALUE_RED,
+ ATTR_COLOR_VALUE_GREEN,
+ ATTR_COLOR_VALUE_BLUE
};
enum FloatAttribute {
@@ -259,9 +265,9 @@ struct CONTENT_EXPORT AccessibilityNodeData {
AccessibilityNodeData();
~AccessibilityNodeData();
-#ifndef NDEBUG
+ #ifndef NDEBUG
std::string DebugString(bool recursive) const;
-#endif
+ #endif
// This is a simple serializable struct. All member variables should be
// public and copyable.
diff --git a/content/renderer/accessibility_node_serializer.cc b/content/renderer/accessibility_node_serializer.cc
index 164b702..5858e09 100644
--- a/content/renderer/accessibility_node_serializer.cc
+++ b/content/renderer/accessibility_node_serializer.cc
@@ -223,6 +223,8 @@ AccessibilityNodeData::Role ConvertRole(WebKit::WebAccessibilityRole role) {
return AccessibilityNodeData::ROLE_SPLITTER;
case WebKit::WebAccessibilityRoleStaticText:
return AccessibilityNodeData::ROLE_STATIC_TEXT;
+ case WebKit::WebAccessibilityRoleSVGRoot:
+ return AccessibilityNodeData::ROLE_SVG_ROOT;
case WebKit::WebAccessibilityRoleSystemWide:
return AccessibilityNodeData::ROLE_SYSTEM_WIDE;
case WebKit::WebAccessibilityRoleTab:
@@ -359,6 +361,14 @@ void SerializeAccessibilityNode(
else
dst->value = src.stringValue();
+ if (dst->role == AccessibilityNodeData::ROLE_COLOR_WELL) {
+ int r, g, b;
+ src.colorValue(r, g, b);
+ dst->int_attributes[dst->ATTR_COLOR_VALUE_RED] = r;
+ dst->int_attributes[dst->ATTR_COLOR_VALUE_GREEN] = g;
+ dst->int_attributes[dst->ATTR_COLOR_VALUE_BLUE] = b;
+ }
+
if (src.accessKey().length())
dst->string_attributes[dst->ATTR_ACCESS_KEY] = src.accessKey();
if (src.actionVerb().length())
@@ -385,8 +395,12 @@ void SerializeAccessibilityNode(
if (!src.url().isEmpty())
dst->string_attributes[dst->ATTR_URL] = src.url().spec().utf16();
- if (dst->role == dst->ROLE_TREE_ITEM)
+ if (dst->role == dst->ROLE_HEADING)
+ dst->int_attributes[dst->ATTR_HIERARCHICAL_LEVEL] = src.headingLevel();
+ else if ((dst->role == dst->ROLE_TREE_ITEM || dst->role == dst->ROLE_ROW) &&
+ src.hierarchicalLevel() > 0) {
dst->int_attributes[dst->ATTR_HIERARCHICAL_LEVEL] = src.hierarchicalLevel();
+ }
if (dst->role == dst->ROLE_SLIDER)
include_children = false;
@@ -405,6 +419,9 @@ void SerializeAccessibilityNode(
WebElement element = node.to<WebElement>();
is_iframe = (element.tagName() == ASCIIToUTF16("IFRAME"));
+ if (LowerCaseEqualsASCII(element.getAttribute("aria-expanded"), "true"))
+ dst->state |= (1 << AccessibilityNodeData::STATE_EXPANDED);
+
// TODO(ctguil): The tagName in WebKit is lower cased but
// HTMLElement::nodeName calls localNameUpper. Consider adding
// a WebElement method that returns the original lower cased tagName.
diff --git a/content/test/data/accessibility/aria-application-expected-mac.txt b/content/test/data/accessibility/aria-application-expected-mac.txt
index 441fb0f..f533b68 100644
--- a/content/test/data/accessibility/aria-application-expected-mac.txt
+++ b/content/test/data/accessibility/aria-application-expected-mac.txt
@@ -1,2 +1,2 @@
-AXWebArea subrole=(null) title='' value=''
+AXWebArea title='' value=''
AXGroup subrole=AXLandmarkApplication roleDescription='application' title='' value=''
diff --git a/content/test/data/accessibility/aria-invalid-expected-mac.txt b/content/test/data/accessibility/aria-invalid-expected-mac.txt
index 95d06aa..70826af 100644
--- a/content/test/data/accessibility/aria-invalid-expected-mac.txt
+++ b/content/test/data/accessibility/aria-invalid-expected-mac.txt
@@ -1,13 +1,13 @@
-AXWebArea title='' value='' invalid='(null)'
+AXWebArea title='' value=''
AXGroup title='' value='' invalid='true'
- AXStaticText title='' value='invalid=true' invalid='(null)'
+ AXStaticText title='' value='invalid=true'
AXGroup title='' value='' invalid='spelling'
- AXStaticText title='' value='invalid=spelling' invalid='(null)'
+ AXStaticText title='' value='invalid=spelling'
AXGroup title='' value='' invalid='grammar'
- AXStaticText title='' value='invalid=grammar' invalid='(null)'
+ AXStaticText title='' value='invalid=grammar'
AXGroup title='' value='' invalid='false'
- AXStaticText title='' value='invalid=false' invalid='(null)'
+ AXStaticText title='' value='invalid=false'
AXGroup title='' value='' invalid='false'
- AXStaticText title='' value='invalid=<empty>' invalid='(null)'
+ AXStaticText title='' value='invalid=<empty>'
AXGroup title='' value='' invalid='somethingelse'
- AXStaticText title='' value='invalid=somethingelse' invalid='(null)'
+ AXStaticText title='' value='invalid=somethingelse'
diff --git a/content/test/data/accessibility/aria-level-expected-mac.txt b/content/test/data/accessibility/aria-level-expected-mac.txt
new file mode 100644
index 0000000..2879b99
--- /dev/null
+++ b/content/test/data/accessibility/aria-level-expected-mac.txt
@@ -0,0 +1,21 @@
+AXWebArea
+ AXHeading title='H3' value='3'
+ AXStaticText value='H3'
+ AXHeading title='ARIA heading level 3' value='3'
+ AXStaticText value='ARIA heading level 3'
+ AXOutline
+ AXRow subrole=AXOutlineRow disclosing='1' disclosureLevel='0'
+ AXStaticText value='Tree item at level 1'
+ AXRow subrole=AXOutlineRow disclosing='0' disclosureLevel='1'
+ AXStaticText value='Tree item at level 2'
+ AXRow subrole=AXOutlineRow disclosing='0' disclosureLevel='2'
+ AXStaticText value='Tree item at level 3'
+ AXTable
+ AXRow disclosureLevel='0'
+ AXCell
+ AXStaticText value='Cell at level 1'
+ AXRow disclosureLevel='1'
+ AXCell
+ AXStaticText value='Cell at level 2'
+ AXColumn
+ AXGroup
diff --git a/content/test/data/accessibility/aria-level-expected-win.txt b/content/test/data/accessibility/aria-level-expected-win.txt
new file mode 100644
index 0000000..57f639c
--- /dev/null
+++ b/content/test/data/accessibility/aria-level-expected-win.txt
@@ -0,0 +1,21 @@
+ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
+ IA2_ROLE_HEADING name='H3' READONLY level:3
+ ROLE_SYSTEM_TEXT name='H3' READONLY
+ IA2_ROLE_HEADING name='ARIA heading level 3' READONLY level:3
+ ROLE_SYSTEM_TEXT name='ARIA heading level 3' READONLY
+ ROLE_SYSTEM_OUTLINE READONLY
+ ROLE_SYSTEM_OUTLINEITEM READONLY EXPANDED level:1
+ ROLE_SYSTEM_TEXT name='Tree item at level 1' READONLY
+ ROLE_SYSTEM_OUTLINEITEM READONLY level:2
+ ROLE_SYSTEM_TEXT name='Tree item at level 2' READONLY
+ ROLE_SYSTEM_OUTLINEITEM READONLY level:3
+ ROLE_SYSTEM_TEXT name='Tree item at level 3' READONLY
+ ROLE_SYSTEM_OUTLINE
+ ROLE_SYSTEM_ROW READONLY level:1
+ ROLE_SYSTEM_CELL
+ ROLE_SYSTEM_TEXT name='Cell at level 1' READONLY
+ ROLE_SYSTEM_ROW READONLY level:2
+ ROLE_SYSTEM_CELL
+ ROLE_SYSTEM_TEXT name='Cell at level 2' READONLY
+ ROLE_SYSTEM_COLUMN
+ IA2_ROLE_SECTION
diff --git a/content/test/data/accessibility/aria-level.html b/content/test/data/accessibility/aria-level.html
new file mode 100644
index 0000000..75f93b2
--- /dev/null
+++ b/content/test/data/accessibility/aria-level.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<!--
+@MAC-ALLOW:subrole=AXOutlineRow
+@MAC-ALLOW:disclosing*
+@MAC-ALLOW:disclosureLevel*
+@MAC-DENY:title=''
+@MAC-DENY:value=''
+@WIN-ALLOW:level:1
+@WIN-ALLOW:level:2
+@WIN-ALLOW:level:3
+@WIN-ALLOW:EXPANDED
+@WIN-DENY:name=''
+-->
+<html>
+<body>
+
+<h3>H3</h3>
+
+<div role="heading" aria-level="3">ARIA heading level 3</div>
+
+<div role="tree">
+ <div role="treeitem" aria-expanded="true">
+ Tree item at level 1
+ <div role="group">
+ <div role="treeitem">Tree item at level 2</div>
+ </div>
+ </div>
+ <div role="treeitem" aria-level="3">
+ Tree item at level 3
+ </div>
+</div>
+
+<table role="treegrid">
+ <tr role="row" aria-level="1">
+ <td role="gridcell">Cell at level 1</td>
+ </tr>
+ <tr role="row" aria-level="2">
+ <td role="gridcell">Cell at level 2</td>
+ </tr>
+</table>
+
+</body>
+</html>
diff --git a/content/test/data/accessibility/aria-pressed-expected-mac.txt b/content/test/data/accessibility/aria-pressed-expected-mac.txt
new file mode 100644
index 0000000..b3842ae
--- /dev/null
+++ b/content/test/data/accessibility/aria-pressed-expected-mac.txt
@@ -0,0 +1,5 @@
+AXWebArea title='' value=''
+ AXButton title='Regular button' value=''
+ AXButton title='Toggle button unpressed' value=''
+ AXButton title='Toggle button pressed' value=''
+ AXButton title='Toggle button mixed' value=''
diff --git a/content/test/data/accessibility/aria-pressed-expected-win.txt b/content/test/data/accessibility/aria-pressed-expected-win.txt
new file mode 100644
index 0000000..c0263e8
--- /dev/null
+++ b/content/test/data/accessibility/aria-pressed-expected-win.txt
@@ -0,0 +1,6 @@
+#<skip - PRESSED not set: http://crbug.com/171625>
+ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
+ ROLE_SYSTEM_PUSHBUTTON FOCUSABLE
+ IA2_ROLE_TOGGLE_BUTTON FOCUSABLE checkable:true
+ IA2_ROLE_TOGGLE_BUTTON FOCUSABLE PRESSED checkable:true
+ IA2_ROLE_TOGGLE_BUTTON FOCUSABLE PRESSED MIXED checkable:true
diff --git a/content/test/data/accessibility/aria-pressed.html b/content/test/data/accessibility/aria-pressed.html
new file mode 100644
index 0000000..12958c4
--- /dev/null
+++ b/content/test/data/accessibility/aria-pressed.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<!--
+@WIN-DENY:name*
+@WIN-ALLOW:PRESSED
+@WIN-ALLOW:MIXED
+@WIN-ALLOW:checkable:true
+-->
+<html>
+<body>
+<div tabindex=0 role="button">Regular button</div>
+<div tabindex=0 role="button" aria-pressed="false">Toggle button unpressed</div>
+<div tabindex=0 role="button" aria-pressed="true">Toggle button pressed</div>
+<div tabindex=0 role="button" aria-pressed="mixed">Toggle button mixed</div>
+</body>
+</html>
diff --git a/content/test/data/accessibility/aria-progressbar-expected-mac.txt b/content/test/data/accessibility/aria-progressbar-expected-mac.txt
index 2ad19dd..d5cb85e 100644
--- a/content/test/data/accessibility/aria-progressbar-expected-mac.txt
+++ b/content/test/data/accessibility/aria-progressbar-expected-mac.txt
@@ -1,3 +1,3 @@
-AXWebArea roleDescription='HTML content' title='' value='' minValue='0' maxValue='0' valueDescription='(null)'
- AXProgressIndicator roleDescription='progress indicator' title='' value='3' minValue='1' maxValue='37' valueDescription='(null)'
+AXWebArea roleDescription='HTML content' title='' value='' minValue='0' maxValue='0'
+ AXProgressIndicator roleDescription='progress indicator' title='' value='3' minValue='1' maxValue='37'
AXProgressIndicator roleDescription='progress indicator' title='' minValue='1' maxValue='96' valueDescription='three'
diff --git a/content/test/data/accessibility/aria-valuemax-expected-mac.txt b/content/test/data/accessibility/aria-valuemax-expected-mac.txt
new file mode 100644
index 0000000..c36f3eb
--- /dev/null
+++ b/content/test/data/accessibility/aria-valuemax-expected-mac.txt
@@ -0,0 +1,5 @@
+AXWebArea value='' maxValue='0'
+ AXProgressIndicator value='51' maxValue='101'
+ AXScrollBar value='52' maxValue='102'
+ AXSlider value='53' maxValue='103'
+ AXSlider value='54' maxValue='104'
diff --git a/content/test/data/accessibility/aria-valuemax-expected-win.txt b/content/test/data/accessibility/aria-valuemax-expected-win.txt
new file mode 100644
index 0000000..2cb09d2
--- /dev/null
+++ b/content/test/data/accessibility/aria-valuemax-expected-win.txt
@@ -0,0 +1,5 @@
+ROLE_SYSTEM_DOCUMENT name='' READONLY FOCUSABLE
+ ROLE_SYSTEM_PROGRESSBAR name='' READONLY maximumValue=101.00
+ ROLE_SYSTEM_SCROLLBAR name='' maximumValue=102.00
+ ROLE_SYSTEM_SLIDER name='' maximumValue=103.00
+ ROLE_SYSTEM_SPINBUTTON name='' maximumValue=104.00
diff --git a/content/test/data/accessibility/aria-valuemax.html b/content/test/data/accessibility/aria-valuemax.html
new file mode 100644
index 0000000..d894018
--- /dev/null
+++ b/content/test/data/accessibility/aria-valuemax.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<!--
+@MAC-ALLOW:maxValue=*
+@MAC-DENY:title*
+@WIN-ALLOW:maximumValue=*
+@WIN-DENY:description=''
+-->
+<html>
+<body>
+ <div role="progressbar" aria-valuenow="51" aria-valuemin="1" aria-valuemax="101">Progress</div>
+ <div role="scrollbar" aria-valuenow="52" aria-valuemin="2" aria-valuemax="102">Scroll</div>
+ <div role="slider" aria-valuenow="53" aria-valuemin="3" aria-valuemax="103">Slider</div>
+ <div role="spinbutton" aria-valuenow="54" aria-valuemin="4" aria-valuemax="104">Spin</div>
+</body>
+</html>
diff --git a/content/test/data/accessibility/aria-valuemin-expected-mac.txt b/content/test/data/accessibility/aria-valuemin-expected-mac.txt
new file mode 100644
index 0000000..bc5b9b1
--- /dev/null
+++ b/content/test/data/accessibility/aria-valuemin-expected-mac.txt
@@ -0,0 +1,5 @@
+AXWebArea minValue='0'
+ AXProgressIndicator minValue='1'
+ AXScrollBar minValue='2'
+ AXSlider minValue='3'
+ AXSlider minValue='4'
diff --git a/content/test/data/accessibility/aria-valuemin-expected-win.txt b/content/test/data/accessibility/aria-valuemin-expected-win.txt
new file mode 100644
index 0000000..ca36097
--- /dev/null
+++ b/content/test/data/accessibility/aria-valuemin-expected-win.txt
@@ -0,0 +1,5 @@
+ROLE_SYSTEM_DOCUMENT name='' READONLY FOCUSABLE
+ ROLE_SYSTEM_PROGRESSBAR name='' READONLY minimumValue=1.00
+ ROLE_SYSTEM_SCROLLBAR name='' minimumValue=2.00
+ ROLE_SYSTEM_SLIDER name='' minimumValue=3.00
+ ROLE_SYSTEM_SPINBUTTON name='' minimumValue=4.00
diff --git a/content/test/data/accessibility/aria-valuemin.html b/content/test/data/accessibility/aria-valuemin.html
new file mode 100644
index 0000000..d4df6e1
--- /dev/null
+++ b/content/test/data/accessibility/aria-valuemin.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<!--
+@MAC-ALLOW:minValue=*
+@MAC-DENY:title*
+@MAC-DENY:value*
+@WIN-ALLOW:minimumValue=*
+@WIN-DENY:description=''
+-->
+<html>
+<body>
+ <div role="progressbar" aria-valuenow="51" aria-valuemin="1" aria-valuemax="101">Progress</div>
+ <div role="scrollbar" aria-valuenow="52" aria-valuemin="2" aria-valuemax="102">Scroll</div>
+ <div role="slider" aria-valuenow="53" aria-valuemin="3" aria-valuemax="103">Slider</div>
+ <div role="spinbutton" aria-valuenow="54" aria-valuemin="4" aria-valuemax="104">Spin</div>
+</body>
+</html>
diff --git a/content/test/data/accessibility/article-expected-mac.txt b/content/test/data/accessibility/article-expected-mac.txt
new file mode 100644
index 0000000..74c8f05
--- /dev/null
+++ b/content/test/data/accessibility/article-expected-mac.txt
@@ -0,0 +1,3 @@
+AXWebArea value=''
+ AXGroup subrole=AXDocumentArticle value=''
+ AXStaticText value='This is an article.'
diff --git a/content/test/data/accessibility/article-expected-win.txt b/content/test/data/accessibility/article-expected-win.txt
new file mode 100644
index 0000000..579dcb9
--- /dev/null
+++ b/content/test/data/accessibility/article-expected-win.txt
@@ -0,0 +1,3 @@
+ROLE_SYSTEM_DOCUMENT name='' READONLY FOCUSABLE
+ IA2_ROLE_SECTION name='' READONLY xml-roles:article
+ ROLE_SYSTEM_TEXT name='This is an article.' READONLY
diff --git a/content/test/data/accessibility/article.html b/content/test/data/accessibility/article.html
new file mode 100644
index 0000000..49f7b08
--- /dev/null
+++ b/content/test/data/accessibility/article.html
@@ -0,0 +1,13 @@
+<!--
+@MAC-ALLOW:subrole=AXDocumentArticle
+@MAC-DENY:title*
+@WIN-ALLOW:xml-roles:article
+-->
+<!doctype html>
+<html>
+<body>
+ <div role="article">
+ This is an article.
+ </div>
+</body>
+</html>
diff --git a/content/test/data/accessibility/dl-expected-mac.txt b/content/test/data/accessibility/dl-expected-mac.txt
new file mode 100644
index 0000000..f804709
--- /dev/null
+++ b/content/test/data/accessibility/dl-expected-mac.txt
@@ -0,0 +1,6 @@
+AXWebArea title='' value=''
+ AXList subrole=AXDefinitionList title='' value=''
+ AXGroup subrole=AXTerm title='' value=''
+ AXStaticText title='' value='Term'
+ AXGroup subrole=AXDefinition title='' value=''
+ AXStaticText title='' value='Definition'
diff --git a/content/test/data/accessibility/dl-expected-win.txt b/content/test/data/accessibility/dl-expected-win.txt
new file mode 100644
index 0000000..8dcb267
--- /dev/null
+++ b/content/test/data/accessibility/dl-expected-win.txt
@@ -0,0 +1,6 @@
+ROLE_SYSTEM_DOCUMENT name='' READONLY FOCUSABLE
+ ROLE_SYSTEM_LIST name='' READONLY
+ ROLE_SYSTEM_LISTITEM name='' READONLY
+ ROLE_SYSTEM_TEXT name='Term' READONLY
+ IA2_ROLE_PARAGRAPH name='' READONLY
+ ROLE_SYSTEM_TEXT name='Definition' READONLY
diff --git a/content/test/data/accessibility/dl.html b/content/test/data/accessibility/dl.html
new file mode 100644
index 0000000..65efed5
--- /dev/null
+++ b/content/test/data/accessibility/dl.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<!--
+@MAC-ALLOW:subrole*
+-->
+<html>
+<body>
+<dl>
+ <dt>Term</dt>
+ <dd>Definition</dd>
+</dl>
+</body>
+</html>
diff --git a/content/test/data/accessibility/em-expected-mac.txt b/content/test/data/accessibility/em-expected-mac.txt
new file mode 100644
index 0000000..3615f81
--- /dev/null
+++ b/content/test/data/accessibility/em-expected-mac.txt
@@ -0,0 +1,5 @@
+AXWebArea title='' value=''
+ AXGroup title='' value=''
+ AXStaticText title='' value='One word is '
+ AXStaticText title='' value='emphasized'
+ AXStaticText title='' value='.'
diff --git a/content/test/data/accessibility/em-expected-win.txt b/content/test/data/accessibility/em-expected-win.txt
new file mode 100644
index 0000000..f9e19f8
--- /dev/null
+++ b/content/test/data/accessibility/em-expected-win.txt
@@ -0,0 +1,5 @@
+ROLE_SYSTEM_DOCUMENT name='' READONLY FOCUSABLE
+ IA2_ROLE_SECTION name='' READONLY
+ ROLE_SYSTEM_TEXT name='One word is ' READONLY
+ ROLE_SYSTEM_TEXT name='emphasized' READONLY
+ ROLE_SYSTEM_TEXT name='.' READONLY
diff --git a/content/test/data/accessibility/em.html b/content/test/data/accessibility/em.html
new file mode 100644
index 0000000..f901d10
--- /dev/null
+++ b/content/test/data/accessibility/em.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<html>
+<body>
+One word is <em>emphasized</em>.
+</body>
+</html>
diff --git a/content/test/data/accessibility/footer-expected-mac.txt b/content/test/data/accessibility/footer-expected-mac.txt
index 09dece1..2084934 100644
--- a/content/test/data/accessibility/footer-expected-mac.txt
+++ b/content/test/data/accessibility/footer-expected-mac.txt
@@ -1,3 +1,3 @@
-AXWebArea subrole=(null) title='' value=''
+AXWebArea title='' value=''
AXGroup subrole=AXLandmarkContentInfo roleDescription='footer' title='' value=''
- AXStaticText subrole=(null) title='' value='Footer element'
+ AXStaticText title='' value='Footer element'
diff --git a/content/test/data/accessibility/heading-expected-mac.txt b/content/test/data/accessibility/heading-expected-mac.txt
new file mode 100644
index 0000000..65c8864
--- /dev/null
+++ b/content/test/data/accessibility/heading-expected-mac.txt
@@ -0,0 +1,25 @@
+AXWebArea title='' value=''
+ AXHeading title='Heading 1' value='1'
+ AXStaticText title='' value='Heading 1'
+ AXHeading title='Heading 2' value='2'
+ AXStaticText title='' value='Heading 2'
+ AXHeading title='Heading 3' value='3'
+ AXStaticText title='' value='Heading 3'
+ AXHeading title='Heading 4' value='4'
+ AXStaticText title='' value='Heading 4'
+ AXHeading title='Heading 5' value='5'
+ AXStaticText title='' value='Heading 5'
+ AXHeading title='Heading 6' value='6'
+ AXStaticText title='' value='Heading 6'
+ AXHeading title='ARIA Heading 1' value='1'
+ AXStaticText title='' value='ARIA Heading 1'
+ AXHeading title='ARIA Heading 2' value='2'
+ AXStaticText title='' value='ARIA Heading 2'
+ AXHeading title='ARIA Heading 3' value='3'
+ AXStaticText title='' value='ARIA Heading 3'
+ AXHeading title='ARIA Heading 4' value='4'
+ AXStaticText title='' value='ARIA Heading 4'
+ AXHeading title='ARIA Heading 5' value='5'
+ AXStaticText title='' value='ARIA Heading 5'
+ AXHeading title='ARIA Heading 6' value='6'
+ AXStaticText title='' value='ARIA Heading 6'
diff --git a/content/test/data/accessibility/heading-expected-win.txt b/content/test/data/accessibility/heading-expected-win.txt
new file mode 100644
index 0000000..0b3ae85
--- /dev/null
+++ b/content/test/data/accessibility/heading-expected-win.txt
@@ -0,0 +1,25 @@
+ROLE_SYSTEM_DOCUMENT name='' READONLY FOCUSABLE
+ IA2_ROLE_HEADING name='Heading 1' READONLY level:1
+ ROLE_SYSTEM_TEXT name='Heading 1' READONLY
+ IA2_ROLE_HEADING name='Heading 2' READONLY level:2
+ ROLE_SYSTEM_TEXT name='Heading 2' READONLY
+ IA2_ROLE_HEADING name='Heading 3' READONLY level:3
+ ROLE_SYSTEM_TEXT name='Heading 3' READONLY
+ IA2_ROLE_HEADING name='Heading 4' READONLY level:4
+ ROLE_SYSTEM_TEXT name='Heading 4' READONLY
+ IA2_ROLE_HEADING name='Heading 5' READONLY level:5
+ ROLE_SYSTEM_TEXT name='Heading 5' READONLY
+ IA2_ROLE_HEADING name='Heading 6' READONLY level:6
+ ROLE_SYSTEM_TEXT name='Heading 6' READONLY
+ IA2_ROLE_HEADING name='ARIA Heading 1' READONLY xml-roles:heading level:1
+ ROLE_SYSTEM_TEXT name='ARIA Heading 1' READONLY
+ IA2_ROLE_HEADING name='ARIA Heading 2' READONLY xml-roles:heading level:2
+ ROLE_SYSTEM_TEXT name='ARIA Heading 2' READONLY
+ IA2_ROLE_HEADING name='ARIA Heading 3' READONLY xml-roles:heading level:3
+ ROLE_SYSTEM_TEXT name='ARIA Heading 3' READONLY
+ IA2_ROLE_HEADING name='ARIA Heading 4' READONLY xml-roles:heading level:4
+ ROLE_SYSTEM_TEXT name='ARIA Heading 4' READONLY
+ IA2_ROLE_HEADING name='ARIA Heading 5' READONLY xml-roles:heading level:5
+ ROLE_SYSTEM_TEXT name='ARIA Heading 5' READONLY
+ IA2_ROLE_HEADING name='ARIA Heading 6' READONLY xml-roles:heading level:6
+ ROLE_SYSTEM_TEXT name='ARIA Heading 6' READONLY
diff --git a/content/test/data/accessibility/heading.html b/content/test/data/accessibility/heading.html
new file mode 100644
index 0000000..84ded45
--- /dev/null
+++ b/content/test/data/accessibility/heading.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<!--
+@WIN-ALLOW:level:*
+@WIN-ALLOW:xml-roles:heading
+-->
+<html>
+<body>
+ <h1>Heading 1</h1>
+ <h2>Heading 2</h2>
+ <h3>Heading 3</h3>
+ <h4>Heading 4</h4>
+ <h5>Heading 5</h5>
+ <h6>Heading 6</h6>
+
+ <div role="heading" aria-level="1">ARIA Heading 1</div>
+ <div role="heading" aria-level="2">ARIA Heading 2</div>
+ <div role="heading" aria-level="3">ARIA Heading 3</div>
+ <div role="heading" aria-level="4">ARIA Heading 4</div>
+ <div role="heading" aria-level="5">ARIA Heading 5</div>
+ <div role="heading" aria-level="6">ARIA Heading 6</div>
+</body>
+</html>
diff --git a/content/test/data/accessibility/input-button-expected-mac.txt b/content/test/data/accessibility/input-button-expected-mac.txt
new file mode 100644
index 0000000..6705224
--- /dev/null
+++ b/content/test/data/accessibility/input-button-expected-mac.txt
@@ -0,0 +1,3 @@
+AXWebArea title=''
+ AXGroup title=''
+ AXButton title='Button'
diff --git a/content/test/data/accessibility/input-button-expected-win.txt b/content/test/data/accessibility/input-button-expected-win.txt
new file mode 100644
index 0000000..063eef5
--- /dev/null
+++ b/content/test/data/accessibility/input-button-expected-win.txt
@@ -0,0 +1,3 @@
+ROLE_SYSTEM_DOCUMENT name='' READONLY FOCUSABLE
+ IA2_ROLE_SECTION name='' READONLY
+ ROLE_SYSTEM_PUSHBUTTON name='Button' FOCUSABLE
diff --git a/content/test/data/accessibility/input-button-mac-expected.txt b/content/test/data/accessibility/input-button-mac-expected.txt
new file mode 100644
index 0000000..6705224
--- /dev/null
+++ b/content/test/data/accessibility/input-button-mac-expected.txt
@@ -0,0 +1,3 @@
+AXWebArea title=''
+ AXGroup title=''
+ AXButton title='Button'
diff --git a/content/test/data/accessibility/input-button.html b/content/test/data/accessibility/input-button.html
new file mode 100644
index 0000000..3ac815e
--- /dev/null
+++ b/content/test/data/accessibility/input-button.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<!--
+@MAC-DENY:value*
+-->
+<html>
+ <body>
+ <input type="button" value="Button">
+ </body>
+</html>
diff --git a/content/test/data/accessibility/input-color-expected-mac.txt b/content/test/data/accessibility/input-color-expected-mac.txt
new file mode 100644
index 0000000..05f52c0
--- /dev/null
+++ b/content/test/data/accessibility/input-color-expected-mac.txt
@@ -0,0 +1,3 @@
+AXWebArea value=''
+ AXGroup value=''
+ AXColorWell value='rgb 1.00000 0.60000 0.00000 1'
diff --git a/content/test/data/accessibility/input-color-expected-win.txt b/content/test/data/accessibility/input-color-expected-win.txt
new file mode 100644
index 0000000..1241fd7
--- /dev/null
+++ b/content/test/data/accessibility/input-color-expected-win.txt
@@ -0,0 +1,3 @@
+ROLE_SYSTEM_DOCUMENT name='' value='' READONLY FOCUSABLE
+ IA2_ROLE_SECTION name='' value='' READONLY
+ IA2_ROLE_COLOR_CHOOSER name='' value='100% red 60% green 0% blue' FOCUSABLE
diff --git a/content/test/data/accessibility/input-color.html b/content/test/data/accessibility/input-color.html
new file mode 100644
index 0000000..bcc48da
--- /dev/null
+++ b/content/test/data/accessibility/input-color.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<!--
+@MAC-DENY:title*
+@WIN-ALLOW:value*
+-->
+<html>
+ <body>
+ <input type="color" value="#ff9900">
+ </body>
+</html>
diff --git a/content/test/data/accessibility/list-markers-expected-mac.txt b/content/test/data/accessibility/list-markers-expected-mac.txt
index 29e7252..1057908 100644
--- a/content/test/data/accessibility/list-markers-expected-mac.txt
+++ b/content/test/data/accessibility/list-markers-expected-mac.txt
@@ -1,17 +1,17 @@
-AXWebArea subrole=(null) title='' value=''
+AXWebArea title='' value=''
AXList subrole=AXContentList title='' value=''
- AXGroup subrole=(null) title='' value=''
- AXListMarker subrole=(null) title='' value='•'
- AXStaticText subrole=(null) title='' value='First item properly groups itself despite '
- AXStaticText subrole=(null) title='' value='bolded'
- AXStaticText subrole=(null) title='' value=' text.'
- AXGroup subrole=(null) title='' value=''
- AXListMarker subrole=(null) title='' value='•'
- AXStaticText subrole=(null) title='' value='This should also be '
- AXStaticText subrole=(null) title='' value='seen'
- AXStaticText subrole=(null) title='' value=' as a group.'
- AXGroup subrole=(null) title='' value=''
- AXListMarker subrole=(null) title='' value='•'
- AXStaticText subrole=(null) title='' value='Some '
- AXStaticText subrole=(null) title='' value='more'
- AXStaticText subrole=(null) title='' value=' text.'
+ AXGroup title='' value=''
+ AXListMarker title='' value='•'
+ AXStaticText title='' value='First item properly groups itself despite '
+ AXStaticText title='' value='bolded'
+ AXStaticText title='' value=' text.'
+ AXGroup title='' value=''
+ AXListMarker title='' value='•'
+ AXStaticText title='' value='This should also be '
+ AXStaticText title='' value='seen'
+ AXStaticText title='' value=' as a group.'
+ AXGroup title='' value=''
+ AXListMarker title='' value='•'
+ AXStaticText title='' value='Some '
+ AXStaticText title='' value='more'
+ AXStaticText title='' value=' text.'
diff --git a/content/test/data/accessibility/span-expected-mac.txt b/content/test/data/accessibility/span-expected-mac.txt
new file mode 100644
index 0000000..475bd21
--- /dev/null
+++ b/content/test/data/accessibility/span-expected-mac.txt
@@ -0,0 +1,5 @@
+AXWebArea value=''
+ AXGroup value=''
+ AXStaticText value='This paragraph has one '
+ AXStaticText value='word'
+ AXStaticText value=' in a span.'
diff --git a/content/test/data/accessibility/span-expected-win.txt b/content/test/data/accessibility/span-expected-win.txt
new file mode 100644
index 0000000..5bdd4fd
--- /dev/null
+++ b/content/test/data/accessibility/span-expected-win.txt
@@ -0,0 +1,5 @@
+ROLE_SYSTEM_DOCUMENT name='' READONLY FOCUSABLE
+ IA2_ROLE_PARAGRAPH name=''
+ ROLE_SYSTEM_TEXT name='This paragraph has one ' READONLY
+ ROLE_SYSTEM_TEXT name='word' READONLY
+ ROLE_SYSTEM_TEXT name=' in a span.' READONLY
diff --git a/content/test/data/accessibility/span.html b/content/test/data/accessibility/span.html
new file mode 100644
index 0000000..3dcf6a0
--- /dev/null
+++ b/content/test/data/accessibility/span.html
@@ -0,0 +1,11 @@
+<!--
+@MAC-DENY:title*
+-->
+<!doctype html>
+<html>
+<body>
+ <p>
+ This paragraph has one <span>word</span> in a span.
+ </p>
+</body>
+</html>
diff --git a/content/test/data/accessibility/svg-expected-mac.txt b/content/test/data/accessibility/svg-expected-mac.txt
new file mode 100644
index 0000000..75f8bca
--- /dev/null
+++ b/content/test/data/accessibility/svg-expected-mac.txt
@@ -0,0 +1,5 @@
+AXWebArea title='' value=''
+ AXGroup title='' value=''
+ AXGroup title='' value='' description='svg'
+ AXGroup title='Test' value=''
+ AXStaticText title='' value='Test'
diff --git a/content/test/data/accessibility/svg-expected-win.txt b/content/test/data/accessibility/svg-expected-win.txt
new file mode 100644
index 0000000..e5955eb
--- /dev/null
+++ b/content/test/data/accessibility/svg-expected-win.txt
@@ -0,0 +1,5 @@
+ROLE_SYSTEM_DOCUMENT name='' READONLY FOCUSABLE
+ IA2_ROLE_SECTION name='' READONLY
+ ROLE_SYSTEM_GRAPHIC name='svg' FOCUSABLE
+ IA2_ROLE_SECTION name='Test' FOCUSABLE
+ ROLE_SYSTEM_TEXT name='Test' READONLY
diff --git a/content/test/data/accessibility/svg.html b/content/test/data/accessibility/svg.html
new file mode 100644
index 0000000..446cd98
--- /dev/null
+++ b/content/test/data/accessibility/svg.html
@@ -0,0 +1,18 @@
+<!--
+@MAC-ALLOW:description='svg'
+-->
+<!doctype html>
+<html>
+<body>
+
+<svg aria-label="svg">
+ <circle r="200" cx="200" cy="200" stroke="red" stroke-width="1" fill="yellow" />
+ <ellipse cx="120" cy="180" rx="18" ry="33" fill="black"/>
+ <ellipse cx="280" cy="120" rx="18" ry="33" fill="black"/>
+ <ellipse cx="200" cy="220" rx="8" ry="15" fill="black"/>
+ <path stroke-width="10" stroke="black" fill="none" stroke-linecap="round" d="M120,280 Q200,330 290,280"/>
+ <text x="150" y="130" fill="red">Test</text>
+</svg>
+
+</body>
+</html>
diff --git a/content/test/data/accessibility/tab-expected-mac.txt b/content/test/data/accessibility/tab-expected-mac.txt
new file mode 100644
index 0000000..9c65ce6
--- /dev/null
+++ b/content/test/data/accessibility/tab-expected-mac.txt
@@ -0,0 +1,4 @@
+AXWebArea title='' value=''
+ AXTabGroup title='' value=''
+ AXRadioButton title='Tab 1' value='0'
+ AXRadioButton title='Tab 2' value='0'
diff --git a/content/test/data/accessibility/tab-expected-win.txt b/content/test/data/accessibility/tab-expected-win.txt
new file mode 100644
index 0000000..e6cab3f
--- /dev/null
+++ b/content/test/data/accessibility/tab-expected-win.txt
@@ -0,0 +1,4 @@
+ROLE_SYSTEM_DOCUMENT name='' READONLY FOCUSABLE
+ ROLE_SYSTEM_PAGETABLIST name=''
+ ROLE_SYSTEM_PAGETAB name='Tab 1'
+ ROLE_SYSTEM_PAGETAB name='Tab 2'
diff --git a/content/test/data/accessibility/tab.html b/content/test/data/accessibility/tab.html
new file mode 100644
index 0000000..d9b7e3e
--- /dev/null
+++ b/content/test/data/accessibility/tab.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<html>
+<body>
+ <div role="tablist">
+ <div role="tab" id="tab1">Tab 1</div>
+ <div role="tab" id="tab2">Tab 2</div>
+ </div>
+</body>
+</html>
diff --git a/content/test/data/accessibility/ul-expected-mac.txt b/content/test/data/accessibility/ul-expected-mac.txt
index ddda508..ca22ddf 100644
--- a/content/test/data/accessibility/ul-expected-mac.txt
+++ b/content/test/data/accessibility/ul-expected-mac.txt
@@ -1,11 +1,11 @@
-AXWebArea subrole=(null) title='' value=''
+AXWebArea title='' value=''
AXList subrole=AXContentList title='' value=''
- AXGroup subrole=(null) title='' value=''
- AXListMarker subrole=(null) title='' value='•'
- AXStaticText subrole=(null) title='' value='Item 1'
- AXGroup subrole=(null) title='' value=''
- AXListMarker subrole=(null) title='' value='•'
- AXStaticText subrole=(null) title='' value='Item 2'
- AXGroup subrole=(null) title='' value=''
- AXListMarker subrole=(null) title='' value='•'
- AXStaticText subrole=(null) title='' value='Item 3'
+ AXGroup title='' value=''
+ AXListMarker title='' value='•'
+ AXStaticText title='' value='Item 1'
+ AXGroup title='' value=''
+ AXListMarker title='' value='•'
+ AXStaticText title='' value='Item 2'
+ AXGroup title='' value=''
+ AXListMarker title='' value='•'
+ AXStaticText title='' value='Item 3'