Bug 1760739 part 4: Normalize aria-row/colcount/index as integers. r=eeejay

Differential Revision: https://phabricator.services.mozilla.com/D149223
This commit is contained in:
James Teh 2022-06-16 06:25:51 +00:00
Родитель 237c1cc6fa
Коммит b8d51ef048
3 изменённых файлов: 77 добавлений и 0 удалений

Просмотреть файл

@ -1351,6 +1351,8 @@ static const AttrCharacteristics gWAIUnivAttrMap[] = {
{nsGkAtoms::aria_atomic, ATTR_BYPASSOBJ_IF_FALSE | ATTR_VALTOKEN | ATTR_GLOBAL },
{nsGkAtoms::aria_busy, ATTR_VALTOKEN | ATTR_GLOBAL },
{nsGkAtoms::aria_checked, ATTR_BYPASSOBJ | ATTR_VALTOKEN }, /* exposes checkable obj attr */
{nsGkAtoms::aria_colcount, ATTR_VALINT },
{nsGkAtoms::aria_colindex, ATTR_VALINT },
{nsGkAtoms::aria_controls, ATTR_BYPASSOBJ | ATTR_GLOBAL },
{nsGkAtoms::aria_current, ATTR_BYPASSOBJ_IF_FALSE | ATTR_VALTOKEN | ATTR_GLOBAL },
{nsGkAtoms::aria_describedby, ATTR_BYPASSOBJ | ATTR_GLOBAL },
@ -1384,6 +1386,8 @@ static const AttrCharacteristics gWAIUnivAttrMap[] = {
{nsGkAtoms::aria_readonly, ATTR_BYPASSOBJ | ATTR_VALTOKEN },
{nsGkAtoms::aria_relevant, ATTR_BYPASSOBJ | ATTR_GLOBAL },
{nsGkAtoms::aria_required, ATTR_BYPASSOBJ | ATTR_VALTOKEN },
{nsGkAtoms::aria_rowcount, ATTR_VALINT },
{nsGkAtoms::aria_rowindex, ATTR_VALINT },
{nsGkAtoms::aria_selected, ATTR_BYPASSOBJ | ATTR_VALTOKEN },
{nsGkAtoms::aria_setsize, ATTR_BYPASSOBJ }, /* handled via groupPosition */
{nsGkAtoms::aria_sort, ATTR_VALTOKEN },
@ -1549,6 +1553,22 @@ bool AttrIterator::ExposeAttr(AccAttributes* aTargetAttrs) const {
aTargetAttrs->SetAttribute(mAttrAtom, normalizedValue);
return true;
}
} else if (mAttrCharacteristics & ATTR_VALINT) {
int32_t intVal;
if (nsCoreUtils::GetUIntAttr(mElement, mAttrAtom, &intVal)) {
aTargetAttrs->SetAttribute(mAttrAtom, intVal);
return true;
}
if (mAttrAtom == nsGkAtoms::aria_colcount ||
mAttrAtom == nsGkAtoms::aria_rowcount) {
// These attributes allow a value of -1.
if (mElement->AttrValueIs(kNameSpaceID_None, mAttrAtom, u"-1"_ns,
eCaseMatters)) {
aTargetAttrs->SetAttribute(mAttrAtom, -1);
return true;
}
}
return false; // Invalid value.
}
nsAutoString value;
if (mElement->GetAttr(kNameSpaceID_None, mAttrAtom, value)) {

Просмотреть файл

@ -118,6 +118,11 @@ const uint8_t ATTR_VALTOKEN = 0x1 << 2;
*/
const uint8_t ATTR_GLOBAL = 0x1 << 3;
/**
* Indicates that the attribute should have an integer value.
*/
const uint8_t ATTR_VALINT = 0x1 << 4;
////////////////////////////////////////////////////////////////////////////////
// State map entry

Просмотреть файл

@ -279,6 +279,21 @@ addAccessibleTask(
<div id="currentPage" aria-current="page">currentPage</div>
<div id="currentBlah" aria-current="blah">currentBlah</div>
<div id="haspopupMenu" aria-haspopup="menu">haspopup</div>
<div id="rowColCountPositive" role="table" aria-rowcount="1000" aria-colcount="1000">
<div role="row">
<div id="rowColIndexPositive" role="cell" aria-rowindex="100" aria-colindex="100">positive</div>
</div>
</div>
<div id="rowColCountNegative" role="table" aria-rowcount="-1" aria-colcount="-1">
<div role="row">
<div id="rowColIndexNegative" role="cell" aria-rowindex="-1" aria-colindex="-1">negative</div>
</div>
</div>
<div id="rowColCountInvalid" role="table" aria-rowcount="z" aria-colcount="z">
<div role="row">
<div id="rowColIndexInvalid" role="cell" aria-rowindex="z" aria-colindex="z">invalid</div>
</div>
</div>
<div id="foo" aria-foo="bar">foo</div>
<div id="mutate" aria-current="true">mutate</div>
`,
@ -294,6 +309,43 @@ addAccessibleTask(
testAttrs(currentBlah, { current: "true" }, true);
const haspopupMenu = findAccessibleChildByID(docAcc, "haspopupMenu");
testAttrs(haspopupMenu, { haspopup: "menu" }, true);
// Test normalization of integer values.
const rowColCountPositive = findAccessibleChildByID(
docAcc,
"rowColCountPositive"
);
testAttrs(
rowColCountPositive,
{ rowcount: "1000", colcount: "1000" },
true
);
const rowColIndexPositive = findAccessibleChildByID(
docAcc,
"rowColIndexPositive"
);
testAttrs(rowColIndexPositive, { rowindex: "100", colindex: "100" }, true);
const rowColCountNegative = findAccessibleChildByID(
docAcc,
"rowColCountNegative"
);
testAttrs(rowColCountNegative, { rowcount: "-1", colcount: "-1" }, true);
const rowColIndexNegative = findAccessibleChildByID(
docAcc,
"rowColIndexNegative"
);
testAbsentAttrs(rowColIndexNegative, { rowindex: "", colindex: "" });
const rowColCountInvalid = findAccessibleChildByID(
docAcc,
"rowColCountInvalid"
);
testAbsentAttrs(rowColCountInvalid, { rowcount: "", colcount: "" });
const rowColIndexInvalid = findAccessibleChildByID(
docAcc,
"rowColIndexInvalid"
);
testAbsentAttrs(rowColIndexInvalid, { rowindex: "", colindex: "" });
// Test that unknown aria- attributes get exposed.
const foo = findAccessibleChildByID(docAcc, "foo");
testAttrs(foo, { foo: "bar" }, true);