Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 4a5b56e32671dd7cc4768db52d1b8b0681b17ee9
https://github.com/WebKit/WebKit/commit/4a5b56e32671dd7cc4768db52d1b8b0681b17ee9
Author: Alan Baradlay <[email protected]>
Date: 2024-06-07 (Fri, 07 Jun 2024)
Changed paths:
M Source/WebCore/page/LocalFrameView.cpp
M Source/WebCore/page/LocalFrameView.h
M Source/WebCore/page/LocalFrameViewLayoutContext.cpp
M Source/WebCore/page/LocalFrameViewLayoutContext.h
M Source/WebCore/rendering/RenderElement.cpp
M Source/WebCore/rendering/RenderElement.h
M Source/WebCore/rendering/RenderLayer.cpp
M Source/WebCore/rendering/RenderLayer.h
M Source/WebCore/rendering/RenderObject.cpp
M Source/WebCore/rendering/RenderView.cpp
Log Message:
-----------
Limit the number of repaint candidates after simplified layout
https://bugs.webkit.org/show_bug.cgi?id=275153
Reviewed by Simon Fraser.
"simplified normal-flow layout" is initiated when the only property that
requires attention
at layout time throughout the entire tree is overflow.
It simply means that the current (outstanding) style and/or content mutation
that we try to recover from
is not supposed to change any in- or out-of-flow box size and/or position.
Such change may be triggered by
- out-of-flow box is inserted and/or removed (note that at insertion, we run
non-simplified layout
_inside_ the freshly added subtree)
- StyleDifferenceContextSensitiveProperty::Transform changes but nothing else
(e.g. scale changes on an element.
This only applies to mutating existing properties, i.e. when a new transform
related property is added,
non-simplified layout is initiated)
1. These type of changes are not supposed to expand the damaged area (marking
additional renderers dirty as
we run layout on the tree).
2. The entry point in most cases is still the RenderView but it could very well
be a subtree layout.
Layout:
We traverse through descendants by calling layout() all the way to the dirty
renderer(s).
However while descending, we only run simplifiedLayout().
After layout:
We run RenderLayer::updateLayerPositionsAfterLayout() where we traverse the
_layer_ tree
and (almost unconditionally) re-compute repaint rects on associated renderers
(and even issue redundant repaints).
When the damage is limited to relatively small subtree(s), most of this work
is redundant.
This patch ensures that in case of "simplified normal-flow layout", "repaint
rects" related work happens only on affected renderers.
1. Assign a layout identifier to each layout run
(LocalFrameViewLayoutContext::performLayout)
2. Mark each renderer involved in current layout with said layout identifier
(RenderObject::clearNeedsLayout)
3. Check if the current layout is "simplified normal-flow layout" by looking at
the layout root's dirty bit.
(note that "simplified normal-flow layout" is not supposed to get upgraded
to "normal layout" during layout or
"normal layout" downgraded to "simple".)
4. Only issue repaint in RenderLayer::recursiveUpdateLayerPositions() when the
associated renderer
participated in the most recent layout.
* Source/WebCore/page/LocalFrameViewLayoutContext.cpp:
(WebCore::LocalFrameViewLayoutContext::performLayout):
* Source/WebCore/page/LocalFrameViewLayoutContext.h:
* Source/WebCore/rendering/RenderElement.h:
(WebCore::RenderElement::setNormalFlowLayoutFrameId):
(WebCore::RenderElement::normalFlowLayoutFrameId const):
* Source/WebCore/rendering/RenderLayer.cpp:
(WebCore::RenderLayer::updateLayerPositionsAfterLayout):
(WebCore::RenderLayer::recursiveUpdateLayerPositions):
* Source/WebCore/rendering/RenderLayer.h:
* Source/WebCore/rendering/RenderObject.cpp:
(WebCore::RenderObject::clearNeedsLayout):
(WebCore::RenderObject::outputRenderObject const):
* Source/WebCore/rendering/RenderView.cpp: remove redundant clear.
(WebCore::RenderView::layout):
Canonical link: https://commits.webkit.org/279847@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