From 838eaaadf22ab4d8b87bf55e4f5973741edf8ead Mon Sep 17 00:00:00 2001 From: Nathan LaPre Date: Wed, 21 Feb 2024 03:31:55 +0000 Subject: [PATCH] Bug 1656330: Implement grid role, mapping, r=Jamie,devtools-reviewers,nchevobbe This revision adds a Gecko GRID role, matching the ARIA 'grid' role, and implements its platform mappings. It then remaps the ARIA 'grid' role to the Gecko GRID role. Finally, this revision removes the expected-fail for the relevant formerly-failing web platform test and updates existing tests. Differential Revision: https://phabricator.services.mozilla.com/D202040 --- accessible/base/ARIAMap.cpp | 2 +- accessible/base/AccGroupInfo.cpp | 1 + accessible/base/RoleMap.h | 10 ++++++++++ accessible/interfaces/nsIAccessibleRole.idl | 7 +++++++ accessible/tests/browser/mac/browser_rotor.js | 8 +------- accessible/tests/mochitest/role.js | 1 + accessible/tests/mochitest/role/test_aria.html | 4 ++-- .../tests/mochitest/tree/test_aria_display_contents.html | 2 +- accessible/tests/mochitest/tree/test_aria_grid.html | 12 ++++++------ accessible/tests/mochitest/tree/test_aria_owns.html | 2 +- .../tests/browser/browser_accessibility_keyboard_audit.js | 6 +++++- .../accessibility/display-contents-role-and-label.html.ini | 3 --- testing/web-platform/meta/wai-aria/role/grid-roles.html.ini | 3 --- 13 files changed, 36 insertions(+), 25 deletions(-) diff --git a/accessible/base/ARIAMap.cpp b/accessible/base/ARIAMap.cpp index 01cc5d041747..5808d7fd8b00 100644 --- a/accessible/base/ARIAMap.cpp +++ b/accessible/base/ARIAMap.cpp @@ -733,7 +733,7 @@ static const nsRoleMapEntry sWAIRoleMaps[] = { }, { // grid nsGkAtoms::grid, - roles::TABLE, + roles::GRID, kUseMapRole, eNoValue, eNoAction, diff --git a/accessible/base/AccGroupInfo.cpp b/accessible/base/AccGroupInfo.cpp index 3b536b1aa462..c3501dc36e76 100644 --- a/accessible/base/AccGroupInfo.cpp +++ b/accessible/base/AccGroupInfo.cpp @@ -263,6 +263,7 @@ uint32_t AccGroupInfo::TotalItemCount(Accessible* aContainer, bool* aIsHierarchical) { uint32_t itemCount = 0; switch (aContainer->Role()) { + case roles::GRID: case roles::TABLE: if (auto val = aContainer->GetIntARIAAttr(nsGkAtoms::aria_rowcount)) { if (*val >= 0) { diff --git a/accessible/base/RoleMap.h b/accessible/base/RoleMap.h index ce820001885b..dffbcf88bce4 100644 --- a/accessible/base/RoleMap.h +++ b/accessible/base/RoleMap.h @@ -1543,4 +1543,14 @@ ROLE(TIME, java::SessionAccessibility::CLASSNAME_VIEW, eNameFromSubtreeIfReqRule) +ROLE(GRID, + "grid", + nsGkAtoms::grid, + ATK_ROLE_TABLE, + NSAccessibilityTableRole, + NSAccessibilityUnknownSubrole, + ROLE_SYSTEM_TABLE, + ROLE_SYSTEM_TABLE, + java::SessionAccessibility::CLASSNAME_GRIDVIEW, + eNameFromSubtreeIfReqRule) // clang-format on diff --git a/accessible/interfaces/nsIAccessibleRole.idl b/accessible/interfaces/nsIAccessibleRole.idl index e8024063c1b4..9c3376ab48ea 100644 --- a/accessible/interfaces/nsIAccessibleRole.idl +++ b/accessible/interfaces/nsIAccessibleRole.idl @@ -799,4 +799,11 @@ interface nsIAccessibleRole : nsISupports * Represents a specific point in time. */ const unsigned long ROLE_TIME = 137; + + /** + * Represents a composite widget containing a collection of one or more rows + * with one or more cells where some or all cells in the grid are focusable + * by using methods of two-dimensional navigation. + */ + const unsigned long ROLE_GRID = 138; }; diff --git a/accessible/tests/browser/mac/browser_rotor.js b/accessible/tests/browser/mac/browser_rotor.js index 3f1350675710..87ac40592dec 100644 --- a/accessible/tests/browser/mac/browser_rotor.js +++ b/accessible/tests/browser/mac/browser_rotor.js @@ -269,7 +269,7 @@ addAccessibleTask( "AXUIElementCountForSearchPredicate", NSDictionary(searchPred) ); - is(4, tableCount, "Found four tables"); + is(tableCount, 3, "Found three tables"); const tables = webArea.getParameterizedAttributeValue( "AXUIElementsForSearchPredicate", @@ -278,7 +278,6 @@ addAccessibleTask( const shapes = getNativeInterface(accDoc, "shapes"); const food = getNativeInterface(accDoc, "food"); const ariaTable = getNativeInterface(accDoc, "ariaTable"); - const grid = getNativeInterface(accDoc, "grid"); is( shapes.getAttributeValue("AXColumnCount"), @@ -295,11 +294,6 @@ addAccessibleTask( tables[2].getAttributeValue("AXColumnCount"), "Found correct third table" ); - is( - grid.getAttributeValue("AXColumnCount"), - tables[3].getAttributeValue("AXColumnCount"), - "Found correct fourth table" - ); } ); diff --git a/accessible/tests/mochitest/role.js b/accessible/tests/mochitest/role.js index 07b820c2acc2..66cb6de4d203 100644 --- a/accessible/tests/mochitest/role.js +++ b/accessible/tests/mochitest/role.js @@ -40,6 +40,7 @@ const ROLE_FLAT_EQUATION = nsIAccessibleRole.ROLE_FLAT_EQUATION; const ROLE_FORM = nsIAccessibleRole.ROLE_FORM; const ROLE_FORM_LANDMARK = nsIAccessibleRole.ROLE_FORM_LANDMARK; const ROLE_GRAPHIC = nsIAccessibleRole.ROLE_GRAPHIC; +const ROLE_GRID = nsIAccessibleRole.ROLE_GRID; const ROLE_GRID_CELL = nsIAccessibleRole.ROLE_GRID_CELL; const ROLE_GROUPING = nsIAccessibleRole.ROLE_GROUPING; const ROLE_HEADING = nsIAccessibleRole.ROLE_HEADING; diff --git a/accessible/tests/mochitest/role/test_aria.html b/accessible/tests/mochitest/role/test_aria.html index bd7ffd27fb1c..387864df6211 100644 --- a/accessible/tests/mochitest/role/test_aria.html +++ b/accessible/tests/mochitest/role/test_aria.html @@ -64,8 +64,8 @@ testRole("aria_feed_mixed", ROLE_GROUPING); testRole("aria_figure", ROLE_FIGURE); testRole("aria_figure_mixed", ROLE_FIGURE); - testRole("aria_grid", ROLE_TABLE); - testRole("aria_grid_mixed", ROLE_TABLE); + testRole("aria_grid", ROLE_GRID); + testRole("aria_grid_mixed", ROLE_GRID); testRole("aria_gridcell", ROLE_GRID_CELL); testRole("aria_gridcell_mixed", ROLE_GRID_CELL); testRole("aria_group", ROLE_GROUPING); diff --git a/accessible/tests/mochitest/tree/test_aria_display_contents.html b/accessible/tests/mochitest/tree/test_aria_display_contents.html index 5c6f7f20fbb5..454e4e46e1db 100644 --- a/accessible/tests/mochitest/tree/test_aria_display_contents.html +++ b/accessible/tests/mochitest/tree/test_aria_display_contents.html @@ -17,7 +17,7 @@ // Test ARIA grids that have display: contents; on different elements. // They should all have equivalent trees. var accTree = - { TABLE: [ + { GRID: [ { ROW: [ { role: ROLE_COLUMNHEADER, children: [ { TEXT_LEAF: [ ] }, ] diff --git a/accessible/tests/mochitest/tree/test_aria_grid.html b/accessible/tests/mochitest/tree/test_aria_grid.html index 80ff97095b8b..4dd30e418337 100644 --- a/accessible/tests/mochitest/tree/test_aria_grid.html +++ b/accessible/tests/mochitest/tree/test_aria_grid.html @@ -18,7 +18,7 @@ // grid having rowgroups var accTree = - { TABLE: [ + { GRID: [ { GROUPING: [ { ROW: [ { GRID_CELL: [ @@ -34,7 +34,7 @@ // strange grids (mix of ARIA and HTML tables) accTree = { - role: ROLE_TABLE, + role: ROLE_GRID, children: [ { // div@role="row" role: ROLE_ROW, @@ -67,7 +67,7 @@ testAccessibleTree("strange_grid1", accTree); accTree = { - role: ROLE_TABLE, + role: ROLE_GRID, children: [ { // tr@role="row" role: ROLE_ROW, @@ -95,7 +95,7 @@ testAccessibleTree("strange_grid2", accTree); accTree = { - role: ROLE_TABLE, + role: ROLE_GRID, children: [ { // div@role="row" role: ROLE_ROW, @@ -122,7 +122,7 @@ testAccessibleTree("strange_grid3", accTree); accTree = { - role: ROLE_TABLE, + role: ROLE_GRID, children: [ { // div@role="row" role: ROLE_ROW, @@ -192,7 +192,7 @@ // grids that could contain text container accessibles but shouldn't. accTree = - { TABLE: [ + { GRID: [ { ROW: [ { GRID_CELL: [ { TEXT_LEAF: [ ] }, diff --git a/accessible/tests/mochitest/tree/test_aria_owns.html b/accessible/tests/mochitest/tree/test_aria_owns.html index a01968521bf8..5c34cc52d65e 100644 --- a/accessible/tests/mochitest/tree/test_aria_owns.html +++ b/accessible/tests/mochitest/tree/test_aria_owns.html @@ -96,7 +96,7 @@ testAccessibleTree("ariaowns_container", tree); tree = - { TABLE: [ + { GRID: [ { ROW: [ { GRID_CELL: [ { TEXT_LEAF: [] }, diff --git a/devtools/server/tests/browser/browser_accessibility_keyboard_audit.js b/devtools/server/tests/browser/browser_accessibility_keyboard_audit.js index fee9814b6c3c..e59cac87a3b7 100644 --- a/devtools/server/tests/browser/browser_accessibility_keyboard_audit.js +++ b/devtools/server/tests/browser/browser_accessibility_keyboard_audit.js @@ -186,7 +186,11 @@ add_task(async function () { null, ], ["Interactive grid that is not focusable.", "#grid-1", null], - ["Focusable interactive grid.", "#grid-2", null], + [ + "Focusable interactive grid.", + "#grid-2", + { score: "WARNING", issue: "FOCUSABLE_NO_SEMANTICS" }, + ], [ "Non interactive ARIA table does not need to be focusable.", "#table-1", diff --git a/testing/web-platform/meta/css/css-display/accessibility/display-contents-role-and-label.html.ini b/testing/web-platform/meta/css/css-display/accessibility/display-contents-role-and-label.html.ini index 864198eaad27..e7fbc2329355 100644 --- a/testing/web-platform/meta/css/css-display/accessibility/display-contents-role-and-label.html.ini +++ b/testing/web-platform/meta/css/css-display/accessibility/display-contents-role-and-label.html.ini @@ -1,8 +1,5 @@ [display-contents-role-and-label.html] max-asserts: 5 - [div with role grid with display: contents has grid role] - expected: FAIL - [Label: g element with display: contents, as child of svg, is labelled via title element] expected: FAIL diff --git a/testing/web-platform/meta/wai-aria/role/grid-roles.html.ini b/testing/web-platform/meta/wai-aria/role/grid-roles.html.ini index f5248040052f..3e0938aebe04 100644 --- a/testing/web-platform/meta/wai-aria/role/grid-roles.html.ini +++ b/testing/web-platform/meta/wai-aria/role/grid-roles.html.ini @@ -1,7 +1,4 @@ [grid-roles.html] - [role is grid] - expected: FAIL - [orphaned rowheader outside the context of row] expected: FAIL -- 2.11.4.GIT