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