Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: df0e5116081b07f064024f844c7a7111850e3298
      
https://github.com/WebKit/WebKit/commit/df0e5116081b07f064024f844c7a7111850e3298
  Author: Simon Fraser <simon.fra...@apple.com>
  Date:   2022-12-06 (Tue, 06 Dec 2022)

  Changed paths:
    A 
LayoutTests/scrollingcoordinator/scrolling-tree/sticky-gain-composited-scrolling-ancestor-expected.txt
    A 
LayoutTests/scrollingcoordinator/scrolling-tree/sticky-gain-composited-scrolling-ancestor.html
    M Source/WebCore/rendering/RenderLayer.cpp
    M Source/WebCore/rendering/RenderLayer.h
    M Source/WebCore/rendering/RenderLayerCompositor.cpp
    M Source/WebCore/rendering/RenderLayerScrollableArea.cpp

  Log Message:
  -----------
  REGRESSION (253865@main): Crashes under 
RenderLayerCompositor::updateScrollingNodeForViewportConstrainedRole
https://bugs.webkit.org/show_bug.cgi?id=248827
rdar://102619100

Reviewed by Alan Baradlay.

In 253865@main I introduced `m_viewportAnchorLayer`, which is used by the 
scrolling tree
to move fixed and sticky position layers. However, this revealed bugs in the 
compositing
dirty state management in the RenderLayer tree, where some types of tree 
mutations would
fail to trigger the "configuration" compositing update on a composited layer 
which is
responsible for the addition/removal of the `m_viewportAnchorLayer`.

>From the collection of crash reports, I diagnosed two scenarios:

On google.com, when selecting results in the map view (rdar://102713246), a 
fixed layer
gained/lost a transformed ancestor. Transforms act as containing block for 
fixed, so
this changes whether the fixed layer is viewport-constrained. Fixed by having
`RenderLayer::setBehavesAsFixed()` call 
`setNeedsCompositingConfigurationUpdate()` on
fixed layers. Normally repaints trigger 
`setNeedsCompositingConfigurationUpdate()`; I
was not able to creation a reduction for this (the google page has nested fixed 
and
`visibility:hidden`, which may contribute).

The second scenario involved a sticky position layer which gains/loses an
async-scrollable ancestor. Fixed by having
`RenderLayerScrollableArea::computeHasCompositedScrollableOverflow()` call
`setDescendantsNeedUpdateBackingAndHierarchyTraversal()` on the stacking context
ancestor. Tested by sticky-gain-composited-scrolling-ancestor.html.

Also defensively early return in `computeFixedViewportConstraints()` and
`computeStickyViewportConstraints()` if the anchor layer is null.

* 
LayoutTests/scrollingcoordinator/scrolling-tree/sticky-gain-composited-scrolling-ancestor-expected.txt:
 Added.
* 
LayoutTests/scrollingcoordinator/scrolling-tree/sticky-gain-composited-scrolling-ancestor.html:
 Added.
* Source/WebCore/rendering/RenderLayer.cpp:
(WebCore::RenderLayer::recursiveUpdateLayerPositions):
(WebCore::RenderLayer::setBehavesAsFixed):
* Source/WebCore/rendering/RenderLayer.h:
* Source/WebCore/rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::computeFixedViewportConstraints const):
(WebCore::RenderLayerCompositor::computeStickyViewportConstraints const):
* Source/WebCore/rendering/RenderLayerScrollableArea.cpp:
(WebCore::RenderLayerScrollableArea::computeHasCompositedScrollableOverflow):

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


_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to