From 16f33aafdab9818d3c2a27143743e248518d7bc3 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Tue, 5 Mar 2024 13:46:03 +0100 Subject: [PATCH] LibWeb: Always check paintable boxes children during hit-testing Children of a paintable box are not guaranteed to be contained within its border box. Therefore, during hit-testing, we must always check them. Fixes https://github.com/SerenityOS/serenity/issues/23219 --- ...of-abspos-containing-block-border-rect.txt | 1 + .../open-details-by-clicking-on-triangle.txt | 1 + ...f-abspos-containing-block-border-rect.html | 28 +++++++++++++++++++ .../open-details-by-clicking-on-triangle.html | 16 +++++++++++ .../LibWeb/Painting/PaintableBox.cpp | 6 ++-- 5 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/hit_testing/box-outside-of-abspos-containing-block-border-rect.txt create mode 100644 Tests/LibWeb/Text/expected/hit_testing/open-details-by-clicking-on-triangle.txt create mode 100644 Tests/LibWeb/Text/input/hit_testing/box-outside-of-abspos-containing-block-border-rect.html create mode 100644 Tests/LibWeb/Text/input/hit_testing/open-details-by-clicking-on-triangle.html diff --git a/Tests/LibWeb/Text/expected/hit_testing/box-outside-of-abspos-containing-block-border-rect.txt b/Tests/LibWeb/Text/expected/hit_testing/box-outside-of-abspos-containing-block-border-rect.txt new file mode 100644 index 0000000000..e80c100df8 --- /dev/null +++ b/Tests/LibWeb/Text/expected/hit_testing/box-outside-of-abspos-containing-block-border-rect.txt @@ -0,0 +1 @@ +Run Clicked! diff --git a/Tests/LibWeb/Text/expected/hit_testing/open-details-by-clicking-on-triangle.txt b/Tests/LibWeb/Text/expected/hit_testing/open-details-by-clicking-on-triangle.txt new file mode 100644 index 0000000000..a602eabb63 --- /dev/null +++ b/Tests/LibWeb/Text/expected/hit_testing/open-details-by-clicking-on-triangle.txt @@ -0,0 +1 @@ +here be bugsyou can't see me toggle open diff --git a/Tests/LibWeb/Text/input/hit_testing/box-outside-of-abspos-containing-block-border-rect.html b/Tests/LibWeb/Text/input/hit_testing/box-outside-of-abspos-containing-block-border-rect.html new file mode 100644 index 0000000000..155d0b31f7 --- /dev/null +++ b/Tests/LibWeb/Text/input/hit_testing/box-outside-of-abspos-containing-block-border-rect.html @@ -0,0 +1,28 @@ + + + diff --git a/Tests/LibWeb/Text/input/hit_testing/open-details-by-clicking-on-triangle.html b/Tests/LibWeb/Text/input/hit_testing/open-details-by-clicking-on-triangle.html new file mode 100644 index 0000000000..67ca58d7aa --- /dev/null +++ b/Tests/LibWeb/Text/input/hit_testing/open-details-by-clicking-on-triangle.html @@ -0,0 +1,16 @@ + +
here be bugsyou can't see me
+ + diff --git a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp index ca5436aafe..1241e83973 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp @@ -861,9 +861,6 @@ TraversalDecision PaintableBox::hit_test(CSSPixelPoint position, HitTestType typ return stacking_context()->hit_test(position, type, callback); } - if (!absolute_border_box_rect().contains(position_adjusted_by_scroll_offset.x(), position_adjusted_by_scroll_offset.y())) - return TraversalDecision::Continue; - for (auto const* child = last_child(); child; child = child->previous_sibling()) { auto z_index = child->computed_values().z_index(); if (child->layout_node().is_positioned() && z_index.value_or(0) == 0) @@ -872,6 +869,9 @@ TraversalDecision PaintableBox::hit_test(CSSPixelPoint position, HitTestType typ return TraversalDecision::Break; } + if (!absolute_border_box_rect().contains(position_adjusted_by_scroll_offset.x(), position_adjusted_by_scroll_offset.y())) + return TraversalDecision::Continue; + if (!visible_for_hit_testing()) return TraversalDecision::Continue;