Bug 804461, part3 - use context to build list trees, r=tbsaunde

This commit is contained in:
Alexander Surkov 2012-12-02 20:35:41 +09:00
parent 90b7a13094
commit 6a9c6be878
7 changed files with 230 additions and 24 deletions

View File

@ -144,7 +144,7 @@ static nsRoleMapEntry sWAIRoleMaps[] =
eNoValue,
eNoAction,
eNoLiveAttr,
kGenericAccType,
Accessible::eListAccessible,
kNoReqStates
},
{ // document
@ -239,7 +239,7 @@ static nsRoleMapEntry sWAIRoleMaps[] =
eNoValue,
eNoAction,
eNoLiveAttr,
kGenericAccType,
Accessible::eListAccessible,
states::READONLY
},
{ // listbox

View File

@ -830,6 +830,15 @@ nsAccessibilityService::GetOrCreateAccessible(nsINode* aNode,
} else if (frame->AccessibleType() == eHTMLTableCellAccessible &&
aContext->ARIARoleMap() == &nsARIAMap::gEmptyRoleMap) {
roleMapEntry = &nsARIAMap::gEmptyRoleMap;
} else if (content->Tag() == nsGkAtoms::dt ||
content->Tag() == nsGkAtoms::li ||
content->Tag() == nsGkAtoms::dd ||
frame->AccessibleType() == eHTMLLiAccessible) {
nsRoleMapEntry* contextRoleMap = aContext->ARIARoleMap();
if (contextRoleMap &&
!(contextRoleMap->accTypes & Accessible::eListAccessible))
roleMapEntry = &nsARIAMap::gEmptyRoleMap;
}
}
}
@ -1237,18 +1246,30 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsIFrame* aFrame,
return accessible;
}
if (tag == nsGkAtoms::dt || tag == nsGkAtoms::li) {
// Create list item accessible unconditionally by tag name. nsBlockFrame
// creates the list item accessible for other elements styled as list items.
Accessible* accessible = new HTMLLIAccessible(aContent, document);
NS_ADDREF(accessible);
return accessible;
if (aContext->IsOfType(Accessible::eListAccessible)) {
// If list item is a child of accessible list then create an accessible for
// it unconditionally by tag name. nsBlockFrame creates the list item
// accessible for other elements styled as list items.
if (aContext->GetContent() == aContent->GetParent()) {
if (tag == nsGkAtoms::dt || tag == nsGkAtoms::li) {
Accessible* accessible = new HTMLLIAccessible(aContent, document);
NS_ADDREF(accessible);
return accessible;
}
if (tag == nsGkAtoms::dd) {
Accessible* accessible = new HyperTextAccessibleWrap(aContent, document);
NS_ADDREF(accessible);
return accessible;
}
}
return nullptr;
}
if (tag == nsGkAtoms::abbr ||
tag == nsGkAtoms::acronym ||
tag == nsGkAtoms::blockquote ||
tag == nsGkAtoms::dd ||
tag == nsGkAtoms::form ||
tag == nsGkAtoms::h1 ||
tag == nsGkAtoms::h2 ||
@ -1326,7 +1347,10 @@ nsAccessibilityService::CreateAccessibleByFrameType(nsIFrame* aFrame,
newAcc = new HTMLLabelAccessible(aContent, document);
break;
case eHTMLLiAccessible:
newAcc = new HTMLLIAccessible(aContent, document);
if (aContext->IsOfType(Accessible::eListAccessible) &&
aContext->GetContent() == aContent->GetParent()) {
newAcc = new HTMLLIAccessible(aContent, document);
}
break;
case eHTMLSelectListAccessible:
newAcc = new HTMLSelectListAccessible(aContent, document);
@ -1374,8 +1398,10 @@ nsAccessibilityService::CreateAccessibleByFrameType(nsIFrame* aFrame,
newAcc = new HTMLTextFieldAccessible(aContent, document);
break;
case eHyperTextAccessible:
newAcc = new HyperTextAccessibleWrap(aContent, document);
if (aContent->Tag() != nsGkAtoms::dt && aContent->Tag() != nsGkAtoms::dd)
newAcc = new HyperTextAccessibleWrap(aContent, document);
break;
case eImageAccessible:
newAcc = new ImageAccessibleWrap(aContent, document);
break;

View File

@ -790,18 +790,19 @@ public: // XXX: a small hack to make these visible for nsARIAMap
eHTMLTableRowAccessible = 1 << 15,
eImageAccessible = 1 << 16,
eImageMapAccessible = 1 << 17,
eListControlAccessible = 1 << 18,
eMenuButtonAccessible = 1 << 19,
eMenuPopupAccessible = 1 << 20,
eProgressAccessible = 1 << 21,
eRootAccessible = 1 << 22,
eSelectAccessible = 1 << 23,
eTableAccessible = 1 << 24,
eTableCellAccessible = 1 << 25,
eTableRowAccessible = 1 << 26,
eTextLeafAccessible = 1 << 27,
eXULDeckAccessible = 1 << 28,
eXULTreeAccessible = 1 << 29
eListAccessible = 1 << 18,
eListControlAccessible = 1 << 19,
eMenuButtonAccessible = 1 << 20,
eMenuPopupAccessible = 1 << 21,
eProgressAccessible = 1 << 22,
eRootAccessible = 1 << 23,
eSelectAccessible = 1 << 24,
eTableAccessible = 1 << 25,
eTableCellAccessible = 1 << 26,
eTableRowAccessible = 1 << 27,
eTextLeafAccessible = 1 << 28,
eXULDeckAccessible = 1 << 29,
eXULTreeAccessible = 1 << 30
};
protected:

View File

@ -22,7 +22,7 @@ class HTMLListAccessible : public HyperTextAccessibleWrap
{
public:
HTMLListAccessible(nsIContent* aContent, DocAccessible* aDoc) :
HyperTextAccessibleWrap(aContent, aDoc) { }
HyperTextAccessibleWrap(aContent, aDoc) { mFlags |= eListAccessible; }
virtual ~HTMLListAccessible() { }
// nsISupports

View File

@ -17,6 +17,7 @@ MOCHITEST_A11Y_FILES =\
test_aria_globals.html \
test_aria_grid.html \
test_aria_imgmap.html \
test_aria_list.html \
test_aria_menu.html \
test_aria_presentation.html \
test_brokencontext.html \

View File

@ -0,0 +1,87 @@
<!DOCTYPE html>
<html>
<head>
<title>ARIA lists</title>
<link rel="stylesheet" type="text/css"
href="chrome://mochikit/content/tests/SimpleTest/test.css" />
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript"
src="../common.js"></script>
<script type="application/javascript"
src="../role.js"></script>
<script type="application/javascript">
function doTest()
{
//////////////////////////////////////////////////////////////////////////
// list
var accTree =
{ LIST: [
{ LISTITEM: [
{ TEXT_LEAF: [ ] }
] }
] };
testAccessibleTree("list", accTree);
//////////////////////////////////////////////////////////////////////////
// crazy list (mad mix of ARIA and HTML)
accTree = { // div@role="list"
role: ROLE_LIST,
children: [
{ // li text leaf
role: ROLE_TEXT_LEAF,
name: "item1",
children: [ ]
},
{ // li@role="listitem"
role: ROLE_LISTITEM,
children: [
{ // text leaf
role: ROLE_TEXT_LEAF,
name: "item2",
children: [ ]
}
]
}
]
};
testAccessibleTree("crazy_list", accTree);
SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addA11yLoadEvent(doTest);
</script>
</head>
<body>
<a target="_blank"
title="Build the context dependent tree"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=804461">
Mozilla Bug 804461
</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
</pre>
<div id="list" role="list">
<div role="listitem">item1</div>
</div>
<div id="crazy_list" role="list">
<ul role="presentation">
<li>item1</li>
<li role="listitem">item2</li>
</ul>
</div>
</body>
</html>

View File

@ -38,6 +38,61 @@
] };
testAccessibleTree("button_table", tree);
////////////////////////////////////////////////////////////////////////////
// HTML list elements outside list context.
ok(!isAccessible("presentation_ul"),
"presentational ul shouldn't be accessible");
ok(!isAccessible("item_in_presentation_ul"),
"li in presentational ul shouldn't be accessible");
ok(!isAccessible("styleditem_in_presentation_ul"),
"list styled span in presentational ul shouldn't be accessible");
ok(!isAccessible("presentation_ol"),
"presentational ol shouldn't be accessible");
ok(!isAccessible("item_in_presentation_ol"),
"li in presentational ol shouldn't be accessible");
ok(!isAccessible("presentation_dl"),
"presentational dl shouldn't be accessible");
ok(!isAccessible("dt_in_presentation_dl"),
"dt in presentational dl shouldn't be accessible");
ok(!isAccessible("dd_in_presentation_dl"),
"dd in presentational dl shouldn't be accessible");
tree =
{ PUSHBUTTON: [ // ul
{ NOTHING: [ // li
{ STATICTEXT: [ ] },
{ TEXT_LEAF: [ ] }
] },
{ NOTHING: [ // span styled as a list
{ STATICTEXT: [ ] },
{ TEXT_LEAF: [ ] }
] }
] };
testAccessibleTree("button_ul", tree);
tree =
{ PUSHBUTTON: [ // ol
{ NOTHING: [ // li
{ STATICTEXT: [ ] },
{ TEXT_LEAF: [ ] }
] }
] };
testAccessibleTree("button_ol", tree);
tree =
{ PUSHBUTTON: [ // dl
{ NOTHING: [ // dt
{ TEXT_LEAF: [ ] }
] },
{ NOTHING: [ // dd
{ TEXT_LEAF: [ ] }
] }
] };
testAccessibleTree("button_dl", tree);
////////////////////////////////////////////////////////////////////////////
// Styled as HTML table elements, accessible is created by tag name
@ -72,6 +127,11 @@
title="Create accessible by tag name as fallback if table descendant style is used out of table context">
Mozilla Bug 706849
</a>
<a target="_blank"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=804461"
title="Build the context dependent tree ">
Mozilla Bug 804461
</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
@ -92,6 +152,37 @@
</tr>
</table>
<!-- HTML list elements out of list -->
<ul role="presentation" id="presentation_ul">
<li id="item_in_presentation_ul">item</li>
<span id="styleditem_in_presentation_ul"
style="display:list-item">Oranges</span>
</ul>
<ol role="presentation" id="presentation_ol">
<li id="item_in_presentation_ol">item</li>
</ol>
<dl role="presentation" id="presentation_dl">
<dt id="dt_in_presentation_dl">term</dt>
<dd id="dd_in_presentation_dl">definition</dd>
</dl>
<ul role="button" id="button_ul">
<li id="item_in_button_ul">item</li>
<span id="styleditem_in_button_ul"
style="display:list-item">Oranges</span>
</ul>
<ol role="button" id="button_ol">
<li id="item_in_button_ul">item</li>
</ol>
<dl role="button" id="button_dl">
<dt id="dt_in_button_dl">term</ld>
<dd id="dd_in_button_dl">definition</dd>
</dl>
<!-- styled as HTML table elements -->
<a id="a_as_td" style="display:table-cell;" href="http://www.google.com">Google</a>
<h1 id="h1_as_td" style="display: table-cell;">h1</h1>