[webkit-changes] [WebKit/WebKit] 6fa5a2: Add PaintPhase::Accessibility and AccessibilityReg...

Tyler Wilcock noreply at github.com
Fri Apr 28 01:02:52 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 6fa5a22eeca90d4396d6e6a14e600b672aab49a4
      https://github.com/WebKit/WebKit/commit/6fa5a22eeca90d4396d6e6a14e600b672aab49a4
  Author: Tyler Wilcock <tyler_w at apple.com>
  Date:   2023-04-28 (Fri, 28 Apr 2023)

  Changed paths:
    M Source/WebCore/Headers.cmake
    M Source/WebCore/Sources.txt
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    M Source/WebCore/dom/Document.cpp
    M Source/WebCore/dom/Document.h
    M Source/WebCore/layout/integration/inline/LayoutIntegrationLineLayout.cpp
    M Source/WebCore/page/LocalFrameView.cpp
    M Source/WebCore/page/LocalFrameView.h
    M Source/WebCore/page/RemoteFrameView.cpp
    M Source/WebCore/page/RemoteFrameView.h
    M Source/WebCore/platform/ScrollView.cpp
    M Source/WebCore/platform/ScrollView.h
    M Source/WebCore/platform/Scrollbar.cpp
    M Source/WebCore/platform/Scrollbar.h
    M Source/WebCore/platform/Widget.cpp
    M Source/WebCore/platform/Widget.h
    M Source/WebCore/platform/gtk/WidgetGtk.cpp
    M Source/WebCore/platform/ios/WidgetIOS.mm
    M Source/WebCore/platform/mac/WidgetMac.mm
    M Source/WebCore/platform/win/WidgetWin.cpp
    A Source/WebCore/rendering/AccessibilityRegionContext.cpp
    A Source/WebCore/rendering/AccessibilityRegionContext.h
    M Source/WebCore/rendering/EventRegion.cpp
    M Source/WebCore/rendering/EventRegion.h
    M Source/WebCore/rendering/LegacyInlineElementBox.cpp
    M Source/WebCore/rendering/LegacyInlineFlowBox.cpp
    M Source/WebCore/rendering/PaintInfo.h
    M Source/WebCore/rendering/PaintPhase.h
    A Source/WebCore/rendering/RegionContext.cpp
    A Source/WebCore/rendering/RegionContext.h
    M Source/WebCore/rendering/RenderBlock.cpp
    M Source/WebCore/rendering/RenderBox.cpp
    M Source/WebCore/rendering/RenderElement.cpp
    M Source/WebCore/rendering/RenderLayer.cpp
    M Source/WebCore/rendering/RenderLayer.h
    M Source/WebCore/rendering/RenderLayerBacking.cpp
    M Source/WebCore/rendering/RenderLayerBacking.h
    M Source/WebCore/rendering/RenderListMarker.cpp
    M Source/WebCore/rendering/RenderReplaced.cpp
    M Source/WebCore/rendering/RenderScrollbar.cpp
    M Source/WebCore/rendering/RenderScrollbar.h
    M Source/WebCore/rendering/RenderWidget.cpp
    M Source/WebCore/rendering/TextBoxPainter.cpp
    M Source/WebKit/WebProcess/Plugins/PluginView.cpp
    M Source/WebKit/WebProcess/Plugins/PluginView.h

  Log Message:
  -----------
  Add PaintPhase::Accessibility and AccessibilityRegionContext to enable AX element bounding-box caching
https://bugs.webkit.org/show_bug.cgi?id=255076
rdar://problem/107694492

Reviewed by Simon Fraser.

Accessibility needs to cache the bounding box of non-accessibility-is-ignored elements on the secondary AX thread.
To get these bounding-boxes, this patch adds a new accessibility paint phase with the intention of triggering this
paint phase in `Page::doAfterUpdateRendering` (which will be done in a future patch) just as event regions do.

To accomplish this, this patch refactors `EventRegionContext`s clip stack and transform stack maintenance into a new
`RegionContext` base class. `EventRegionContext` now derives from `RegionContext` along with a new `AccessibilityRegionContext`
class. `AccessibilityRegionContext` will take the bounds generated by painting, apply transforms and clips, and usher
this information elsewhere to be used to update accessibility data structures (with that last step coming in a later patch).

* Source/WebCore/Headers.cmake:
Add AccessibilityRegionContext.h and RegionContext.h.
* Source/WebCore/Sources.txt:
Add AccessibilityRegionContext.cpp and RegionContext.cpp.

* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
Add AccessibilityRegionContext.{h, cpp} and RegionContext.{h, cpp}

* Source/WebCore/dom/Document.h:
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::updateAccessibilityObjectRegions): Added.

* Source/WebCore/layout/integration/inline/LayoutIntegrationLineLayout.cpp:
(WebCore::LayoutIntegration::LineLayout::paint):
Paint for PaintPhase::Accessibility.

* Source/WebCore/page/LocalFrameView.cpp:
(WebCore::LocalFrameView::updateAccessibilityObjectRegions): Added.
(WebCore::LocalFrameView::paintContents):
* Source/WebCore/page/LocalFrameView.h:
* Source/WebCore/page/RemoteFrameView.cpp:
(WebCore::RemoteFrameView::paintContents):
* Source/WebCore/page/RemoteFrameView.h:
* Source/WebCore/platform/ScrollView.cpp:
(WebCore::ScrollView::paint):
* Source/WebCore/platform/ScrollView.h:
* Source/WebCore/platform/Scrollbar.cpp:
(WebCore::Scrollbar::paint):
* Source/WebCore/platform/Scrollbar.h:
* Source/WebCore/platform/Widget.cpp:
* Source/WebCore/platform/gtk/WidgetGtk.cpp:
* Source/WebCore/platform/win/WidgetWin.cpp:
(WebCore::Widget::paint):
* Source/WebCore/platform/Widget.h:
* Source/WebCore/platform/ios/WidgetIOS.mm:
(WebCore::Widget::paint):
* Source/WebCore/platform/mac/WidgetMac.mm:
(WebCore::Widget::paint):
Accept a `RegionContext*` parameter instead of an `EventRegionContext*`.

* Source/WebCore/rendering/AccessibilityRegionContext.cpp: Added.
(WebCore::AccessibilityRegionContext::takeBounds):
* Source/WebCore/rendering/AccessibilityRegionContext.h: Added.
(WebCore::AccessibilityRegionContext::mapRect):

* Source/WebCore/rendering/EventRegion.h:
* Source/WebCore/rendering/EventRegion.cpp:
(WebCore::EventRegionContext::pushTransform): Deleted.
(WebCore::EventRegionContext::popTransform): Deleted.
(WebCore::EventRegionContext::pushClip): Deleted.
(WebCore::EventRegionContext::popClip): Deleted.
These functions and their associated state are moved to
the newly added base class, `RegionContext`.

(WebCore::EventRegionContextStateSaver::EventRegionContextStateSaver): Deleted.
(WebCore::EventRegionContextStateSaver::~EventRegionContextStateSaver): Deleted.
(WebCore::EventRegionContextStateSaver::pushClip): Deleted.
(WebCore::EventRegionContextStateSaver::context const): Deleted.
Replaced by the equivalent and new-to-this-patch `RegionContextStateSaver`.

* Source/WebCore/rendering/LegacyInlineElementBox.cpp:
(WebCore::LegacyInlineElementBox::paint):
* Source/WebCore/rendering/LegacyInlineFlowBox.cpp:
(WebCore::LegacyInlineFlowBox::paint):
Avoid early return when painting for PaintPhase::Accessibility.

* Source/WebCore/rendering/RegionContext.h: Added.
* Source/WebCore/rendering/RegionContext.cpp: Added.
(WebCore::RegionContext::pushTransform):
(WebCore::RegionContext::popTransform):
(WebCore::RegionContext::pushClip):
(WebCore::RegionContext::popClip):
Replaces equivalent functionality that used to be in `EventRegionContext`.
(WebCore::RegionContext::isEventRegionContext const):
(WebCore::RegionContext::isAccessibilityRegionContext const):

(WebCore::RegionContextStateSaver::RegionContextStateSaver):
(WebCore::RegionContextStateSaver::~RegionContextStateSaver):
(WebCore::RegionContextStateSaver::pushClip):
(WebCore::RegionContextStateSaver::context const):
Replaces equivalent functionality that used to be in `EventRegionContextStateSaver`.

* Source/WebCore/rendering/PaintInfo.h:
Store a `RegionContext*` rather than an `EventRegionContext*`.
(WebCore::PaintInfo::eventRegionPaintContext): Added.
(WebCore::PaintInfo::accessibilityPaintContext): Added.

* Source/WebCore/rendering/PaintPhase.h:
Add new PaintPhase::Accessibility.

* Source/WebCore/rendering/RenderBlock.cpp:
(WebCore::RenderBlock::paintContents):
Check for non-null event region paint context to maintain existing
behavior.

(WebCore::RenderBlock::paintObject):
Give the paint-rect of this `RenderBlock` to the `AccessibilityRegionContext` if present.
Handle new `PaintPhase::Accessibility`.

* Source/WebCore/rendering/RenderBox.cpp:
(WebCore::RenderBox::pushContentsClip):
(WebCore::RenderBox::popContentsClip):
Push and pop clip for both `PaintPhase::Accessibility` and `PaintPhase::EventRegion`.

* Source/WebCore/rendering/RenderElement.cpp:
(WebCore::RenderElement::paintAsInlineBlock):
Allow paint for `PaintPhase::Accessibility`.

* Source/WebCore/rendering/RenderLayer.cpp:
(WebCore::RenderLayer::paint):
(WebCore::RenderLayer::clipToRect):
(WebCore::RenderLayer::paintLayerWithEffects):
(WebCore::RenderLayer::setupClipPath):
(WebCore::RenderLayer::applyFilters):
(WebCore::RenderLayer::paintLayerContents):
(WebCore::RenderLayer::paintLayerByApplyingTransform):
(WebCore::RenderLayer::paintTransformedLayerIntoFragments):
(WebCore::RenderLayer::paintBackgroundForFragments):
(WebCore::RenderLayer::paintForegroundForFragments):
(WebCore::RenderLayer::paintForegroundForFragmentsWithPhase):
(WebCore::RenderLayer::paintOutlineForFragments):
(WebCore::RenderLayer::paintMaskForFragments):
(WebCore::RenderLayer::paintChildClippingMaskForFragments):
(WebCore::RenderLayer::paintOverflowControlsForFragments):
(WebCore::RenderLayer::collectEventRegionForFragments):
(WebCore::RenderLayer::collectAccessibilityRegionsForFragments): Added.
Replace usage of `EventRegionContextStateSaver` with `RegionContextStateSaver`.
Check for the presence of `EventRegionContext` when appropriate to maintain existing behavior.

* Source/WebCore/rendering/RenderLayer.h:
(WebCore::RenderLayer::paint):
Accept a `RegionContext*` parameter instead of an `EventRegionContext*`.
Store a `RegionContext*` rather than an `EventRegionContext*` in `struct LayerPaintingInfo`.

* Source/WebCore/rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::paintIntoLayer):
* Source/WebCore/rendering/RenderLayerBacking.h:
Accept a `RegionContext*` parameter instead of an `EventRegionContext*`.
Replace usage of `EventRegionContextStateSaver` with `RegionContextStateSaver`.

* Source/WebCore/rendering/RenderListMarker.cpp:
(WebCore::RenderListMarker::paint):
Paint for `PaintPhase::Accessibility`.

* Source/WebCore/rendering/RenderReplaced.cpp:
(WebCore::RenderReplaced::paint):
(WebCore::RenderReplaced::shouldPaint):
Paint for `PaintPhase::Accessibility`.

* Source/WebCore/rendering/RenderScrollbar.h:
* Source/WebCore/rendering/RenderScrollbar.cpp:
(WebCore::RenderScrollbar::paint):
Accept a `RegionContext*` parameter instead of an `EventRegionContext*`.

* Source/WebCore/rendering/RenderWidget.cpp:
(WebCore::RenderWidget::paintContents):
(WebCore::RenderWidget::paint):
Return early before actual paint for `PaintPhase::Accessibility`.

* Source/WebCore/rendering/TextBoxPainter.cpp:
(WebCore::TextBoxPainter<TextBoxPath>::TextBoxPainter):
(WebCore::TextBoxPainter<TextBoxPath>::paint):
Allow paint for `PaintPhase::Accessibility` in ASSERT (we will need to
handle these paints in a future patch).

* Source/WebKit/WebProcess/Plugins/PluginView.h:
* Source/WebKit/WebProcess/Plugins/PluginView.cpp:
(WebKit::PluginView::paint):
Accept a `RegionContext*` parameter instead of an `EventRegionContext*`.

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




More information about the webkit-changes mailing list