From 054b4dace0477c7affd60ef51c3193a0f23c0e79 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Fri, 29 Aug 2025 00:44:48 +0200 Subject: [PATCH] LibWeb: Hit test StackingContext's children before testing visibility If a node that establishes a StackingContext has `pointer-events: none`, hit testing should first proceed with hit testing the SC's children before deciding to bail. We were checking for `pointer-events` too early, causing large parts of certain websites to be noninteractive. Fixes #6017. --- Libraries/LibWeb/Painting/StackingContext.cpp | 6 +++--- .../expected/hit_testing/pointer-events.txt | 3 +++ .../input/hit_testing/pointer-events.html | 21 ++++++++++++------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Libraries/LibWeb/Painting/StackingContext.cpp b/Libraries/LibWeb/Painting/StackingContext.cpp index 9e4ced1132e..6db34e455f3 100644 --- a/Libraries/LibWeb/Painting/StackingContext.cpp +++ b/Libraries/LibWeb/Painting/StackingContext.cpp @@ -384,9 +384,6 @@ void StackingContext::paint(DisplayListRecordingContext& context) const TraversalDecision StackingContext::hit_test(CSSPixelPoint position, HitTestType type, Function const& callback) const { - if (!paintable_box().visible_for_hit_testing()) - return TraversalDecision::Continue; - auto const inverse_transform = affine_transform_matrix().inverse().value_or({}); auto const transform_origin = paintable_box().transform_origin(); // NOTE: This CSSPixels -> Float -> CSSPixels conversion is because we can't AffineTransform::map() a CSSPixelPoint. @@ -455,6 +452,9 @@ TraversalDecision StackingContext::hit_test(CSSPixelPoint position, HitTestType return TraversalDecision::Break; } + if (!paintable_box().visible_for_hit_testing()) + return TraversalDecision::Continue; + auto const enclosing_scroll_offset = paintable_box().cumulative_offset_of_enclosing_scroll_frame(); auto const raw_position_adjusted_by_scroll_offset = position.translated(-enclosing_scroll_offset); // NOTE: This CSSPixels -> Float -> CSSPixels conversion is because we can't AffineTransform::map() a CSSPixelPoint. diff --git a/Tests/LibWeb/Text/expected/hit_testing/pointer-events.txt b/Tests/LibWeb/Text/expected/hit_testing/pointer-events.txt index bacae1a1565..fd0ae41da4f 100644 --- a/Tests/LibWeb/Text/expected/hit_testing/pointer-events.txt +++ b/Tests/LibWeb/Text/expected/hit_testing/pointer-events.txt @@ -16,3 +16,6 @@ --- +<#text> + +--- diff --git a/Tests/LibWeb/Text/input/hit_testing/pointer-events.html b/Tests/LibWeb/Text/input/hit_testing/pointer-events.html index a57a322052b..5916450b5f7 100644 --- a/Tests/LibWeb/Text/input/hit_testing/pointer-events.html +++ b/Tests/LibWeb/Text/input/hit_testing/pointer-events.html @@ -27,21 +27,26 @@ + + +