Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 0025697e602664cc2c95bd76d69f538cbb61a0f0
      
https://github.com/WebKit/WebKit/commit/0025697e602664cc2c95bd76d69f538cbb61a0f0
  Author: Tyler Wilcock <[email protected]>
  Date:   2024-01-31 (Wed, 31 Jan 2024)

  Changed paths:
    A LayoutTests/accessibility/tree-update-with-dirty-layout-expected.txt
    A LayoutTests/accessibility/tree-update-with-dirty-layout.html
    M LayoutTests/platform/glib/TestExpectations
    M LayoutTests/platform/ios/TestExpectations
    A 
LayoutTests/platform/ios/accessibility/tree-update-with-dirty-layout-expected.txt
    M LayoutTests/platform/mac-wk1/TestExpectations
    M LayoutTests/resources/accessibility-helper.js
    M Source/WebCore/accessibility/AXCoreObject.cpp
    M Source/WebCore/accessibility/AXCoreObject.h
    M Source/WebCore/accessibility/AXObjectCache.cpp
    M Source/WebCore/accessibility/AXObjectCache.h
    M Source/WebCore/accessibility/AccessibilityObject.cpp
    M Source/WebCore/accessibility/AccessibilityRenderObject.cpp
    M Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
    M Source/WebCore/dom/Document.cpp

  Log Message:
  -----------
  AX: Depending on the timing of Document::flushDeferredAXObjectCacheUpdate(), 
AXObjectCache::performDeferredCacheUpdate can be run with dirty layout
https://bugs.webkit.org/show_bug.cgi?id=268239
rdar://problem/121760427

Reviewed by Chris Fleizach and Andres Gonzalez.

In bug:

https://bugs.webkit.org/show_bug.cgi?id=256403 (Defer AX object cache update as 
an event loop task instead of a post layout task)

AXObjectCache::perfromDeferredCacheUpdate was moved from being a synchronous 
post-layout task to an asynchronous one,
running when possible via the EventLoop.

The problem with this is that by the time 
Document::flushDeferredAXObjectCacheUpdate() actually fires, layout may have
become dirty again, which means AXObjectCache::performDeferredCacheUpdate makes 
incorrect updates to the accessibility
tree. As one specific example, it can cause us to compute the wrong ignored 
value for RenderTexts, as we check
RenderText::hasRenderedText which may unexpectedly return false only because 
the layout is dirty.

With this patch, performDeferredCacheUpdate now detects when layout is dirty, 
and either waits another round in the event
loop or forces a layout if necessary. Waiting for a clean layout rather than 
forcing one is ideal, as layout is expensive.

* LayoutTests/accessibility/tree-update-with-dirty-layout-expected.txt: Added.
* LayoutTests/accessibility/tree-update-with-dirty-layout.html: Added.
* LayoutTests/platform/glib/TestExpectations: Disable new test.
* LayoutTests/platform/ios/TestExpectations: Enable new test.
* 
LayoutTests/platform/ios/accessibility/tree-update-with-dirty-layout-expected.txt:
 Added.
* Source/WebCore/accessibility/AXCoreObject.cpp:
(WebCore::Accessibility::inRenderTreeOrStyleUpdate): Added.
* Source/WebCore/accessibility/AXCoreObject.h:
* Source/WebCore/accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::performDeferredCacheUpdate):
(WebCore::AXObjectCache::performCacheUpdateTimerFired): Deleted.
* Source/WebCore/accessibility/AXObjectCache.h:
(WebCore::AXObjectCache::performCacheUpdateTimerFired):
* Source/WebCore/accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::updateBackingStore):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp:
(WebCore::AXIsolatedTree::create):
* LayoutTests/resources/accessibility-helper.js:

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


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to