0

[AX Mac] migrate visible cells attribute

Implement accessibilityVisibleCells methods, and hide its
NSAccessibility attribute counterparts under a flag.

Low-Coverage-Reason: COVERAGE_UNDERREPORTED ax_platform_node_delegate.cc code path is tested both by the new unit and browser tests.

Test: `out/.../content_browsertests \
   --gtest_filter="*AccessibilityVisibleCells*"`

Test: `out/.../accessibility_unittests \
   --gtest_filter="*AccessibilityVisibleCells*"`

Include-Ci-Only-Tests: true
Cq-Include-Trybots: luci.chromium.try:mac-fieldtrial-tester

Bug: 363275809
Change-Id: I593d8408403da684d097da318eea348deff95074
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6020982
Reviewed-by: Jayson Adams <shrike@chromium.org>
Commit-Queue: Alexander Surkov <asurkov@igalia.com>
Reviewed-by: Aaron Leventhal <aleventhal@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1385359}
This commit is contained in:
Alexander Surkov
2024-11-20 00:41:00 +00:00
committed by Chromium LUCI CQ
parent b857e972de
commit 4590e1884b
9 changed files with 73 additions and 0 deletions

@ -635,6 +635,10 @@ IN_PROC_BROWSER_TEST_P(DumpAccessibilityScriptTest,
Migration_RunTypedTest<kMacMethods>("accessibility-sort-direction.html");
}
IN_PROC_BROWSER_TEST_P(DumpAccessibilityScriptTest, AccessibilityVisibleCells) {
Migration_RunTypedTest<kMacMethods>("accessibility-visible-cells.html");
}
// Parameterized attributes
IN_PROC_BROWSER_TEST_P(DumpAccessibilityScriptTest, AccessibilityIndexTable) {

@ -5617,6 +5617,8 @@ data/accessibility/mac/methods/accessibility-title-ui-element.html
data/accessibility/mac/methods/accessibility-title.html
data/accessibility/mac/methods/accessibility-url-expected.txt
data/accessibility/mac/methods/accessibility-url.html
data/accessibility/mac/methods/accessibility-visible-cells-expected.txt
data/accessibility/mac/methods/accessibility-visible-cells.html
data/accessibility/mac/methods/is-accessibility-disclosed-expected.txt
data/accessibility/mac/methods/is-accessibility-disclosed.html
data/accessibility/mac/methods/is-accessibility-element-expected.txt

@ -0,0 +1 @@
table.accessibilityVisibleCells=[:4, :6, :9, :11]

@ -0,0 +1,15 @@
<!--
@SCRIPT:
table.accessibilityVisibleCells
-->
<!DOCTYPE html>
<table id="table" border=1>
<tr>
<th aria-label="Firstname">Firstname</th>
<th aria-label="Lastname">Lastname</th>
</tr>
<tr>
<td>Jill</td>
<td>Smith</td>
</tr>
</table>

@ -283,6 +283,7 @@ const ui::CocoaActionList& GetCocoaActionListForTesting() {
@"accessibilityRowCount" : NSAccessibilityRowCountAttribute,
@"accessibilityRowIndexRange" : NSAccessibilityRowIndexRangeAttribute,
@"accessibilitySortDirection" : NSAccessibilitySortDirectionAttribute,
@"accessibilityVisibleCells" : NSAccessibilityVisibleCellsAttribute,
@"isAccessibilityDisclosed" : NSAccessibilityDisclosingAttribute,
@"isAccessibilityExpanded" : NSAccessibilityExpandedAttribute,
@"isAccessibilityFocused" : NSAccessibilityFocusedAttribute,
@ -2946,6 +2947,28 @@ const ui::CocoaActionList& GetCocoaActionListForTesting() {
return NSMakeRange(0, 0);
}
// LINT.IfChange(accessibilityVisibleCells)
- (NSArray*)accessibilityVisibleCells {
if (![self instanceActive]) {
return nil;
}
ui::AXPlatformNodeDelegate* table = [self nodeDelegate];
if (!table) {
return nil;
}
NSMutableArray* cells = [[NSMutableArray alloc] init];
for (int32_t id : table->GetTableUniqueCellIds()) {
ui::AXPlatformNode* cell = table->GetFromNodeID(id);
if (cell) {
[cells addObject:cell->GetNativeViewAccessible()];
}
}
return cells;
}
// LINT.ThenChange(ui/accessibility/platform/browser_accessibility_cocoa.mm:accessibilityVisibleCells)
//
// End of NSAccessibility protocol.
//

@ -16,6 +16,7 @@
#include "ui/accessibility/ax_range.h"
#include "ui/accessibility/ax_role_properties.h"
#include "ui/accessibility/ax_tree.h"
#include "ui/accessibility/platform/ax_platform_node_base.h"
#include "ui/accessibility/platform/ax_platform_node_delegate.h"
#include "ui/accessibility/platform/ax_platform_node_unittest.h"
#include "ui/accessibility/platform/test_ax_node_wrapper.h"
@ -472,6 +473,23 @@ TEST_P(AXPlatformNodeCocoaTest, AccessibilityRowIndexRange) {
EXPECT_EQ(range.length, 1UL); // Only one row in this simple setup
}
// accessibilityVisibleCells on a table.
TEST_P(AXPlatformNodeCocoaTest, AccessibilityVisibleCells) {
ui::TestAXTreeUpdate update(std::string(R"HTML(
++1 kTable
++++2 kRow
++++++3 kCell
)HTML"));
Init(update);
AXPlatformNodeCocoa* table = GetCocoaNode(1);
AXPlatformNodeCocoa* cell = GetCocoaNode(3);
NSArray* cells = [table accessibilityVisibleCells];
EXPECT_EQ([cells count], 1UL);
EXPECT_EQ([[cells firstObject] node]->GetUniqueId(),
[cell node]->GetUniqueId());
}
// Non-header cells should not support accessibilitySortDirection, even if
// there's a sort direction in the AXNodeData. Their sort order is "unknown".
TEST_P(AXPlatformNodeCocoaTest, AccessibilitySortDirectionOnCell) {

@ -1031,6 +1031,13 @@ std::vector<int32_t> AXPlatformNodeDelegate::GetRowHeaderNodeIds(
return {};
}
std::vector<int32_t> AXPlatformNodeDelegate::GetTableUniqueCellIds() const {
if (node_) {
return node_->GetTableUniqueCellIds();
}
return {};
}
AXPlatformNode* AXPlatformNodeDelegate::GetTableCaption() const {
return nullptr;
}

@ -562,6 +562,7 @@ class COMPONENT_EXPORT(AX_PLATFORM) AXPlatformNodeDelegate {
virtual std::vector<int32_t> GetColHeaderNodeIds(int col_index) const;
virtual std::vector<int32_t> GetRowHeaderNodeIds() const;
virtual std::vector<int32_t> GetRowHeaderNodeIds(int row_index) const;
virtual std::vector<AXNodeID> GetTableUniqueCellIds() const;
virtual AXPlatformNode* GetTableCaption() const;
//

@ -1554,6 +1554,7 @@ bool ui::IsNSRange(id value) {
return nil;
}
// LINT.IfChange(accessibilityVisibleCells)
- (NSArray*)visibleCells {
if (![self instanceActive])
return nil;
@ -1566,6 +1567,7 @@ bool ui::IsNSRange(id value) {
}
return ret;
}
// LINT.ThenChange(ui/accessibility/platform/ax_platform_node_cocoa.mm:accessibilityVisibleCells)
- (NSArray*)visibleChildren {
if (![self instanceActive])