Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 3210e3e92621749e154066495e94ccbcb6f6afa1
https://github.com/WebKit/WebKit/commit/3210e3e92621749e154066495e94ccbcb6f6afa1
Author: Simon Fraser <[email protected]>
Date: 2026-05-17 (Sun, 17 May 2026)
Changed paths:
M
LayoutTests/compositing/filters/sw-nested-shadow-overlaps-hw-nested-shadow-expected.txt
A LayoutTests/compositing/geometry/bounds-with-filters-expected.txt
A LayoutTests/compositing/geometry/bounds-with-filters.html
M LayoutTests/css3/filters/drop-shadow-target-clipped.html
M LayoutTests/fast/hidpi/filters-drop-shadow.html
A LayoutTests/fast/repaint/blur-change-expected.txt
A LayoutTests/fast/repaint/blur-change.html
A LayoutTests/fast/repaint/drop-shadow-box-change-expected.txt
A LayoutTests/fast/repaint/drop-shadow-box-change.html
A LayoutTests/fast/repaint/drop-shadow-change-expected.txt
A LayoutTests/fast/repaint/drop-shadow-change.html
A LayoutTests/fast/repaint/drop-shadow-writing-modes-expected.txt
A LayoutTests/fast/repaint/drop-shadow-writing-modes.html
M
LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/filters-drop-shadow-002.html
M LayoutTests/platform/ios/TestExpectations
A
LayoutTests/platform/win/compositing/geometry/bounds-with-filters-expected.txt
M LayoutTests/svg/filters/feMerge-nodes-unite-outsets-expected.html
M LayoutTests/svg/filters/feMerge-nodes-unite-outsets.html
M Source/WebCore/rendering/CSSFilterRenderer.cpp
M Source/WebCore/rendering/CSSFilterRenderer.h
M Source/WebCore/rendering/RenderBox.cpp
M Source/WebCore/rendering/RenderBox.h
M Source/WebCore/rendering/RenderImage.cpp
M Source/WebCore/rendering/RenderLayer.cpp
M Source/WebCore/rendering/RenderLayer.h
M Source/WebCore/style/StyleDifference.cpp
M Source/WebCore/style/values/filter-effects/StyleFilter.cpp
M Source/WebCore/style/values/filter-effects/StyleFilter.h
Log Message:
-----------
CSS style 'filter: drop-shadow...' does not render correctly without repaint.
https://bugs.webkit.org/show_bug.cgi?id=207586
rdar://59430460
Reviewed by Alan Baradlay.
Visual overflow needs to account for CSS filters that move pixels, like `blur()`
and `drop-shadow()` in order for repaint to work. Fix this by having
`RenderBox::applyVisualEffectOverflow()` extend visual overflow for filters,
taking writing mode into account. We also need to trigger layout when visual
overflow due to filter outset changes happen, which is done in
`RenderStyle::changeAffectsVisualOverflow()`; `blur-change.html` tests this.
Since `RenderStyle::filterOutsets()` cannot provide an answer for reference
filters,
remove it, and make `FilterOperations::outsets()` return a `std::optional` in
this case,
which callers need to handle. Filter outset computation now needs to bottleneck
through `RenderBox::computeFilterOutsets()`.
This change does not correctly repaint descendants of an element with a filter;
a change like https://github.com/WebKit/WebKit/pull/12797 will be required
to fix this.
This change does also not take into account reference filters, which is tracked
in webkit.org/b/237538.
RenderLayer bounds are now inflated for filters, which results in composited
layers
with composited filters getting inflated bounds; this was considered as a
reasonable
trade-off for the complexity of recomputing visual overflow ignoring filters.
*
LayoutTests/compositing/filters/sw-nested-shadow-overlaps-hw-nested-shadow-expected.txt:
* LayoutTests/compositing/geometry/bounds-with-filters-expected.txt: Added.
* LayoutTests/compositing/geometry/bounds-with-filters.html: Added.
* LayoutTests/css3/filters/drop-shadow-target-clipped.html:
* LayoutTests/fast/hidpi/filters-drop-shadow.html:
* LayoutTests/fast/repaint/blur-change-expected.txt: Added.
* LayoutTests/fast/repaint/blur-change.html: Added.
* LayoutTests/fast/repaint/drop-shadow-box-change-expected.txt: Added.
* LayoutTests/fast/repaint/drop-shadow-box-change.html: Added.
* LayoutTests/fast/repaint/drop-shadow-change-expected.txt: Added.
* LayoutTests/fast/repaint/drop-shadow-change.html: Added.
* LayoutTests/fast/repaint/drop-shadow-writing-modes-expected.txt: Added.
* LayoutTests/fast/repaint/drop-shadow-writing-modes.html: Added.
*
LayoutTests/imported/w3c/web-platform-tests/css/filter-effects/filters-drop-shadow-002.html:
* LayoutTests/platform/ios/TestExpectations: filters-drop-shadow-003.html is
failing on bots,
but passes for me locally in sim and on hardware.
*
LayoutTests/platform/win/compositing/geometry/bounds-with-filters-expected.txt:
Added.
* LayoutTests/svg/filters/feMerge-nodes-unite-outsets-expected.html:
* LayoutTests/svg/filters/feMerge-nodes-unite-outsets.html: This test just
seemed
to be wrong and failed after the repaint fix, so fix it.
* Source/WebCore/rendering/CSSFilterRenderer.cpp:
(WebCore::referenceFilterElement):
(WebCore::isIdentityReferenceFilter):
(WebCore::calculateReferenceFilterOutsets):
(WebCore::CSSFilterRenderer::isIdentity):
(WebCore::CSSFilterRenderer::calculateOutsets):
* Source/WebCore/rendering/CSSFilterRenderer.h:
* Source/WebCore/rendering/RenderBox.cpp:
(WebCore::RenderBox::computeFilterOutsets const):
(WebCore::RenderBox::addVisualEffectOverflow):
(WebCore::convertOutsetsToOverflowCoordinates): Templatized because filter
outsets are
RectEdges<int>.
(WebCore::RenderBox::applyVisualEffectOverflow const):
(WebCore::RenderBox::hasLayoutOverflow const):
* Source/WebCore/rendering/RenderBox.h:
(WebCore::RenderBox::applyVisualEffectOverflow):
* Source/WebCore/rendering/RenderImage.cpp:
(WebCore::RenderImage::repaintOrMarkForLayout):
* Source/WebCore/rendering/RenderLayer.cpp:
(WebCore::RenderLayer::calculateClipRects const):
* Source/WebCore/rendering/RenderLayer.h: hasAncestorWithFilterOutsets() can be
private.
* Source/WebCore/style/StyleDifference.cpp:
* Source/WebCore/style/values/filter-effects/StyleFilter.cpp:
(WebCore::Style::Filter::calculateOutsets const):
* Source/WebCore/style/values/filter-effects/StyleFilter.h:
Canonical link: https://commits.webkit.org/313382@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications