mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-12-07 21:59:54 +00:00
LibWeb: Apply own clip rect for background phase only when clip used
Fixes a bug where we would clip `box-shadow` when `overflow: hidden` was set, which is not supposed to happen since `overflow` only affects clipping of an element's content.
This commit is contained in:
parent
e816a92dfe
commit
597fe8288c
Notes:
github-actions[bot]
2025-11-19 17:19:01 +00:00
Author: https://github.com/kalenikaliaksandr
Commit: 597fe8288c
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/6865
Reviewed-by: https://github.com/gmta ✅
10 changed files with 48 additions and 6 deletions
|
|
@ -26,6 +26,8 @@ struct WEB_API ClipFrame : public AtomicRefCounted<ClipFrame> {
|
|||
|
||||
CSSPixelRect clip_rect_for_hit_testing() const;
|
||||
|
||||
bool includes_rect_from_clip_property { false };
|
||||
|
||||
private:
|
||||
Vector<ClipRectWithScrollFrame> m_clip_rects;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -332,11 +332,20 @@ void PaintableBox::before_paint(DisplayListRecordingContext& context, PaintPhase
|
|||
if (!is_visible())
|
||||
return;
|
||||
|
||||
if (first_is_one_of(phase, PaintPhase::Background, PaintPhase::Foreground) && own_clip_frame()) {
|
||||
context.display_list_recorder().push_clip_frame(own_clip_frame());
|
||||
auto const& own_clip_frame = this->own_clip_frame();
|
||||
bool apply_own_clip_frame = [&] {
|
||||
if (phase == PaintPhase::Background)
|
||||
return own_clip_frame && own_clip_frame->includes_rect_from_clip_property;
|
||||
if (phase == PaintPhase::Foreground)
|
||||
return !own_clip_frame.is_null();
|
||||
return false;
|
||||
}();
|
||||
if (apply_own_clip_frame) {
|
||||
context.display_list_recorder().push_clip_frame(own_clip_frame);
|
||||
} else if (!has_css_transform()) {
|
||||
apply_clip_overflow_rect(context, phase);
|
||||
}
|
||||
|
||||
apply_scroll_offset(context);
|
||||
}
|
||||
|
||||
|
|
@ -346,7 +355,16 @@ void PaintableBox::after_paint(DisplayListRecordingContext& context, PaintPhase
|
|||
return;
|
||||
|
||||
reset_scroll_offset(context);
|
||||
if (first_is_one_of(phase, PaintPhase::Background, PaintPhase::Foreground) && own_clip_frame()) {
|
||||
|
||||
auto const& own_clip_frame = this->own_clip_frame();
|
||||
bool reset_own_clip_frame = [&] {
|
||||
if (phase == PaintPhase::Background)
|
||||
return own_clip_frame && own_clip_frame->includes_rect_from_clip_property;
|
||||
if (phase == PaintPhase::Foreground)
|
||||
return !own_clip_frame.is_null();
|
||||
return false;
|
||||
}();
|
||||
if (reset_own_clip_frame) {
|
||||
context.display_list_recorder().pop_clip_frame();
|
||||
} else if (!has_css_transform()) {
|
||||
clear_clip_overflow_rect(context, phase);
|
||||
|
|
|
|||
|
|
@ -167,6 +167,7 @@ void ViewportPaintable::assign_clip_frames()
|
|||
|
||||
auto clip_rect = block_paintable_box.overflow_clip_edge_rect();
|
||||
if (block_paintable_box.get_clip_rect().has_value()) {
|
||||
clip_frame.includes_rect_from_clip_property = true;
|
||||
clip_rect.intersect(block_paintable_box.get_clip_rect().value());
|
||||
clip_x = true;
|
||||
clip_y = true;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="match" href="../expected/box-shadow-with-overflow-hidden-ref.html" />
|
||||
<!DOCTYPE html><style>
|
||||
.box {
|
||||
background-color: black;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
box-shadow: 12px 12px 2px 1px red;
|
||||
}
|
||||
</style><div class="box"></div>
|
||||
11
Tests/LibWeb/Ref/input/box-shadow-with-overflow-hidden.html
Normal file
11
Tests/LibWeb/Ref/input/box-shadow-with-overflow-hidden.html
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="match" href="../expected/box-shadow-with-overflow-hidden-ref.html" />
|
||||
<!DOCTYPE html><style>
|
||||
.box {
|
||||
overflow: clip;
|
||||
background-color: black;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
box-shadow: 12px 12px 2px 1px red;
|
||||
}
|
||||
</style><div class="box"></div>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 22 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 7.9 KiB |
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="match" href="../expected/color-scheme-ref.html" />
|
||||
<meta name="fuzzy" content="maxDifference=0-3;totalPixels=0-4638">
|
||||
<meta name="fuzzy" content="maxDifference=0-3;totalPixels=0-4660">
|
||||
<style>
|
||||
body>div>div {
|
||||
padding: 1em;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
<meta charset="UTF-8" />
|
||||
<title>CSS Background Tests</title>
|
||||
<link rel="match" href="../expected/css-backgrounds-ref.html" />
|
||||
<meta name="fuzzy" content="maxDifference=0-21;totalPixels=0-72032">
|
||||
<meta name="fuzzy" content="maxDifference=0-21;totalPixels=0-72122">
|
||||
<style>
|
||||
.box {
|
||||
width: 180px;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="match" href="../expected/nested-boxes-with-hidden-overflow-and-border-radius-ref.html" />
|
||||
<meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-153">
|
||||
<meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-301">
|
||||
<style>
|
||||
.outer {
|
||||
overflow: hidden;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue