Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: fd94364a91826f78ea7756db114af3115045e23d
      
https://github.com/WebKit/WebKit/commit/fd94364a91826f78ea7756db114af3115045e23d
  Author: Tyler Wilcock <[email protected]>
  Date:   2024-11-13 (Wed, 13 Nov 2024)

  Changed paths:
    M LayoutTests/accessibility-isolated-tree/TestExpectations
    M 
LayoutTests/accessibility/ios-simulator/has-touch-event-listener-with-shadow.html
    M LayoutTests/accessibility/press-works-on-control-types-expected.txt
    M LayoutTests/accessibility/press-works-on-control-types.html
    M Source/WebCore/accessibility/AXCoreObject.cpp
    M Source/WebCore/accessibility/AXCoreObject.h
    M Source/WebCore/accessibility/AXLogger.cpp
    M Source/WebCore/accessibility/AXObjectCache.cpp
    M Source/WebCore/accessibility/AXObjectCache.h
    M Source/WebCore/accessibility/AccessibilityNodeObject.cpp
    M Source/WebCore/accessibility/AccessibilityNodeObject.h
    M Source/WebCore/accessibility/AccessibilityObject.cpp
    M Source/WebCore/accessibility/AccessibilityObject.h
    M Source/WebCore/accessibility/AccessibilityRenderObject.cpp
    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
    M Source/WebCore/dom/EventTarget.h
    M Source/WebCore/dom/Node.cpp
    M Source/WebCore/inspector/InspectorAuditAccessibilityObject.cpp
    M Source/WebCore/inspector/agents/InspectorDOMAgent.cpp

  Log Message:
  -----------
  AX: Compute supportsPressAction lazily off the main-thread
https://bugs.webkit.org/show_bug.cgi?id=283007
rdar://139746202

Reviewed by Chris Fleizach.

Over time, AccessibilityObject::supportsPressAction() has caused many 
performance challenges because:
  1. We eagerly cached AXPropertyName::SupportsPressAction.

  2. For every descendant of an "action element" (e.g. something with a click 
handler), we did a subtree traversal,
     walking up to 512 objects.

This problem becomes significantly worse in 
ENABLE(INCLUDE_IGNORED_IN_CORE_AX_TREE) where computing unignoredChildren()
is no longer reading from a pre-built `const AccessbilityChildrenVector& 
m_children`, but instead walking ignored descendants
to build unignored children on the fly.

With this PR, both problems are solved:
  1. We no longer eagerly cache AXPropertyName::SupportsPressAction — this 
property is removed outright. Instead, we compute
     it on-demand, caching two new cheap properties to make that possible: 
AXPropertyName::{HasBodyTag, HasClickHandler}.
     This also gives us the advantage of handling dynamic accessibility tree 
structure changes and dynamic event listener
     changes, both of which would cause us to return a stale 
AXPropertyName::SupportsPressAction prior to this commit.
     This has the side effect of fixing 
accessibility/mac/press-action-not-exposed-for-event-delegation.html in ITM.

  2. Make the subtree traversal significantly cheaper by walking ignored 
descendants, which are now the cheap-to-access
     `const AccessbilityChildrenVector& m_children`. This also let's us only 
compute isIgnored() when it matters: for
     leaf nodes potentially worth adding supportsPressAction for (e.g. static 
text or images).

  3. Do not do any subtree traversal if we walk through an "implicitly 
interactive" (e.g. button, link) element on the
     way to our click handler. The semantics of these roles imply pressability 
— we don't need to apply this expensive
     web authoring repair strategy in this case.

* LayoutTests/accessibility-isolated-tree/TestExpectations:
Remove accessibility/mac/press-action-not-exposed-for-event-delegation.html 
from the list of expected
failures, as we now properly report supportsPressAction even after dynamic 
event listener changes.
* LayoutTests/accessibility/press-works-on-control-types-expected.txt:
* LayoutTests/accessibility/press-works-on-control-types.html:
Remove testcase that expected a group to be pressable. Groups aren't control 
types.
* Source/WebCore/accessibility/AXCoreObject.cpp:
(WebCore::AXCoreObject::isImplicitlyInteractive const): Added.
(WebCore::AXCoreObject::supportsPressAction const):
* Source/WebCore/accessibility/AXCoreObject.h:
(WebCore::Accessibility::findAncestor):
(WebCore::Accessibility::clickableAncestor):
* Source/WebCore/accessibility/AXLogger.cpp:
(WebCore::operator<<):
* Source/WebCore/accessibility/AXObjectCache.cpp:
(WebCore::isClickEvent):
(WebCore::AXObjectCache::onEventListenerAdded):
(WebCore::AXObjectCache::onEventListenerRemoved):
* Source/WebCore/accessibility/AXObjectCache.h:
* Source/WebCore/accessibility/AccessibilityNodeObject.cpp:
(WebCore::AccessibilityNodeObject::actionElement const):
(WebCore::AccessibilityNodeObject::hasClickHandler const):
(WebCore::AccessibilityNodeObject::mouseButtonListener const): Deleted.
* Source/WebCore/accessibility/AccessibilityNodeObject.h:
* Source/WebCore/accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::supportsPressAction const): Deleted.
* Source/WebCore/accessibility/AccessibilityObject.h:
(WebCore::AccessibilityObject::popoverTargetElement const):
* Source/WebCore/accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::computeIsIgnored const):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::initializeProperties):
(WebCore::AXIsolatedObject::setProperty):
(WebCore::AXIsolatedObject::boolAttributeValue const):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h:
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp:
(WebCore::AXIsolatedTree::updateNodeProperties):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h:
(WebCore::AXIsolatedTree::updateNodeProperties):
* Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper ALLOW_DEPRECATED_IMPLEMENTATIONS_END]):
* Source/WebCore/dom/EventTarget.h:
(WebCore::EventTarget::hasAnyEventListeners const):
* Source/WebCore/dom/Node.cpp:
(WebCore::tryAddEventListener):
(WebCore::didRemoveEventListenerOfType):
* Source/WebCore/inspector/InspectorAuditAccessibilityObject.cpp:
(WebCore::InspectorAuditAccessibilityObject::getMouseEventNode):
* Source/WebCore/inspector/agents/InspectorDOMAgent.cpp:
(WebCore::InspectorDOMAgent::buildObjectForAccessibilityProperties):

Canonical link: https://commits.webkit.org/286568@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to