[webkit-changes] [WebKit/WebKit] 0604c5: AX: Move NSAccessibilityCellForColumnAndRowParamet...
Tyler Wilcock
noreply at github.com
Thu Jun 22 10:51:41 PDT 2023
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 0604c50219a2832146d4b7b2caebebfa57e144d6
https://github.com/WebKit/WebKit/commit/0604c50219a2832146d4b7b2caebebfa57e144d6
Author: Tyler Wilcock <tyler_w at apple.com>
Date: 2023-06-22 (Thu, 22 Jun 2023)
Changed paths:
M LayoutTests/accessibility/aria-table-attributes-expected.txt
M LayoutTests/accessibility/aria-table-attributes.html
M LayoutTests/accessibility/custom-elements/table-expected.txt
M LayoutTests/accessibility/custom-elements/table.html
A LayoutTests/accessibility/display-contents/table-expected.txt
A LayoutTests/accessibility/display-contents/table.html
A LayoutTests/accessibility/dynamic-colspan-expected.txt
A LayoutTests/accessibility/dynamic-colspan.html
A LayoutTests/accessibility/dynamic-rowspan-expected.txt
A LayoutTests/accessibility/dynamic-rowspan.html
A LayoutTests/accessibility/dynamic-table-descendants-expected.txt
A LayoutTests/accessibility/dynamic-table-descendants.html
M LayoutTests/accessibility/list-detection-expected.txt
M LayoutTests/accessibility/list-detection.html
M LayoutTests/accessibility/table-incorrect-colspan-cell-expected.txt
M LayoutTests/accessibility/table-multiple-tbodies-expected.txt
M LayoutTests/accessibility/table-thead-tfoot-expected.txt
M LayoutTests/platform/glib/accessibility/custom-elements/table-expected.txt
A LayoutTests/platform/glib/accessibility/display-contents/table-expected.txt
M LayoutTests/platform/glib/accessibility/list-detection-expected.txt
M LayoutTests/platform/glib/accessibility/table-multiple-tbodies-expected.txt
M LayoutTests/platform/glib/accessibility/table-thead-tfoot-expected.txt
M LayoutTests/platform/ios/TestExpectations
A LayoutTests/platform/ios/accessibility/display-contents/table-expected.txt
M LayoutTests/platform/mac-wk1/TestExpectations
M LayoutTests/platform/mac/accessibility/generated-content-with-display-table-crash-expected.txt
M Source/WebCore/accessibility/AXLogger.cpp
M Source/WebCore/accessibility/AXObjectCache.cpp
M Source/WebCore/accessibility/AXObjectCache.h
M Source/WebCore/accessibility/AccessibilityARIAGrid.cpp
M Source/WebCore/accessibility/AccessibilityARIAGrid.h
M Source/WebCore/accessibility/AccessibilityARIAGridCell.cpp
M Source/WebCore/accessibility/AccessibilityARIAGridCell.h
M Source/WebCore/accessibility/AccessibilityNodeObject.cpp
M Source/WebCore/accessibility/AccessibilityObject.cpp
M Source/WebCore/accessibility/AccessibilityObject.h
M Source/WebCore/accessibility/AccessibilityObjectInterface.h
M Source/WebCore/accessibility/AccessibilityRenderObject.h
M Source/WebCore/accessibility/AccessibilityTable.cpp
M Source/WebCore/accessibility/AccessibilityTable.h
M Source/WebCore/accessibility/AccessibilityTableCell.cpp
M Source/WebCore/accessibility/AccessibilityTableCell.h
M Source/WebCore/accessibility/AccessibilityTableColumn.cpp
M Source/WebCore/accessibility/AccessibilityTableColumn.h
M Source/WebCore/accessibility/AccessibilityTableRow.cpp
M Source/WebCore/accessibility/AccessibilityTableRow.h
M Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp
M Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp
M Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm
M Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp
M Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h
M Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
M Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h
M Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm
Log Message:
-----------
AX: Move NSAccessibilityCellForColumnAndRowParameterizedAttribute API off the main-thread
https://bugs.webkit.org/show_bug.cgi?id=258223
rdar://problem/110919883
Reviewed by Chris Fleizach.
With this patch, we replace the existing render-tree-based column and
row cell slot determination algorithm with a custom one based on:
https://html.spec.whatwg.org/multipage/tables.html#forming-a-table
We use this forming-a-table algorithm to build a new data structure
indicating the cell AXID occupied by each "slot" in the table: `AccessibilityTable::m_slotGrid`
This has two benefits:
1. We can (and do) copy this data structure to the secondary thread,
and use it to perform `AXIsolatedObject::cellForColumnAndRow`
without relying on the main-thread.
2. The implementation of this algorithm does not rely on any sort of
render tree structure for correctness. This is key because authors
expect to be able to put any CSS `display` value (flex, contents, block, etc)
on rows, cells, and tables, and preserve accessibility semantics.
This didn't work before this patch because any of these display
values prevent RenderTable, RenderTableRow, and RenderTableCells
from being generated, which the RenderTable cell-for-column-and-row
mechanism relies on.
This patch does not fully fix non-standard-display value tables due to
issues with parent-child mismatches in table hierarchies with these
display values. That will be fixed in a later patch.
This patch also features several other improvements.
1. AXPropertyName::RowCount and AXPropertyName::ColumnCount were
pointlessly cached rather than simply counting AXPropertyName::Rows
and AXPropertyName::Columns (as the live tree implementation does).
These properties are removed, reducing memory and CPU consumption.
2. Fixed a bug where stale data was not updated after dynamic
aria-colspan changes.
3. Fixed a bug where table's columns were not updated after its
rows children changed (which can effect columns).
4. Fixed a performance issue where `AccessibilityTableCell::isTableCell`,
used to typecheck is<AccessibilityTableCell>, did a `parentTable()`
traversal. This is confusing and very non-performant. A new
`isExposedTableCell` function is added making this intent more
clear, and improving performance in the areas that don't need this
traversal.
5. Allow creating AccessibilityTable, AccessibilityTableCell, and
AccessibilityTableRow with no renderer, which is crucial for
display:contents support.
Three tests are added to ensure the slot-grid is updated after dynamic changes:
- accessibility/dynamic-colspan.html
- accessibility/dynamic-rowspan.html
- accessibility/dynamic-table-descendants.html
This patch also progresses display:contents table accessibility. New
test accessibility/display-contents/table.html is added to cover this.
* LayoutTests/accessibility/aria-table-attributes-expected.txt:
* LayoutTests/accessibility/aria-table-attributes.html:
* LayoutTests/accessibility/custom-elements/table-expected.txt:
* LayoutTests/accessibility/custom-elements/table.html:
* LayoutTests/accessibility/dynamic-colspan-expected.txt: Added.
* LayoutTests/accessibility/dynamic-colspan.html: Added.
* LayoutTests/accessibility/dynamic-rowspan-expected.txt: Added.
* LayoutTests/accessibility/dynamic-rowspan.html: Added.
* LayoutTests/accessibility/dynamic-table-descendants-expected.txt: Added.
* LayoutTests/accessibility/dynamic-table-descendants.html: Added.
* LayoutTests/accessibility/list-detection-expected.txt:
* LayoutTests/accessibility/list-detection.html:
* LayoutTests/accessibility/table-incorrect-colspan-cell-expected.txt:
* LayoutTests/accessibility/table-multiple-tbodies-expected.txt:
* LayoutTests/accessibility/table-thead-tfoot-expected.txt:
* LayoutTests/platform/mac/accessibility/generated-content-with-display-table-crash-expected.txt:
* Source/WebCore/accessibility/AXLogger.cpp:
(WebCore::operator<<):
* Source/WebCore/accessibility/AXObjectCache.cpp:
(WebCore::nodeHasGridRole):
(WebCore::isAccessibilityTable):
(WebCore::isAccessibilityTableRow):
(WebCore::isAccessibilityTableCell):
(WebCore::AXObjectCache::createObjectFromRenderer):
(WebCore::createFromNode):
(WebCore::AXObjectCache::handleChildrenChanged):
(WebCore::AXObjectCache::handleRecomputeSlotGrid):
(WebCore::AXObjectCache::handleActiveDescendantChange):
(WebCore::AXObjectCache::handleAttributeChange):
(WebCore::AXObjectCache::performDeferredCacheUpdate):
(WebCore::AXObjectCache::updateIsolatedTree):
(WebCore::AXObjectCache::deferRecomputeTableSlotGrid):
* Source/WebCore/accessibility/AXObjectCache.h:
(WebCore::nodeHasGridRole):
(WebCore::AXObjectCache::deferRecomputeTableSlotGrid):
(WebCore::AXObjectCache::handleRecomputeSlotGrid):
* Source/WebCore/accessibility/AccessibilityARIAGrid.cpp:
(WebCore::AccessibilityARIAGrid::addTableCellChild): Deleted.
(WebCore::AccessibilityARIAGrid::addRowDescendant): Deleted.
(WebCore::AccessibilityARIAGrid::addChildren): Deleted.
* Source/WebCore/accessibility/AccessibilityARIAGrid.h:
* Source/WebCore/accessibility/AccessibilityARIAGridCell.cpp:
(WebCore::AccessibilityARIAGridCell::rowIndexRange const): Deleted.
(WebCore::AccessibilityARIAGridCell::axRowSpanWithRowIndex const): Deleted.
(WebCore::AccessibilityARIAGridCell::columnIndexRange const): Deleted.
* Source/WebCore/accessibility/AccessibilityARIAGridCell.h:
* Source/WebCore/accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::selectedCells):
* Source/WebCore/accessibility/AccessibilityObject.h:
(WebCore::AccessibilityObject::slotGrid):
* Source/WebCore/accessibility/AccessibilityObjectInterface.h:
* Source/WebCore/accessibility/AccessibilityTable.cpp:
(WebCore::AccessibilityTable::AccessibilityTable):
(WebCore::AccessibilityTable::create):
(WebCore::AccessibilityTable::isDataTable const):
(WebCore::AccessibilityTable::computeIsTableExposableThroughAccessibility const):
(WebCore::AccessibilityTable::recomputeIsExposable):
(WebCore::AccessibilityTable::slotGrid):
(WebCore::AccessibilityTable::setSlotGridDirty):
(WebCore::AccessibilityTable::clearChildren):
(WebCore::AccessibilityTable::addChildren):
(WebCore::AccessibilityTable::cellForColumnAndRow):
(WebCore::AccessibilityTable::ensureRow):
(WebCore::AccessibilityTable::ensureRowAndColumn):
(WebCore::AccessibilityTable::isExposable const): Deleted.
(WebCore::AccessibilityTable::addTableCellChild): Deleted.
(WebCore::AccessibilityTable::addChildrenFromSection): Deleted.
* Source/WebCore/accessibility/AccessibilityTable.h:
* Source/WebCore/accessibility/AccessibilityTableCell.cpp:
(WebCore::AccessibilityTableCell::AccessibilityTableCell):
(WebCore::AccessibilityTableCell::create):
(WebCore::AccessibilityTableCell::computeAccessibilityIsIgnored const):
(WebCore::AccessibilityTableCell::isExposedTableCell const):
(WebCore::AccessibilityTableCell::determineAccessibilityRole):
(WebCore::AccessibilityTableCell::isTableHeaderCell const):
(WebCore::AccessibilityTableCell::parentRow const):
(WebCore::AccessibilityTableCell::rowIndexRange const):
(WebCore::AccessibilityTableCell::columnIndexRange const):
(WebCore::AccessibilityTableCell::titleUIElement const):
(WebCore::AccessibilityTableCell::axColumnIndex const):
(WebCore::AccessibilityTableCell::rowSpan const):
(WebCore::AccessibilityTableCell::colSpan const):
(WebCore::AccessibilityTableCell::isTableCell const): Deleted.
(WebCore::AccessibilityTableCell::axColumnSpan const): Deleted.
(WebCore::AccessibilityTableCell::axRowSpan const): Deleted.
* Source/WebCore/accessibility/AccessibilityTableCell.h:
(WebCore::AccessibilityTableCell::setRowIndex):
(WebCore::AccessibilityTableCell::setColumnIndex):
* Source/WebCore/accessibility/AccessibilityTableColumn.cpp:
(WebCore::AccessibilityTableColumn::columnHeader):
(WebCore::AccessibilityTableColumn::addChildren):
(WebCore::AccessibilityTableColumn::headerObjectForSection): Deleted.
* Source/WebCore/accessibility/AccessibilityTableColumn.h:
* Source/WebCore/accessibility/AccessibilityTableRow.cpp:
(WebCore::AccessibilityTableRow::AccessibilityTableRow):
(WebCore::AccessibilityTableRow::create):
(WebCore::AccessibilityTableRow::headerObject):
* Source/WebCore/accessibility/AccessibilityTableRow.h:
* Source/WebCore/accessibility/atspi/AccessibilityObjectTableAtspi.cpp:
* Source/WebCore/accessibility/atspi/AccessibilityObjectTableCellAtspi.cpp:
* Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
(-[WebAccessibilityObjectWrapper tableCellParent]):
(-[WebAccessibilityObjectWrapper accessibilityHeaderElements]):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::initializeProperties):
(WebCore::AXIsolatedObject::cellForColumnAndRow):
(WebCore::AXIsolatedObject::isTableCell const):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h:
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp:
(WebCore::AXIsolatedTree::updateNodeProperties):
(WebCore::AXIsolatedTree::updateNodeAndDependentProperties):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h:
* Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper ALLOW_DEPRECATED_IMPLEMENTATIONS_END]):
(-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
Canonical link: https://commits.webkit.org/265411@main
More information about the webkit-changes
mailing list