Commit bf08f73f authored by aboxhall@chromium.org's avatar aboxhall@chromium.org

Modify AccessibilityTreeFormatter to build up an internal representation of...

Modify AccessibilityTreeFormatter to build up an internal representation of the tree in the form of DictionaryValue et al. This may be used at a later stage to create a JSON representation of the tree.

Also modify the Mac platform implementation to use the NSAccessibility attribute names rather than method names.

BUG=

Review URL: https://chromiumcodereview.appspot.com/13479003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@194775 0039d316-1c4b-4281-b951-d872f2087c98
parent afde262a
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/logging.h" #include "base/logging.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/string_util.h" #include "base/string_util.h"
#include "base/stringprintf.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/utf_string_conversions.h" #include "base/utf_string_conversions.h"
#include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/accessibility/browser_accessibility_manager.h"
...@@ -18,11 +19,12 @@ namespace content { ...@@ -18,11 +19,12 @@ namespace content {
namespace { namespace {
const int kIndentSpaces = 4; const int kIndentSpaces = 4;
const char* kSkipString = "@NO_DUMP"; const char* kSkipString = "@NO_DUMP";
const char* kChildrenDictAttr = "children";
} }
AccessibilityTreeFormatter::AccessibilityTreeFormatter( AccessibilityTreeFormatter::AccessibilityTreeFormatter(
BrowserAccessibility* node) BrowserAccessibility* root)
: node_(node) { : root_(root) {
Initialize(); Initialize();
} }
...@@ -45,33 +47,59 @@ AccessibilityTreeFormatter* AccessibilityTreeFormatter::Create( ...@@ -45,33 +47,59 @@ AccessibilityTreeFormatter* AccessibilityTreeFormatter::Create(
AccessibilityTreeFormatter::~AccessibilityTreeFormatter() { AccessibilityTreeFormatter::~AccessibilityTreeFormatter() {
} }
scoped_ptr<DictionaryValue>
AccessibilityTreeFormatter::BuildAccessibilityTree() {
scoped_ptr<DictionaryValue> dict(new DictionaryValue);
RecursiveBuildAccessibilityTree(*root_, dict.get());
return dict.Pass();
}
void AccessibilityTreeFormatter::FormatAccessibilityTree( void AccessibilityTreeFormatter::FormatAccessibilityTree(
string16* contents) { string16* contents) {
RecursiveFormatAccessibilityTree(node_, contents, 0); scoped_ptr<DictionaryValue> dict = BuildAccessibilityTree();
RecursiveFormatAccessibilityTree(*(dict.get()), contents);
}
void AccessibilityTreeFormatter::RecursiveBuildAccessibilityTree(
const BrowserAccessibility& node, DictionaryValue* dict) {
AddProperties(node, dict);
ListValue* children = new ListValue;
dict->Set(kChildrenDictAttr, children);
for (size_t i = 0; i < node.children().size(); ++i) {
BrowserAccessibility* child_node = node.children()[i];
DictionaryValue* child_dict = new DictionaryValue;
children->Append(child_dict);
RecursiveBuildAccessibilityTree(*child_node, child_dict);
}
} }
void AccessibilityTreeFormatter::RecursiveFormatAccessibilityTree( void AccessibilityTreeFormatter::RecursiveFormatAccessibilityTree(
BrowserAccessibility* node, string16* contents, int indent) { const DictionaryValue& dict, string16* contents, int depth) {
scoped_ptr<char[]> prefix(new char[indent + 1]); string16 line = ToString(dict, string16(depth * kIndentSpaces, ' '));
for (int i = 0; i < indent; ++i)
prefix[i] = ' ';
prefix[indent] = '\0';
string16 line = ToString(node, prefix.get());
if (line.find(ASCIIToUTF16(kSkipString)) != string16::npos) if (line.find(ASCIIToUTF16(kSkipString)) != string16::npos)
return; return;
*contents += line; *contents += line;
for (size_t i = 0; i < node->children().size(); ++i) { const ListValue* children;
RecursiveFormatAccessibilityTree(node->children()[i], contents, dict.GetList(kChildrenDictAttr, &children);
indent + kIndentSpaces); const DictionaryValue* child_dict;
for (size_t i = 0; i < children->GetSize(); i++) {
children->GetDictionary(i, &child_dict);
RecursiveFormatAccessibilityTree(*child_dict, contents, depth + 1);
} }
} }
#if (!defined(OS_WIN) && !defined(OS_MACOSX)) #if (!defined(OS_WIN) && !defined(OS_MACOSX))
string16 AccessibilityTreeFormatter::ToString(BrowserAccessibility* node, void AccessibilityTreeFormatter::AddProperties(const BrowserAccessibility& node,
char* prefix) { DictionaryValue* dict) {
return UTF8ToUTF16(prefix) + base::IntToString16(node->renderer_id()) + dict->SetInteger("id", node.renderer_id());
}
string16 AccessibilityTreeFormatter::ToString(const DictionaryValue& node,
const string16& indent) {
int id_value;
node.GetInteger("id", &id_value);
return indent + base::IntToString16(id_value) +
ASCIIToUTF16("\n"); ASCIIToUTF16("\n");
} }
...@@ -127,23 +155,31 @@ bool AccessibilityTreeFormatter::MatchesFilters( ...@@ -127,23 +155,31 @@ bool AccessibilityTreeFormatter::MatchesFilters(
return allow; return allow;
} }
void AccessibilityTreeFormatter::StartLine() { string16 AccessibilityTreeFormatter::FormatCoordinates(
line_.clear(); const char* name, const char* x_name, const char* y_name,
const DictionaryValue& value) {
int x, y;
value.GetInteger(x_name, &x);
value.GetInteger(y_name, &y);
std::string xy_str(base::StringPrintf("%s=(%d, %d)", name, x, y));
return UTF8ToUTF16(xy_str);
}
void AccessibilityTreeFormatter::WriteAttribute(
bool include_by_default, const std::string& attr, string16* line) {
WriteAttribute(include_by_default, UTF8ToUTF16(attr), line);
} }
void AccessibilityTreeFormatter::Add( void AccessibilityTreeFormatter::WriteAttribute(
bool include_by_default, const string16& attr) { bool include_by_default, const string16& attr, string16* line) {
if (attr.empty()) if (attr.empty())
return; return;
if (!MatchesFilters(attr, include_by_default)) if (!MatchesFilters(attr, include_by_default))
return; return;
if (!line_.empty()) if (!line->empty())
line_ += ASCIIToUTF16(" "); *line += ASCIIToUTF16(" ");
line_ += attr; *line += attr;
}
string16 AccessibilityTreeFormatter::FinishLine() {
return line_;
} }
} // namespace content } // namespace content
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/string16.h" #include "base/string16.h"
#include "base/utf_string_conversions.h" #include "base/utf_string_conversions.h"
#include "base/values.h"
#include "content/browser/accessibility/browser_accessibility.h" #include "content/browser/accessibility/browser_accessibility.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
...@@ -23,11 +24,33 @@ class RenderViewHost; ...@@ -23,11 +24,33 @@ class RenderViewHost;
// implemented. // implemented.
class CONTENT_EXPORT AccessibilityTreeFormatter { class CONTENT_EXPORT AccessibilityTreeFormatter {
public: public:
explicit AccessibilityTreeFormatter(BrowserAccessibility* node); explicit AccessibilityTreeFormatter(BrowserAccessibility* root);
virtual ~AccessibilityTreeFormatter(); virtual ~AccessibilityTreeFormatter();
static AccessibilityTreeFormatter* Create(RenderViewHost* rvh); static AccessibilityTreeFormatter* Create(RenderViewHost* rvh);
// Populates the given DictionaryValue with the accessibility tree.
// The dictionary contains a key/value pair for each attribute of the node,
// plus a "children" attribute containing a list of all child nodes.
// {
// "AXName": "node", /* actual attributes will vary by platform */
// "position": { /* some attributes may be dictionaries */
// "x": 0,
// "y": 0
// },
// /* ... more attributes of |node| */
// "children": [ { /* list of children created recursively */
// "AXName": "child node 1",
// /* ... more attributes */
// "children": [ ]
// }, {
// "AXName": "child name 2",
// /* ... more attributes */
// "children": [ ]
// } ]
// }
scoped_ptr<DictionaryValue> BuildAccessibilityTree();
// Dumps a BrowserAccessibility tree into a string. // Dumps a BrowserAccessibility tree into a string.
void FormatAccessibilityTree(string16* contents); void FormatAccessibilityTree(string16* contents);
...@@ -76,25 +99,45 @@ class CONTENT_EXPORT AccessibilityTreeFormatter { ...@@ -76,25 +99,45 @@ class CONTENT_EXPORT AccessibilityTreeFormatter {
static const std::string GetDenyString(); static const std::string GetDenyString();
protected: protected:
void RecursiveFormatAccessibilityTree(BrowserAccessibility* node, void RecursiveFormatAccessibilityTree(const BrowserAccessibility& node,
string16* contents, string16* contents,
int indent); int indent);
void RecursiveBuildAccessibilityTree(const BrowserAccessibility& node,
DictionaryValue* tree_node);
void RecursiveFormatAccessibilityTree(const DictionaryValue& tree_node,
string16* contents,
int depth = 0);
// Overridden by each platform to add the required attributes for each node
// into the given dict.
void AddProperties(const BrowserAccessibility& node, DictionaryValue* dict);
string16 FormatCoordinates(const char* name,
const char* x_name,
const char* y_name,
const DictionaryValue& value);
// Returns a platform specific representation of a BrowserAccessibility. // Returns a platform specific representation of a BrowserAccessibility.
// Should be zero or more complete lines, each with |prefix| prepended // Should be zero or more complete lines, each with |prefix| prepended
// (to indent each line). // (to indent each line).
string16 ToString(BrowserAccessibility* node, char* prefix); string16 ToString(const DictionaryValue& node, const string16& indent);
void Initialize(); void Initialize();
bool MatchesFilters(const string16& text, bool default_result) const; bool MatchesFilters(const string16& text, bool default_result) const;
void StartLine();
void Add(bool include_by_default, const string16& attr);
string16 FinishLine();
BrowserAccessibility* node_; // Writes the given attribute string out to |line| if it matches the filters.
void WriteAttribute(bool include_by_default,
const string16& attr,
string16* line);
void WriteAttribute(bool include_by_default,
const std::string& attr,
string16* line);
BrowserAccessibility* root_;
// Filters used when formatting the accessibility tree as text.
std::vector<Filter> filters_; std::vector<Filter> filters_;
string16 line_;
DISALLOW_COPY_AND_ASSIGN(AccessibilityTreeFormatter); DISALLOW_COPY_AND_ASSIGN(AccessibilityTreeFormatter);
}; };
......
AXWebArea AXWebArea
AXGroup AXGroup
AXLink title='normal link' AXLink AXTitle='normal link'
AXStaticText value='normal link' AXStaticText AXValue='normal link'
AXWebArea AXWebArea
AXGroup AXGroup
AXLink title='Link with image at start.' AXLink AXTitle='Link with image at start.'
AXImage description='Link' AXImage AXDescription='Link'
AXStaticText value=' with image at start.' AXStaticText AXValue=' with image at start.'
AXLink title='Link with image in the middle.' AXLink AXTitle='Link with image in the middle.'
AXStaticText value='Link with ' AXStaticText AXValue='Link with '
AXImage description='image' AXImage AXDescription='image'
AXStaticText value=' in the middle.' AXStaticText AXValue=' in the middle.'
AXLink title='Link with broken in the middle.' AXLink AXTitle='Link with broken in the middle.'
AXStaticText value='Link with ' AXStaticText AXValue='Link with '
AXImage description='broken' AXImage AXDescription='broken'
AXStaticText value=' in the middle.' AXStaticText AXValue=' in the middle.'
AXLink title='Link with image at the end' AXLink AXTitle='Link with image at the end'
AXStaticText value='Link with image at the ' AXStaticText AXValue='Link with image at the '
AXImage description='end' AXImage AXDescription='end'
<!-- <!--
@MAC-ALLOW:description* @MAC-ALLOW:AXDescription*
--> -->
<html> <html>
<body> <body>
......
#<skip -- wrong roleDescription (bug)> #<skip -- wrong roleDescription (bug)>
AXWebArea subrole=(null) roleDescription='HTML content' AXWebArea AXRoleDescription='HTML content'
AXGroup subrole=AXLandmarkContentInfo roleDescription='address' AXGroup AXSubrole=AXLandmarkContentInfo AXRoleDescription='group'
AXStaticText subrole=(null) roleDescription='text' value='Please contact John Citizen for more information.' AXStaticText AXRoleDescription='text' AXValue='Please contact John Citizen for more information.'
<!-- <!--
@MAC-ALLOW:subrole=* @MAC-ALLOW:AXSubrole=*
@MAC-ALLOW:roleDescription=* @MAC-ALLOW:AXRoleDescription=*
@WIN-ALLOW:role:* @WIN-ALLOW:role:*
@WIN-ALLOW:xml-role* @WIN-ALLOW:xml-role*
--> -->
......
AXWebArea AXWebArea
AXGroup subrole=AXLandmarkApplication roleDescription='application' AXGroup AXSubrole=AXLandmarkApplication AXRoleDescription='application'
<!-- <!--
@MAC-ALLOW:roleDescription='application' @MAC-ALLOW:AXRoleDescription='application'
@MAC-ALLOW:subrole* @MAC-ALLOW:AXSubrole*
--> -->
<html> <html>
<body role="application" id="testAriaApplication"> <body role="application" id="testAriaApplication">
......
AXWebArea AXWebArea
AXGroup AXGroup
AXStaticText value='State' AXStaticText AXValue='State'
AXComboBox AXComboBox
AXList AXList
AXStaticText title='Alabama' AXStaticText AXTitle='Alabama'
AXStaticText title='Alaska' AXStaticText AXTitle='Alaska'
AXWebArea AXWebArea
AXGroup invalid='true' AXGroup AXInvalid='true'
AXStaticText value='invalid=true' AXStaticText AXValue='invalid=true'
AXGroup invalid='spelling' AXGroup AXInvalid='spelling'
AXStaticText value='invalid=spelling' AXStaticText AXValue='invalid=spelling'
AXGroup invalid='grammar' AXGroup AXInvalid='grammar'
AXStaticText value='invalid=grammar' AXStaticText AXValue='invalid=grammar'
AXGroup invalid='false' AXGroup AXInvalid='false'
AXStaticText value='invalid=false' AXStaticText AXValue='invalid=false'
AXGroup invalid='false' AXGroup AXInvalid='false'
AXStaticText value='invalid=<empty>' AXStaticText AXValue='invalid=<empty>'
AXGroup invalid='somethingelse' AXGroup AXInvalid='somethingelse'
AXStaticText value='invalid=somethingelse' AXStaticText AXValue='invalid=somethingelse'
<!-- <!--
@MAC-ALLOW:invalid=* @MAC-ALLOW:AXInvalid=*
@WIN-ALLOW:checkable:* @WIN-ALLOW:checkable:*
@WIN-DENY:name='' @WIN-DENY:name=''
--> -->
......
AXWebArea AXWebArea
AXHeading title='H3' value='3' AXHeading AXTitle='H3' AXValue='3'
AXStaticText value='H3' AXStaticText AXValue='H3'
AXHeading title='ARIA heading level 3' value='3' AXHeading AXTitle='ARIA heading level 3' AXValue='3'
AXStaticText value='ARIA heading level 3' AXStaticText AXValue='ARIA heading level 3'
AXOutline AXOutline
AXRow subrole=AXOutlineRow disclosing='1' disclosureLevel='0' AXRow AXSubrole=AXOutlineRow AXDisclosing='1' AXDisclosureLevel='0'
AXStaticText value='Tree item at level 1' AXStaticText AXValue='Tree item at level 1'
AXRow subrole=AXOutlineRow disclosing='0' disclosureLevel='1' AXRow AXSubrole=AXOutlineRow AXDisclosing='0' AXDisclosureLevel='1'
AXStaticText value='Tree item at level 2' AXStaticText AXValue='Tree item at level 2'
AXRow subrole=AXOutlineRow disclosing='0' disclosureLevel='2' AXRow AXSubrole=AXOutlineRow AXDisclosing='0' AXDisclosureLevel='2'
AXStaticText value='Tree item at level 3' AXStaticText AXValue='Tree item at level 3'
AXTable AXTable
AXRow disclosureLevel='0' AXRow AXDisclosureLevel='0'
AXCell AXCell
AXStaticText value='Cell at level 1' AXStaticText AXValue='Cell at level 1'
AXRow disclosureLevel='1' AXRow AXDisclosureLevel='1'
AXCell AXCell
AXStaticText value='Cell at level 2' AXStaticText AXValue='Cell at level 2'
AXColumn AXColumn
AXGroup AXGroup
<!doctype html> <!doctype html>
<!-- <!--
@MAC-ALLOW:subrole=AXOutlineRow @MAC-ALLOW:AXSubrole=AXOutlineRow
@MAC-ALLOW:disclosing* @MAC-ALLOW:AXDisclosing*
@MAC-ALLOW:disclosureLevel* @MAC-ALLOW:AXDisclosureLevel*
@WIN-ALLOW:level:1 @WIN-ALLOW:level:1
@WIN-ALLOW:level:2 @WIN-ALLOW:level:2
@WIN-ALLOW:level:3 @WIN-ALLOW:level:3
......
AXWebArea AXWebArea
AXMenuBar AXMenuBar
AXMenuItem title='File' AXMenuItem AXTitle='File'
AXMenuItem title='Edit' AXMenuItem AXTitle='Edit'
AXMenuItem title='View' AXMenuItem AXTitle='View'
AXMenu description='File' AXMenu AXDescription='File'
AXMenuItem title='New' AXMenuItem AXTitle='New'
AXMenuItem title='Open' AXMenuItem AXTitle='Open'
AXMenuItem title='Save' AXMenuItem AXTitle='Save'
AXMenuItem title='Quit' AXMenuItem AXTitle='Quit'
<!-- <!--
@MAC-ALLOW:description='File' @MAC-ALLOW:AXDescription='File'
@MAC-DENY:value* @MAC-DENY:AXValue*
@WIN-DENY:description='' @WIN-DENY:description=''
--> -->
<html> <html>
......
#<skip - role should be AXMenuItem. http://crbug.com/169578 #<skip - role should be AXMenuItem. http://crbug.com/169578
- role description should be 'menu item'. http://crbug.com/169580 - role description should be 'menu item'. http://crbug.com/169580
- AXMenuItemMarkChar should be \236. http://crbug.com/169582> - AXMenuItemMarkChar should be \236. http://crbug.com/169582>
AXWebArea roleDescription='HTML content' AXWebArea AXRoleDescription='HTML content'
AXMenu roleDescription='menu' AXMenu AXRoleDescription='menu'
AXMenuItem roleDescription='menu item' AXMenuItemMarkChar='\236' AXGroup AXRoleDescription='aria-menuitemradio'
AXStaticText roleDescription='text' value='Menu item 1' AXStaticText AXRoleDescription='text' AXValue='Menu item 1'
AXMenuItem roleDescription='menu item' AXMenuItemMarkChar='(null)' AXGroup AXRoleDescription='aria-menuitemradio'
AXStaticText roleDescription='text' value='Menu item 2' AXStaticText AXRoleDescription='text' AXValue='Menu item 2'
<!-- <!--
@MAC-ALLOW:roleDescription=* @MAC-ALLOW:AXRoleDescription=*
@WIN-ALLOW:checkable:* @WIN-ALLOW:checkable:*
@WIN-DENY:name='' @WIN-DENY:name=''
--> -->
......
AXWebArea AXWebArea
AXButton title='Regular button' AXButton AXTitle='Regular button'
AXButton title='Toggle button unpressed' AXButton AXTitle='Toggle button unpressed'
AXButton title='Toggle button pressed' AXButton AXTitle='Toggle button pressed'
AXButton title='Toggle button mixed' AXButton AXTitle='Toggle button mixed'
AXWebArea roleDescription='HTML content' AXWebArea AXRoleDescription='HTML content'
AXProgressIndicator roleDescription='progress indicator' value='3' minValue='1' maxValue='37' AXProgressIndicator AXRoleDescription='progress indicator' AXValue='3' AXMinValue='1' AXMaxValue='37'
AXProgressIndicator roleDescription='progress indicator' value='0' minValue='1' maxValue='96' valueDescription='three' AXProgressIndicator AXRoleDescription='progress indicator' AXValue='0' AXMinValue='1' AXMaxValue='96' AXValueDescription='three'
<!-- <!--
@MAC-ALLOW:roleDescription=* @MAC-ALLOW:AXRoleDescription=*
@MAC-ALLOW:valueDescription=* @MAC-ALLOW:AXValueDescription=*
@MAC-ALLOW:minValue=* @MAC-ALLOW:AXMinValue=*
@MAC-ALLOW:maxValue=* @MAC-ALLOW:AXMaxValue=*
@WIN-ALLOW:READONLY @WIN-ALLOW:READONLY
@WIN-ALLOW:STATE_SYSTEM_READONLY @WIN-ALLOW:STATE_SYSTEM_READONLY
@WIN-ALLOW:valuetext:* @WIN-ALLOW:valuetext:*
......
AXWebArea AXWebArea
AXProgressIndicator value='51' maxValue='101' AXProgressIndicator AXValue='51' AXMaxValue='101'
AXScrollBar value='52' maxValue='102' AXScrollBar AXValue='52' AXMaxValue='102'
AXSlider value='53' maxValue='103' AXSlider AXValue='53' AXMaxValue='103'
AXSlider value='54' maxValue='104' AXSlider AXValue='54' AXMaxValue='104'
<!doctype html> <!doctype html>
<!-- <!--
@MAC-ALLOW:maxValue=* @MAC-ALLOW:AXMaxValue=*
@MAC-DENY:title* @MAC-DENY:AXTitle*
@WIN-ALLOW:maximumValue=* @WIN-ALLOW:maximumValue=*
@WIN-DENY:description='' @WIN-DENY:description=''
--> -->
......
AXWebArea AXWebArea
AXProgressIndicator minValue='1' AXProgressIndicator AXMinValue='1'
AXScrollBar minValue='2' AXScrollBar AXMinValue='2'
AXSlider minValue='3' AXSlider AXMinValue='3'
AXSlider minValue='4' AXSlider AXMinValue='4'
<!doctype html> <!doctype html>
<!-- <!--
@MAC-ALLOW:minValue=* @MAC-ALLOW:AXMinValue=*
@MAC-DENY:title* @MAC-DENY:AXTitle*
@MAC-DENY:value* @MAC-DENY:AXValue*
@WIN-ALLOW:minimumValue=* @WIN-ALLOW:minimumValue=*
@WIN-DENY:description='' @WIN-DENY:description=''
--> -->
......
AXWebArea AXWebArea
AXGroup subrole=AXDocumentArticle AXGroup AXSubrole=AXDocumentArticle
AXStaticText value='This is an article.' AXStaticText AXValue='This is an article.'
<!-- <!--
@MAC-ALLOW:subrole=AXDocumentArticle @MAC-ALLOW:AXSubrole=AXDocumentArticle
@MAC-DENY:title* @MAC-DENY:AXTitle*
@WIN-ALLOW:xml-roles:article @WIN-ALLOW:xml-roles:article
--> -->
<!doctype html> <!doctype html>
......
...@@ -2,6 +2,6 @@ ...@@ -2,6 +2,6 @@
# wrong, so we assume this is correct. # wrong, so we assume this is correct.
AXWebArea AXWebArea
AXGroup AXGroup
AXStaticText value='Some LTR text' AXStaticText AXValue='Some LTR text'
AXStaticText value='Some RTL text ' AXStaticText AXValue='Some RTL text '
AXStaticText value='with some LTR text embedded' AXStaticText AXValue='with some LTR text embedded'
<!-- <!--
@MAC_ALLOW:subrole=* @MAC_ALLOW:AXSubrole=*
@WIN_ALLOW:* @WIN_ALLOW:*
--> -->
<html> <html>
......
AXWebArea AXWebArea
AXGroup AXGroup
AXStaticText value='Text line 1 ' AXStaticText AXValue='Text line 1 '
AXStaticText value='Text line 2' AXStaticText AXValue='Text line 2'
AXWebArea AXWebArea
AXGroup AXGroup
AXButton title='InnerText0' AXButton AXTitle='InnerText0'
AXButton title='InnerText1' help='Title1' AXButton AXTitle='InnerText1' AXHelp='Title1'
AXButton title='InnerText2' description='AriaLabel2' help='Title2' AXButton AXTitle='InnerText2' AXDescription='AriaLabel2' AXHelp='Title2'
AXButton title='InnerText3' description='LabelledBy3' help='Title3' AXButton AXTitle='InnerText3' AXDescription='LabelledBy3' AXHelp='Title3'
AXButton title='InnerText4' description='LabelledBy4' help='DescribedBy4' AXButton AXTitle='InnerText4' AXDescription='LabelledBy4' AXHelp='DescribedBy4'
AXButton title='InnerText5' help='DescribedBy5' AXButton AXTitle='InnerText5' AXHelp='DescribedBy5'
<!-- <!--
@WIN-ALLOW:description* @WIN-ALLOW:description*
@MAC-ALLOW:description* @MAC-ALLOW:AXDescription*
@MAC-ALLOW:help* @MAC-ALLOW:AXHelp*
@MAC-DENY:value* @MAC-DENY:AXValue*
--> -->
<html> <html>
<body> <body>
......
AXWebArea AXWebArea
AXGroup AXGroup
AXImage AXImage
AXStaticText value='Static fallback' AXStaticText AXValue='Static fallback'
AXGroup AXGroup
AXLink title='Interactive fallback' AXLink AXTitle='Interactive fallback'
AXStaticText value='Interactive fallback' AXStaticText AXValue='Interactive fallback'
AXWebArea AXWebArea
AXGroup AXGroup
AXCheckBox description='Title0' AXCheckBox AXDescription='Title0'
AXCheckBox title='Label1' help='Title1' AXCheckBox AXTitle='Label1' AXHelp='Title1'
AXCheckBox description='AriaLabel2' help='Title2' AXCheckBox AXDescription='AriaLabel2' AXHelp='Title2'
AXCheckBox description='LabelledBy3' help='Title3' AXCheckBox AXDescription='LabelledBy3' AXHelp='Title3'
AXCheckBox description='LabelledBy4' help='DescribedBy4' AXCheckBox AXDescription='LabelledBy4' AXHelp='DescribedBy4'
AXCheckBox help='DescribedBy5' AXCheckBox AXHelp='DescribedBy5'
<!-- <!--
@WIN-ALLOW:description* @WIN-ALLOW:description*
@MAC-ALLOW:description* @MAC-ALLOW:AXDescription*
@MAC-ALLOW:help* @MAC-ALLOW:AXHelp*
@MAC-DENY:value* @MAC-DENY:AXValue*
--> -->
<html> <html>
<body> <body>
......
AXWebArea AXWebArea
AXGroup title='Focusable div' AXGroup AXTitle='Focusable div'
AXStaticText value='Focusable div' AXStaticText AXValue='Focusable div'
AXWebArea AXWebArea
AXList subrole=AXDescriptionList AXList AXSubrole=AXDescriptionList
AXGroup subrole=AXTerm AXGroup AXSubrole=AXTerm
AXStaticText value='Term' AXStaticText AXValue='Term'
AXGroup subrole=AXDescription AXGroup AXSubrole=AXDescription
AXStaticText value='Description' AXStaticText AXValue='Description'
AXGroup subrole=AXDefinition AXGroup AXSubrole=AXDefinition
AXStaticText value='Definition' AXStaticText AXValue='Definition'
<!doctype html> <!doctype html>
<!-- <!--
@MAC-ALLOW:subrole* @MAC-ALLOW:AXSubrole*
--> -->
<html> <html>
<body> <body>
......
AXWebArea AXWebArea
AXGroup AXGroup
AXStaticText value='One word is ' AXStaticText AXValue='One word is '
AXStaticText value='emphasized' AXStaticText AXValue='emphasized'
AXStaticText value='.' AXStaticText AXValue='.'
AXWebArea AXWebArea
AXGroup subrole=AXLandmarkContentInfo roleDescription='footer' AXGroup AXSubrole=AXLandmarkContentInfo AXRoleDescription='footer'
AXStaticText value='Footer element' AXStaticText AXValue='Footer element'
<!-- <!--
@MAC-ALLOW:roleDescription='footer' @MAC-ALLOW:AXRoleDescription='footer'
@MAC-ALLOW:subrole* @MAC-ALLOW:AXSubrole*
--> -->
<html> <html>
<body> <body>
......
AXWebArea AXWebArea
AXGroup AXGroup
AXButton title='Submit' AXButton AXTitle='Submit'
AXWebArea AXWebArea
AXHeading title='Heading 1' value='1' AXHeading AXTitle='Heading 1' AXValue='1'
AXStaticText value='Heading 1' AXStaticText AXValue='Heading 1'
AXHeading title='Heading 2' value='2' AXHeading AXTitle='Heading 2' AXValue='2'
AXStaticText value='Heading 2' AXStaticText AXValue='Heading 2'
AXHeading title='Heading 3' value='3' AXHeading AXTitle='Heading 3' AXValue='3'
AXStaticText value='Heading 3' AXStaticText AXValue='Heading 3'
AXHeading title='Heading 4' value='4' AXHeading AXTitle='Heading 4' AXValue='4'
AXStaticText value='Heading 4' AXStaticText AXValue='Heading 4'
AXHeading title='Heading 5' value='5' AXHeading AXTitle='Heading 5' AXValue='5'
AXStaticText value='Heading 5' AXStaticText AXValue='Heading 5'
AXHeading title='Heading 6' value='6' AXHeading AXTitle='Heading 6' AXValue='6'
AXStaticText value='Heading 6' AXStaticText AXValue='Heading 6'
AXHeading title='ARIA Heading 1' value='1' AXHeading AXTitle='ARIA Heading 1' AXValue='1'
AXStaticText value='ARIA Heading 1' AXStaticText AXValue='ARIA Heading 1'
AXHeading title='ARIA Heading 2' value='2' AXHeading AXTitle='ARIA Heading 2' AXValue='2'
AXStaticText value='ARIA Heading 2' AXStaticText AXValue='ARIA Heading 2'
AXHeading title='ARIA Heading 3' value='3' AXHeading AXTitle='ARIA Heading 3' AXValue='3'
AXStaticText value='ARIA Heading 3' AXStaticText AXValue='ARIA Heading 3'
AXHeading title='ARIA Heading 4' value='4' AXHeading AXTitle='ARIA Heading 4' AXValue='4'
AXStaticText value='ARIA Heading 4' AXStaticText AXValue='ARIA Heading 4'
AXHeading title='ARIA Heading 5' value='5' AXHeading AXTitle='ARIA Heading 5' AXValue='5'
AXStaticText value='ARIA Heading 5' AXStaticText AXValue='ARIA Heading 5'
AXHeading title='ARIA Heading 6' value='6' AXHeading AXTitle='ARIA Heading 6' AXValue='6'
AXStaticText value='ARIA Heading 6' AXStaticText AXValue='ARIA Heading 6'
AXWebArea position=(0, 0) size=(800, 600)
AXGroup position=(0, 0) size=(300, 150)
AXButton position=(25, 25) size=(250, 50)
AXGroup position=(0, 150) size=(300, 150)
AXButton position=(25, 175) size=(250, 50)
AXGroup position=(0, 300) size=(300, 150)
AXUnknown position=(0, 300) size=(300, 100)
AXUnknown position=(0, 0) size=(0, 0)
AXWebArea position=(0, 300) size=(300, 100)
AXGroup position=(0, 300) size=(300, 100)
AXButton position=(25, 325) size=(250, 50)
AXGroup position=(0, 450) size=(300, 150)
AXUnknown position=(0, 450) size=(150, 50)
AXUnknown position=(0, 0) size=(0, 0)
AXWebArea position=(0, 450) size=(300, 100)
AXGroup position=(-150, 400) size=(300, 100)
AXButton position=(-125, 425) size=(250, 50)
AXScrollBar position=(0, 0) size=(0, 0)
AXScrollBar position=(0, 0) size=(0, 0)
<!doctype html> <!doctype html>
<!-- <!--
@MAC-DENY:title* @MAC-DENY:AXTitle*
@MAC-DENY:value* @MAC-DENY:AXValue*
@MAC-ALLOW:position* @MAC-ALLOW:position*
@MAC-ALLOW:size* @MAC-ALLOW:size*
......
AXWebArea AXWebArea
AXGroup AXGroup
AXButton title='Button' AXButton AXTitle='Button'
<!doctype html> <!doctype html>
<!-- <!--
@MAC-DENY:value* @MAC-DENY:AXValue*
--> -->
<html> <html>
<body> <body>
......
AXWebArea AXWebArea
AXGroup AXGroup
AXColorWell value='rgb 1.00000 0.60000 0.00000 1' AXColorWell AXValue='rgb 1.00000 0.60000 0.00000 1'
<!doctype html> <!doctype html>
<!-- <!--
@MAC-DENY:title* @MAC-DENY:AXTitle*
@WIN-ALLOW:value* @WIN-ALLOW:value*
@WIN-DENY:value='file://* @WIN-DENY:value='file://*
--> -->
......
AXWebArea AXWebArea
AXGroup AXGroup
AXSlider value='5' AXSlider AXValue='5'
AXWebArea AXWebArea
AXGroup AXGroup
AXGroup AXGroup
AXStaticText value='Label' AXStaticText AXValue='Label'
AXWebArea AXWebArea
AXList subrole=AXContentList AXList AXSubrole=AXContentList
AXGroup AXGroup
AXListMarker value='•' AXListMarker AXValue='•'
AXStaticText value='First item properly groups itself despite ' AXStaticText AXValue='First item properly groups itself despite '
AXStaticText value='bolded' AXStaticText AXValue='bolded'
AXStaticText value=' text.' AXStaticText AXValue=' text.'
AXGroup AXGroup
AXListMarker value='•' AXListMarker AXValue='•'
AXStaticText value='This should also be ' AXStaticText AXValue='This should also be '
AXStaticText value='seen' AXStaticText AXValue='seen'
AXStaticText value=' as a group.' AXStaticText AXValue=' as a group.'
AXGroup AXGroup
AXListMarker value='•' AXListMarker AXValue='•'
AXStaticText value='Some ' AXStaticText AXValue='Some '
AXStaticText value='more' AXStaticText AXValue='more'
AXStaticText value=' text.' AXStaticText AXValue=' text.'
<!-- <!--
@MAC-ALLOW:subrole* @MAC-ALLOW:AXSubrole*
--> -->
<html> <html>
<body> <body>
......
AXWebArea AXWebArea
AXGroup AXGroup
AXStaticText value='Before' AXStaticText AXValue='Before'
AXGroup AXGroup
AXStaticText value='Paragraph' AXStaticText AXValue='Paragraph'
AXGroup AXGroup
AXStaticText value='After' AXStaticText AXValue='After'
AXWebArea roleDescription='HTML content' AXWebArea AXRoleDescription='HTML content'
AXGroup roleDescription='group' AXGroup AXRoleDescription='group'
AXPopUpButton roleDescription='pop up button' value='Placeholder option' AXPopUpButton AXRoleDescription='pop up button' AXValue='Placeholder option'
AXUnknown roleDescription='unknown' AXUnknown AXRoleDescription='unknown'
AXMenuItem roleDescription='menu item' value='Placeholder option' AXMenuItem AXRoleDescription='menu item' AXValue='Placeholder option'
AXMenuItem roleDescription='menu item' value='Option 1' AXMenuItem AXRoleDescription='menu item' AXValue='Option 1'
AXMenuItem roleDescription='menu item' value='Option 2' AXMenuItem AXRoleDescription='menu item' AXValue='Option 2'
AXPopUpButton roleDescription='pop up button' value='Option 2' AXPopUpButton AXRoleDescription='pop up button' AXValue='Option 2'
AXUnknown roleDescription='unknown' AXUnknown AXRoleDescription='unknown'
AXMenuItem roleDescription='menu item' value='Option 1' AXMenuItem AXRoleDescription='menu item' AXValue='Option 1'
AXMenuItem roleDescription='menu item' value='Option 2' AXMenuItem AXRoleDescription='menu item' AXValue='Option 2'
AXMenuItem roleDescription='menu item' value='Option 3' AXMenuItem AXRoleDescription='menu item' AXValue='Option 3'
AXPopUpButton roleDescription='pop up button' value='Option 1' AXPopUpButton AXRoleDescription='pop up button' AXValue='Option 1'
AXUnknown roleDescription='unknown' AXUnknown AXRoleDescription='unknown'
AXMenuItem roleDescription='menu item' value='Option 1' AXMenuItem AXRoleDescription='menu item' AXValue='Option 1'
AXMenuItem roleDescription='menu item' value='Option 2' AXMenuItem AXRoleDescription='menu item' AXValue='Option 2'
AXMenuItem roleDescription='menu item' value='Option 3' AXMenuItem AXRoleDescription='menu item' AXValue='Option 3'
<!-- <!--
@MAC-ALLOW:roleDescription=* @MAC-ALLOW:AXRoleDescription=*
--> -->
<html> <html>
<body> <body>
......
AXWebArea AXWebArea
AXGroup AXGroup
AXStaticText value='This paragraph has one ' AXStaticText AXValue='This paragraph has one '
AXStaticText value='word' AXStaticText AXValue='word'
AXStaticText value=' in a span.' AXStaticText AXValue=' in a span.'
<!-- <!--
@MAC-DENY:title* @MAC-DENY:AXTitle*
--> -->
<!doctype html> <!doctype html>
<html> <html>
......
AXWebArea roleDescription='HTML content' AXWebArea AXRoleDescription='HTML content'
AXSlider roleDescription='stepper' value='5' AXSlider AXRoleDescription='stepper' AXValue='5'
<!-- <!--
@MAC-ALLOW:roleDescription* @MAC-ALLOW:AXRoleDescription*
--> -->
<html> <html>
<body> <body>
......
AXWebArea AXWebArea
AXGroup AXGroup
AXGroup description='svg' AXGroup AXDescription='svg'
AXGroup title='Test' AXGroup AXTitle='Test'
AXStaticText value='Test' AXStaticText AXValue='Test'
<!-- <!--
@MAC-ALLOW:description='svg' @MAC-ALLOW:AXDescription='svg'
--> -->
<!doctype html> <!doctype html>
<html> <html>
......
AXWebArea AXWebArea
AXTabGroup AXTabGroup
AXRadioButton title='Tab 1' value='0' AXRadioButton AXTitle='Tab 1' AXValue='0'
AXRadioButton title='Tab 2' value='0' AXRadioButton AXTitle='Tab 2' AXValue='0'
AXWebArea AXWebArea
AXButton title='Regular button' AXButton AXTitle='Regular button'
AXButton title='Toggle button' AXButton AXTitle='Toggle button'
AXWebArea roleDescription='HTML content' AXWebArea AXRoleDescription='HTML content'
AXToolbar roleDescription='toolbar' AXToolbar AXRoleDescription='toolbar'
AXStaticText roleDescription='text' value='A toolbar' AXStaticText AXRoleDescription='text' AXValue='A toolbar'
<!-- <!--
@MAC-ALLOW:roleDescription=* @MAC-ALLOW:AXRoleDescription=*
@WIN-DENY:name='' @WIN-DENY:name=''
--> -->
<html> <html>
......
AXWebArea AXWebArea
AXList subrole=AXContentList AXList AXSubrole=AXContentList
AXGroup AXGroup
AXListMarker value='•' AXListMarker AXValue='•'
AXStaticText value='Item 1' AXStaticText AXValue='Item 1'
AXGroup AXGroup
AXListMarker value='•' AXListMarker AXValue='•'
AXStaticText value='Item 2' AXStaticText AXValue='Item 2'
AXGroup AXGroup
AXListMarker value='•' AXListMarker AXValue='•'
AXStaticText value='Item 3' AXStaticText AXValue='Item 3'
<!-- <!--
@MAC-ALLOW:subrole* @MAC-ALLOW:AXSubrole*
--> -->
<html> <html>
<body> <body>
......
...@@ -2,6 +2,6 @@ ...@@ -2,6 +2,6 @@
# wrong, so we assume this is correct. # wrong, so we assume this is correct.
AXWebArea AXWebArea
AXGroup AXGroup
AXStaticText value='Supercali' AXStaticText AXValue='Supercali'
AXStaticText value='fragilistic' AXStaticText AXValue='fragilistic'
AXStaticText value='expialidocious' AXStaticText AXValue='expialidocious'
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment