From 522aa41667b55282da2b399fd952e2ac18a0cff8 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Sat, 25 Jan 2025 22:41:21 +0100 Subject: [PATCH] LibWeb: Honor `pointer-events` for PaintableBox in own stacking context If a block element with its own stacking context has `pointer-events: none` set, it should be ignored as far as hit-testing goes. Fixes #3357. --- Libraries/LibWeb/Painting/StackingContext.cpp | 9 ++++----- .../LibWeb/Text/expected/hit_testing/pointer-events.txt | 3 +++ Tests/LibWeb/Text/input/hit_testing/pointer-events.html | 5 +++++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Libraries/LibWeb/Painting/StackingContext.cpp b/Libraries/LibWeb/Painting/StackingContext.cpp index 3075bad7576..56dec20390b 100644 --- a/Libraries/LibWeb/Painting/StackingContext.cpp +++ b/Libraries/LibWeb/Painting/StackingContext.cpp @@ -443,13 +443,12 @@ TraversalDecision StackingContext::hit_test(CSSPixelPoint position, HitTestType CSSPixelPoint enclosing_scroll_offset = paintable_box().cumulative_offset_of_enclosing_scroll_frame(); - auto position_adjusted_by_scroll_offset = transformed_position; - position_adjusted_by_scroll_offset.translate_by(-enclosing_scroll_offset); + auto position_adjusted_by_scroll_offset = transformed_position.translated(-enclosing_scroll_offset); // 1. the background and borders of the element forming the stacking context. - if (paintable_box().absolute_border_box_rect().contains(position_adjusted_by_scroll_offset.x(), position_adjusted_by_scroll_offset.y())) { - auto hit_test_result = HitTestResult { .paintable = const_cast(paintable_box()) }; - if (callback(hit_test_result) == TraversalDecision::Break) + if (paintable_box().visible_for_hit_testing() + && paintable_box().absolute_border_box_rect().contains(position_adjusted_by_scroll_offset)) { + if (callback({ const_cast(paintable_box()) }) == TraversalDecision::Break) return TraversalDecision::Break; } diff --git a/Tests/LibWeb/Text/expected/hit_testing/pointer-events.txt b/Tests/LibWeb/Text/expected/hit_testing/pointer-events.txt index 8da3817c29a..519d4a62eda 100644 --- a/Tests/LibWeb/Text/expected/hit_testing/pointer-events.txt +++ b/Tests/LibWeb/Text/expected/hit_testing/pointer-events.txt @@ -10,3 +10,6 @@ --- +
+ +--- \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/hit_testing/pointer-events.html b/Tests/LibWeb/Text/input/hit_testing/pointer-events.html index ee567380e47..47cb82a2310 100644 --- a/Tests/LibWeb/Text/input/hit_testing/pointer-events.html +++ b/Tests/LibWeb/Text/input/hit_testing/pointer-events.html @@ -19,6 +19,10 @@ foo
bar
bazlorem
+ + +
+