Bug 481114 - map timer, log and marquee ARIA roles into a11y roles. r=surkov, r=MarcoZ

This commit is contained in:
David Bolter 2009-06-11 14:18:24 -04:00
parent 535824e36d
commit 6a5e3154e7
7 changed files with 154 additions and 13 deletions

View File

@ -63,6 +63,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"alert",
nsIAccessibleRole::ROLE_ALERT,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -72,6 +73,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"alertdialog",
nsIAccessibleRole::ROLE_DIALOG,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -81,6 +83,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"application",
nsIAccessibleRole::ROLE_APPLICATION,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -90,6 +93,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"article",
nsIAccessibleRole::ROLE_DOCUMENT,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -99,6 +103,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"button",
nsIAccessibleRole::ROLE_PUSHBUTTON,
kUseMapRole,
eNoValue,
eClickAction,
eNoLiveAttr,
@ -110,6 +115,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"checkbox",
nsIAccessibleRole::ROLE_CHECKBUTTON,
kUseMapRole,
eNoValue,
eCheckUncheckAction,
eNoLiveAttr,
@ -122,6 +128,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"columnheader",
nsIAccessibleRole::ROLE_COLUMNHEADER,
kUseMapRole,
eNoValue,
eSortAction,
eNoLiveAttr,
@ -134,6 +141,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"combobox",
nsIAccessibleRole::ROLE_COMBOBOX,
kUseMapRole,
eHasValueMinMax,
eOpenCloseAction,
eNoLiveAttr,
@ -145,6 +153,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"dialog",
nsIAccessibleRole::ROLE_DIALOG,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -154,6 +163,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"document",
nsIAccessibleRole::ROLE_DOCUMENT,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -163,6 +173,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"grid",
nsIAccessibleRole::ROLE_TABLE,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -174,6 +185,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"gridcell",
nsIAccessibleRole::ROLE_GRID_CELL,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -186,6 +198,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"group",
nsIAccessibleRole::ROLE_GROUPING,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -195,6 +208,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"heading",
nsIAccessibleRole::ROLE_HEADING,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -204,6 +218,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"img",
nsIAccessibleRole::ROLE_GRAPHIC,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -213,6 +228,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"label",
nsIAccessibleRole::ROLE_LABEL,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -222,6 +238,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"link",
nsIAccessibleRole::ROLE_LINK,
kUseMapRole,
eNoValue,
eJumpAction,
eNoLiveAttr,
@ -231,6 +248,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"list",
nsIAccessibleRole::ROLE_LIST,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -241,6 +259,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"listbox",
nsIAccessibleRole::ROLE_LISTBOX,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -252,6 +271,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"listitem",
nsIAccessibleRole::ROLE_LISTITEM,
kUseMapRole,
eNoValue,
eNoAction, // XXX: should depend on state, parent accessible
eNoLiveAttr,
@ -266,6 +286,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"log",
nsIAccessibleRole::ROLE_NOTHING,
kUseNativeRole,
eNoValue,
eNoAction,
ePoliteLiveAttr,
@ -275,6 +296,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"marquee",
nsIAccessibleRole::ROLE_NOTHING,
kUseNativeRole,
eNoValue,
eNoAction,
eOffLiveAttr,
@ -284,6 +306,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"math",
nsIAccessibleRole::ROLE_FLAT_EQUATION,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -293,6 +316,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"menu",
nsIAccessibleRole::ROLE_MENUPOPUP,
kUseMapRole,
eNoValue,
eNoAction, // XXX: technically accessibles of menupopup role haven't
// any action, but menu can be open or close.
@ -303,6 +327,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"menubar",
nsIAccessibleRole::ROLE_MENUBAR,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -312,6 +337,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"menuitem",
nsIAccessibleRole::ROLE_MENUITEM,
kUseMapRole,
eNoValue,
eClickAction,
eNoLiveAttr,
@ -324,6 +350,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"menuitemcheckbox",
nsIAccessibleRole::ROLE_CHECK_MENU_ITEM,
kUseMapRole,
eNoValue,
eClickAction,
eNoLiveAttr,
@ -335,6 +362,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"menuitemradio",
nsIAccessibleRole::ROLE_RADIO_MENU_ITEM,
kUseMapRole,
eNoValue,
eClickAction,
eNoLiveAttr,
@ -345,6 +373,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"option",
nsIAccessibleRole::ROLE_OPTION,
kUseMapRole,
eNoValue,
eSelectAction,
eNoLiveAttr,
@ -359,6 +388,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"presentation",
nsIAccessibleRole::ROLE_NOTHING,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -368,6 +398,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"progressbar",
nsIAccessibleRole::ROLE_PROGRESSBAR,
kUseMapRole,
eHasValueMinMax,
eNoAction,
eNoLiveAttr,
@ -377,6 +408,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"radio",
nsIAccessibleRole::ROLE_RADIOBUTTON,
kUseMapRole,
eNoValue,
eSelectAction,
eNoLiveAttr,
@ -387,6 +419,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"radiogroup",
nsIAccessibleRole::ROLE_GROUPING,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -396,6 +429,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"region",
nsIAccessibleRole::ROLE_PANE,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -405,6 +439,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"row",
nsIAccessibleRole::ROLE_ROW,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -416,6 +451,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"rowheader",
nsIAccessibleRole::ROLE_ROWHEADER,
kUseMapRole,
eNoValue,
eSortAction,
eNoLiveAttr,
@ -428,6 +464,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"section",
nsIAccessibleRole::ROLE_SECTION,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -437,6 +474,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"separator",
nsIAccessibleRole::ROLE_SEPARATOR,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -446,6 +484,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"slider",
nsIAccessibleRole::ROLE_SLIDER,
kUseMapRole,
eHasValueMinMax,
eNoAction,
eNoLiveAttr,
@ -456,6 +495,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"spinbutton",
nsIAccessibleRole::ROLE_SPINBUTTON,
kUseMapRole,
eHasValueMinMax,
eNoAction,
eNoLiveAttr,
@ -466,6 +506,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"status",
nsIAccessibleRole::ROLE_STATUSBAR,
kUseMapRole,
eNoValue,
eNoAction,
ePoliteLiveAttr,
@ -475,6 +516,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"tab",
nsIAccessibleRole::ROLE_PAGETAB,
kUseMapRole,
eNoValue,
eSwitchAction,
eNoLiveAttr,
@ -484,6 +526,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"tablist",
nsIAccessibleRole::ROLE_PAGETABLIST,
kUseMapRole,
eNoValue,
eNoAction,
ePoliteLiveAttr,
@ -493,6 +536,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"tabpanel",
nsIAccessibleRole::ROLE_PROPERTYPAGE,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -502,6 +546,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"textbox",
nsIAccessibleRole::ROLE_ENTRY,
kUseMapRole,
eNoValue,
eActivateAction,
eNoLiveAttr,
@ -516,6 +561,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"timer",
nsIAccessibleRole::ROLE_NOTHING,
kUseNativeRole,
eNoValue,
eNoAction,
eOffLiveAttr,
@ -525,6 +571,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"toolbar",
nsIAccessibleRole::ROLE_TOOLBAR,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -534,6 +581,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"tooltip",
nsIAccessibleRole::ROLE_TOOLTIP,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -543,6 +591,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"tree",
nsIAccessibleRole::ROLE_OUTLINE,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -554,6 +603,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"treegrid",
nsIAccessibleRole::ROLE_TREE_TABLE,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -565,6 +615,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
{
"treeitem",
nsIAccessibleRole::ROLE_OUTLINEITEM,
kUseMapRole,
eNoValue,
eActivateAction, // XXX: should expose second 'expand/collapse' action based
// on states
@ -584,6 +635,7 @@ PRUint32 nsARIAMap::gWAIRoleMapLength = NS_ARRAY_LENGTH(nsARIAMap::gWAIRoleMap);
nsRoleMapEntry nsARIAMap::gLandmarkRoleMap = {
"",
nsIAccessibleRole::ROLE_NOTHING,
kUseNativeRole,
eNoValue,
eNoAction,
eNoLiveAttr,
@ -594,6 +646,7 @@ nsRoleMapEntry nsARIAMap::gLandmarkRoleMap = {
nsRoleMapEntry nsARIAMap::gEmptyRoleMap = {
"",
nsIAccessibleRole::ROLE_NOTHING,
kUseMapRole,
eNoValue,
eNoAction,
eNoLiveAttr,

View File

@ -72,6 +72,10 @@ enum ELiveAttrRule
ePoliteLiveAttr
};
// Role mapping rule
const PRBool kUseMapRole = PR_TRUE;
const PRBool kUseNativeRole = PR_FALSE;
// ARIA attribute characteristic masks, grow as needed
/**
@ -119,6 +123,9 @@ struct nsRoleMapEntry
// Role mapping rule: maps to this nsIAccessibleRole
PRUint32 role;
// Role rule: whether to use mapped role or native semantics
PRBool roleRule;
// Value mapping rule: how to compute nsIAccessible value
EValueRule valueRule;

View File

@ -1608,8 +1608,12 @@ NS_IMETHODIMP
nsAccessible::GetRole(PRUint32 *aRole)
{
NS_ENSURE_ARG_POINTER(aRole);
*aRole = nsIAccessibleRole::ROLE_NOTHING;
if (IsDefunct())
return NS_ERROR_FAILURE;
if (mRoleMapEntry) {
*aRole = mRoleMapEntry->role;
@ -1651,21 +1655,12 @@ nsAccessible::GetRole(PRUint32 *aRole)
*aRole = nsIAccessibleRole::ROLE_COMBOBOX_OPTION;
}
// gLandmarkRoleMap: can use role of accessible class impl
// gEmptyRoleMap and all others: cannot use role of accessible class impl
if (mRoleMapEntry != &nsARIAMap::gLandmarkRoleMap) {
// We can now expose ROLE_NOTHING when there is a role map entry or used
// role is nothing, which
// will cause ATK to use ROLE_UNKNOWN and MSAA to use a BSTR role with
// the ARIA role or element's tag. In either case the AT can also use
// the object attributes tag and xml-roles to find out more.
// We are done if the mapped role trumps native semantics
if (mRoleMapEntry->roleRule == kUseMapRole)
return NS_OK;
}
}
return mDOMNode ?
GetRoleInternal(aRole) :
NS_ERROR_FAILURE; // Node already shut down
return GetRoleInternal(aRole);
}
NS_IMETHODIMP

View File

@ -75,6 +75,7 @@ _TEST_FILES =\
test_aria_role_article.html \
test_aria_role_equation.html \
test_aria_role_grid.html \
test_aria_roles.html \
test_aria_token_attrs.html \
test_bug420863.html \
$(warning test_childAtPoint.html temporarily disabled) \

View File

@ -2,6 +2,7 @@
// Role constants
const ROLE_ALERT = nsIAccessibleRole.ROLE_ALERT;
const ROLE_APPLICATION = nsIAccessibleRole.ROLE_APPLICATION;
const ROLE_CELL = nsIAccessibleRole.ROLE_CELL;
const ROLE_CHROME_WINDOW = nsIAccessibleRole.ROLE_CHROME_WINDOW;
const ROLE_COMBOBOX = nsIAccessibleRole.ROLE_COMBOBOX;

View File

@ -0,0 +1,84 @@
<!DOCTYPE html>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=481114
-->
<head>
<title>Test weak ARIA roles</title>
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
<script type="application/javascript"
src="chrome://mochikit/content/MochiKit/packed.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/a11y/accessible/common.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/a11y/accessible/role.js"></script>
<script type="application/javascript">
function doTest()
{
// Note:
// The phrase "weak foo" here means that there is no good foo-to-platform
// role mapping. Similarly "strong foo" means there is a good foo-to-
// platform role mapping.
// weak roles that are forms of "live regions"
testRole("log_table", ROLE_TABLE);
testRole("marquee_h1", ROLE_HEADING);
testRole("timer_div", ROLE_SECTION);
// strong landmark
testRole("application", ROLE_APPLICATION);
// weak landmarks
var weak_landmarks = ["banner", "complementary", "contentinfo",
"main", "navigation", "search"];
for (l in weak_landmarks)
testRole(weak_landmarks[l], ROLE_SECTION);
// test gEmptyRoleMap
testRole("cell", ROLE_NOTHING);
SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addLoadEvent(doTest);
</script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=481114">Mozilla Bug 481114</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
</pre>
<!-- "live" roles -->
<table role="log" id="log_table">
<tr><td>Table based log</td></tr>
</table>
<h1 role="marquee" id="marquee_h1">marquee</h1>
<div role="timer" id="timer_div">timer</div>
<!-- landmarks -->
<div role="application" id="application">application</div>
<div role="banner" id="banner">banner</div>
<div role="complementary" id="complementary">complementary</div>
<div role="contentinfo" id="contentinfo">contentinfo</div>
<div role="main" id="main">main</div>
<div role="navigation" id="navigation">navigation</div>
<div role="search" id="search">search</div>
<!-- test gEmptyRoleMap -->
<table role="label">
<tr>
<td id="cell">cell</td>
</tr>
</table>
</body>
</html>

View File

@ -60,7 +60,7 @@ function doTest()
accNotCreated = (!isAccessible("tr"));
ok(!accNotCreated, "missed tr accessible");
testRole(accTable4, ROLE_NOTHING); // XXX: it's a bug, should be ROLE_TABLE
testRole(accTable4, ROLE_TABLE);
is(accTable4.cellRefAt(0,0).firstChild.name, "cell0", "wrong cell");
is(accTable4.cellRefAt(0,1).firstChild.name, "cell1", "wrong cell");