From b8d51ef048203ebe4633248707e67be9518e87d1 Mon Sep 17 00:00:00 2001 From: James Teh Date: Thu, 16 Jun 2022 06:25:51 +0000 Subject: [PATCH] Bug 1760739 part 4: Normalize aria-row/colcount/index as integers. r=eeejay Differential Revision: https://phabricator.services.mozilla.com/D149223 --- accessible/base/ARIAMap.cpp | 20 +++++++ accessible/base/ARIAMap.h | 5 ++ .../e10s/browser_caching_attributes.js | 52 +++++++++++++++++++ 3 files changed, 77 insertions(+) diff --git a/accessible/base/ARIAMap.cpp b/accessible/base/ARIAMap.cpp index 665dafbb84c2..da34fb05e920 100644 --- a/accessible/base/ARIAMap.cpp +++ b/accessible/base/ARIAMap.cpp @@ -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)) { diff --git a/accessible/base/ARIAMap.h b/accessible/base/ARIAMap.h index c971b44e1deb..43dad15b2494 100644 --- a/accessible/base/ARIAMap.h +++ b/accessible/base/ARIAMap.h @@ -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 diff --git a/accessible/tests/browser/e10s/browser_caching_attributes.js b/accessible/tests/browser/e10s/browser_caching_attributes.js index 45b8b2fcea10..d7ae970c6f96 100644 --- a/accessible/tests/browser/e10s/browser_caching_attributes.js +++ b/accessible/tests/browser/e10s/browser_caching_attributes.js @@ -279,6 +279,21 @@ addAccessibleTask(
currentPage
currentBlah
haspopup
+
+
+
positive
+
+
+
+
+
negative
+
+
+
+
+
invalid
+
+
foo
mutate
`, @@ -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);