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

Reply via email to