Branch: refs/heads/main Home: https://github.com/WebKit/WebKit Commit: 0604c50219a2832146d4b7b2caebebfa57e144d6 https://github.com/WebKit/WebKit/commit/0604c50219a2832146d4b7b2caebebfa57e144d6 Author: Tyler Wilcock <tyle...@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 _______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-changes