[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