[webkit-changes] [WebKit/WebKit] 8884fa: AX: Cache AXIsolatedObject::relativeFrame using ge...

Tyler Wilcock noreply at github.com
Sat May 6 22:41:14 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 8884fab24279a36dcfe3b5c1eaf5e68b41fb2874
      https://github.com/WebKit/WebKit/commit/8884fab24279a36dcfe3b5c1eaf5e68b41fb2874
  Author: Tyler Wilcock <tyler_w at apple.com>
  Date:   2023-05-06 (Sat, 06 May 2023)

  Changed paths:
    M LayoutTests/accessibility-isolated-tree/TestExpectations
    A LayoutTests/accessibility/mac/display-contents-relative-frame-expected.txt
    A LayoutTests/accessibility/mac/display-contents-relative-frame.html
    A LayoutTests/accessibility/mac/dynamic-transform-relative-frame-expected.txt
    A LayoutTests/accessibility/mac/dynamic-transform-relative-frame.html
    A LayoutTests/accessibility/mac/position-fixed-top-bottom-properties-relative-frame-expected.txt
    A LayoutTests/accessibility/mac/position-fixed-top-bottom-properties-relative-frame.html
    M LayoutTests/platform/mac-wk1/TestExpectations
    M Source/WebCore/Headers.cmake
    M Source/WebCore/Sources.txt
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    A Source/WebCore/accessibility/AXGeometryManager.cpp
    A Source/WebCore/accessibility/AXGeometryManager.h
    M Source/WebCore/accessibility/AXObjectCache.cpp
    M Source/WebCore/accessibility/AXObjectCache.h
    M Source/WebCore/accessibility/AccessibilityObject.h
    M Source/WebCore/accessibility/AccessibilityObjectInterface.h
    M Source/WebCore/accessibility/AccessibilityScrollView.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/dom/Document.cpp
    M Source/WebCore/page/LocalFrameView.h
    M Source/WebCore/page/Page.cpp
    M Source/WebCore/page/Page.h
    M Source/WebCore/platform/ScrollView.cpp
    M Source/WebCore/platform/ScrollView.h
    M Source/WebCore/rendering/AccessibilityRegionContext.cpp
    M Source/WebCore/rendering/AccessibilityRegionContext.h
    M Source/WebCore/rendering/InlineBoxPainter.cpp
    M Source/WebCore/rendering/RenderBlock.cpp
    M Source/WebCore/rendering/RenderReplaced.cpp
    M Source/WebCore/rendering/TextBoxPainter.cpp

  Log Message:
  -----------
  AX: Cache AXIsolatedObject::relativeFrame using geometry computed during PaintPhase::Accessibility
https://bugs.webkit.org/show_bug.cgi?id=256179
rdar://problem/108756434

Reviewed by Andres Gonzalez.

With this patch, we cache the relative frame for most types of objects with the geometry computed
during PaintPhase::Accessibility. The high-level approach is as follows:

  1. In Page::doAfterUpdateRendering, initiate a PaintPhase::Accessibility paint
    - This paint is buffered on a timer to happen, at-most, once every 750ms, to avoid taxing the main-thread.
  2. As objects paint themselves during this phase, they will submit their geometry to AccessibilityRegionContext.
  3. AccessibilityRegionContext will apply any transforms, clips, and other necessary modifications, and then send
     the geometry to AXObjectCache::onPaint.
  4. AXObjectCache::onPaint queues an update for the isolated tree (if necessary)

After this patch, holding VO-Right on a popular social media website showed that we serve 85% of relative
frame requests off the main-thread (we served 0% off the main-thread before this patch).

This patch does not cache the relative frame for every type of object. Notable missing types:
  - Most AccessibilityMockObject subclasses, and other non-AccessibilityRenderObject subclasses (because they do not have a renderer to paint)
  - SVGs. WebKit still uses the legacy SVG implementation, and I found it difficult to extract the correct geometry from painted legacy SVGs.
  - Node-only objects with no children
  - And more; this list is not comprehensive.

* LayoutTests/accessibility-isolated-tree/TestExpectations:
* LayoutTests/accessibility/mac/display-contents-relative-frame-expected.txt: Added.
* LayoutTests/accessibility/mac/display-contents-relative-frame.html: Added.
* LayoutTests/accessibility/mac/dynamic-transform-relative-frame-expected.txt: Added.
* LayoutTests/accessibility/mac/dynamic-transform-relative-frame.html: Added.
* LayoutTests/accessibility/mac/position-fixed-top-bottom-properties-relative-frame-expected.txt: Added.
* LayoutTests/accessibility/mac/position-fixed-top-bottom-properties-relative-frame.html: Added.
* LayoutTests/platform/mac-wk1/TestExpectations:
* Source/WebCore/Headers.cmake:
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/accessibility/AXGeometryManager.cpp: Added.
(WebCore::AXGeometryManager::AXGeometryManager):
(WebCore::AXGeometryManager::paintRectForID):
(WebCore::AXGeometryManager::onPaint):
(WebCore::AXGeometryManager::scheduleObjectRegionsUpdate):
(WebCore::AXGeometryManager::willUpdateObjectRegions):
(WebCore::AXGeometryManager::updateObjectRegionsTimerFired):
* Source/WebCore/accessibility/AXGeometryManager.h: Copied from Source/WebCore/rendering/AccessibilityRegionContext.h.
(WebCore::AXGeometryManager::create):
(WebCore::AXGeometryManager::remove):
* Source/WebCore/accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::AXObjectCache):
(WebCore::AXObjectCache::getOrCreateIsolatedTree):
(WebCore::AXObjectCache::remove):
(WebCore::AXObjectCache::onPaint const):
(WebCore::AXObjectCache::getOrCreateIsolatedTree const): Deleted.
* Source/WebCore/accessibility/AXObjectCache.h:
(WebCore::AXObjectCache::paintRectForID):
(WebCore::AXObjectCache::onPaint const):
(WebCore::AXObjectCache::scheduleObjectRegionsUpdate):
(WebCore::AXObjectCache::willUpdateObjectRegions):
(WebCore::AXObjectCache::onPaint):
(WebCore::AXObjectCache::updateObjectRegionsTimerFired):
* Source/WebCore/accessibility/AccessibilityObject.h:
* Source/WebCore/accessibility/AccessibilityObjectInterface.h:
(WebCore::Accessibility::exposedTableAncestor):
* Source/WebCore/accessibility/AccessibilityScrollView.cpp:
(WebCore::AccessibilityScrollView::elementRect const):
* Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
(-[WebAccessibilityObjectWrapper tableParent]):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::initializeProperties):
(WebCore::AXIsolatedObject::optionalAttributeValue const):
(WebCore::AXIsolatedObject::elementRect const):
(WebCore::AXIsolatedObject::relativeFrame const):
(WebCore::AXIsolatedObject::relativeFrameFromChildren const):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h:
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp:
(WebCore::AXIsolatedTree::updateFrame):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h:
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::updateAccessibilityObjectRegions):
* Source/WebCore/page/LocalFrameView.h:
* Source/WebCore/page/Page.cpp:
(WebCore::Page::doAfterUpdateRendering):
(WebCore::Page::shouldUpdateAccessibilityRegions const):
(WebCore::operator<<):
* Source/WebCore/page/Page.h:
* Source/WebCore/platform/ScrollView.cpp:
(WebCore::ScrollView::frameRectShrunkByInset const):
(WebCore::ScrollView::paint):
* Source/WebCore/platform/ScrollView.h:
* Source/WebCore/rendering/AccessibilityRegionContext.cpp:
(WebCore::AccessibilityRegionContext::~AccessibilityRegionContext):
(WebCore::AccessibilityRegionContext::takeBounds):
(WebCore::AccessibilityRegionContext::takeBoundsInternal):
(WebCore::AccessibilityRegionContext::onPaint):
* Source/WebCore/rendering/AccessibilityRegionContext.h:
(WebCore::AccessibilityRegionContext::takeBounds):
* Source/WebCore/rendering/InlineBoxPainter.cpp:
(WebCore::InlineBoxPainter::paint):
* Source/WebCore/rendering/RenderBlock.cpp:
(WebCore::RenderBlock::paintObject):
* Source/WebCore/rendering/RenderReplaced.cpp:
(WebCore::RenderReplaced::paint):
* Source/WebCore/rendering/TextBoxPainter.cpp:
(WebCore::TextBoxPainter<TextBoxPath>::paint):

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




More information about the webkit-changes mailing list