diff --git a/Tests/LibWeb/Text/expected/hit_testing/stacking-context-inside-scrollable-box.txt b/Tests/LibWeb/Text/expected/hit_testing/stacking-context-inside-scrollable-box.txt new file mode 100644 index 00000000000..9bb8176bf74 --- /dev/null +++ b/Tests/LibWeb/Text/expected/hit_testing/stacking-context-inside-scrollable-box.txt @@ -0,0 +1 @@ + Establishes a stacking context.
diff --git a/Tests/LibWeb/Text/input/hit_testing/stacking-context-inside-scrollable-box.html b/Tests/LibWeb/Text/input/hit_testing/stacking-context-inside-scrollable-box.html new file mode 100644 index 00000000000..4515d89557b --- /dev/null +++ b/Tests/LibWeb/Text/input/hit_testing/stacking-context-inside-scrollable-box.html @@ -0,0 +1,32 @@ + + + +
+
+

Establishes a stacking context.

+
+
+
+ diff --git a/Userland/Libraries/LibWeb/Painting/StackingContext.cpp b/Userland/Libraries/LibWeb/Painting/StackingContext.cpp index 016722619ea..ae8ac88a0ef 100644 --- a/Userland/Libraries/LibWeb/Painting/StackingContext.cpp +++ b/Userland/Libraries/LibWeb/Painting/StackingContext.cpp @@ -415,9 +415,21 @@ TraversalDecision StackingContext::hit_test(CSSPixelPoint position, HitTestType return TraversalDecision::Break; } + CSSPixelPoint enclosing_scroll_offset; + if (is(paintable())) { + auto const& paintable_box = static_cast(paintable()); + enclosing_scroll_offset = paintable_box.enclosing_scroll_frame_offset(); + } else if (is(paintable())) { + auto const& inline_paintable = static_cast(paintable()); + enclosing_scroll_offset = inline_paintable.enclosing_scroll_frame_offset(); + } + + auto position_adjusted_by_scroll_offset = transformed_position; + position_adjusted_by_scroll_offset.translate_by(-enclosing_scroll_offset); + // 1. the background and borders of the element forming the stacking context. if (paintable().is_paintable_box()) { - if (paintable_box().absolute_border_box_rect().contains(transformed_position.x(), transformed_position.y())) { + 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) return TraversalDecision::Break;