diff --git a/Tests/LibWeb/Text/expected/hit_testing/click-outside-of-box-with-hidden-overflow.txt b/Tests/LibWeb/Text/expected/hit_testing/click-outside-of-box-with-hidden-overflow.txt new file mode 100644 index 0000000000..3c9ea0b9a1 --- /dev/null +++ b/Tests/LibWeb/Text/expected/hit_testing/click-outside-of-box-with-hidden-overflow.txt @@ -0,0 +1 @@ + diff --git a/Tests/LibWeb/Text/expected/hit_testing/click-outside-of-box-with-lines-and-hidden-overflow.txt b/Tests/LibWeb/Text/expected/hit_testing/click-outside-of-box-with-lines-and-hidden-overflow.txt new file mode 100644 index 0000000000..5fb4ab5246 --- /dev/null +++ b/Tests/LibWeb/Text/expected/hit_testing/click-outside-of-box-with-lines-and-hidden-overflow.txt @@ -0,0 +1 @@ + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse accumsan semper massa ut pharetra. Nunc vitae lorem at odio facilisis vehicula nec ut nibh. Duis ornare nibh orci, nec mollis est mollis ac. Aenean ultricies condimentum interdum. In eu elit vestibulum, sollicitudin lectus vel, congue nibh. Morbi vitae nunc in tortor ultrices aliquet sit amet a turpis. Phasellus ut dui sodales, dictum sem ut, efficitur tellus. Etiam eu orci et magna suscipit dignissim nec et sem. Aenean quam erat, euismod eu faucibus et, placerat ut dolor. diff --git a/Tests/LibWeb/Text/input/hit_testing/click-outside-of-box-with-hidden-overflow.html b/Tests/LibWeb/Text/input/hit_testing/click-outside-of-box-with-hidden-overflow.html new file mode 100644 index 0000000000..cc2b4369ad --- /dev/null +++ b/Tests/LibWeb/Text/input/hit_testing/click-outside-of-box-with-hidden-overflow.html @@ -0,0 +1,23 @@ + + +
+
+
+ diff --git a/Tests/LibWeb/Text/input/hit_testing/click-outside-of-box-with-lines-and-hidden-overflow.html b/Tests/LibWeb/Text/input/hit_testing/click-outside-of-box-with-lines-and-hidden-overflow.html new file mode 100644 index 0000000000..b9e3909c81 --- /dev/null +++ b/Tests/LibWeb/Text/input/hit_testing/click-outside-of-box-with-lines-and-hidden-overflow.html @@ -0,0 +1,29 @@ + + +
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse accumsan semper massa + ut pharetra. Nunc vitae lorem at odio facilisis vehicula nec ut nibh. Duis ornare nibh orci, + nec mollis est mollis ac. Aenean ultricies condimentum interdum. In eu elit vestibulum, + sollicitudin lectus vel, congue nibh. Morbi vitae nunc in tortor ultrices aliquet sit amet a + turpis. Phasellus ut dui sodales, dictum sem ut, efficitur tellus. Etiam eu orci et magna + suscipit dignissim nec et sem. Aenean quam erat, euismod eu faucibus et, placerat ut dolor. +
+
+ diff --git a/Userland/Libraries/LibWeb/Painting/InlinePaintable.cpp b/Userland/Libraries/LibWeb/Painting/InlinePaintable.cpp index 1f24507aae..e8c8d81bb1 100644 --- a/Userland/Libraries/LibWeb/Painting/InlinePaintable.cpp +++ b/Userland/Libraries/LibWeb/Painting/InlinePaintable.cpp @@ -182,6 +182,9 @@ void InlinePaintable::for_each_fragment(Callback callback) const Optional InlinePaintable::hit_test(CSSPixelPoint position, HitTestType type) const { + if (m_clip_rect.has_value() && !m_clip_rect.value().contains(position)) + return {}; + auto position_adjusted_by_scroll_offset = position; if (m_enclosing_scroll_frame_offset.has_value()) position_adjusted_by_scroll_offset.translate_by(-m_enclosing_scroll_frame_offset.value()); diff --git a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp index 9f7213389e..d9c31dac82 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp @@ -676,6 +676,9 @@ Layout::BlockContainer& PaintableWithLines::layout_box() Optional PaintableBox::hit_test(CSSPixelPoint position, HitTestType type) const { + if (clip_rect().has_value() && !clip_rect()->contains(position)) + return {}; + auto position_adjusted_by_scroll_offset = position; if (enclosing_scroll_frame_offset().has_value()) position_adjusted_by_scroll_offset.translate_by(-enclosing_scroll_frame_offset().value()); @@ -712,6 +715,9 @@ Optional PaintableBox::hit_test(CSSPixelPoint position, HitTestTy Optional PaintableWithLines::hit_test(CSSPixelPoint position, HitTestType type) const { + if (clip_rect().has_value() && !clip_rect()->contains(position)) + return {}; + auto position_adjusted_by_scroll_offset = position; if (enclosing_scroll_frame_offset().has_value()) position_adjusted_by_scroll_offset.translate_by(-enclosing_scroll_frame_offset().value()); diff --git a/Userland/Libraries/LibWeb/Painting/PaintableBox.h b/Userland/Libraries/LibWeb/Painting/PaintableBox.h index b9dc4b2cb9..8c9ab16e84 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintableBox.h +++ b/Userland/Libraries/LibWeb/Painting/PaintableBox.h @@ -210,6 +210,7 @@ protected: virtual CSSPixelRect compute_absolute_paint_rect() const; Optional enclosing_scroll_frame_offset() const { return m_enclosing_scroll_frame_offset; } + Optional clip_rect() const { return m_clip_rect; } private: [[nodiscard]] virtual bool is_paintable_box() const final { return true; } diff --git a/Userland/Libraries/LibWeb/Painting/StackingContext.cpp b/Userland/Libraries/LibWeb/Painting/StackingContext.cpp index 005db43616..ca26d63aae 100644 --- a/Userland/Libraries/LibWeb/Painting/StackingContext.cpp +++ b/Userland/Libraries/LibWeb/Painting/StackingContext.cpp @@ -372,14 +372,6 @@ Optional StackingContext::hit_test(CSSPixelPoint position, HitTes transformed_position.translate_by(-scroll_offset); } - // FIXME: Support more overflow variations. - if (paintable().computed_values().overflow_x() == CSS::Overflow::Hidden && paintable().computed_values().overflow_y() == CSS::Overflow::Hidden) { - if (paintable().is_paintable_box()) { - if (!paintable_box().absolute_border_box_rect().contains(transformed_position.x(), transformed_position.y())) - return {}; - } - } - // NOTE: Hit testing basically happens in reverse painting order. // https://www.w3.org/TR/CSS22/visuren.html#z-index @@ -402,12 +394,6 @@ Optional StackingContext::hit_test(CSSPixelPoint position, HitTes auto const& paintable_box = verify_cast(paintable); - // FIXME: Support more overflow variations. - if (paintable_box.computed_values().overflow_x() == CSS::Overflow::Hidden && paintable_box.computed_values().overflow_y() == CSS::Overflow::Hidden) { - if (!paintable_box.absolute_border_box_rect().contains(transformed_position.x(), transformed_position.y())) - return TraversalDecision::SkipChildrenAndContinue; - } - auto const& z_index = paintable_box.computed_values().z_index(); if (z_index.value_or(0) == 0 && paintable_box.is_positioned() && !paintable_box.stacking_context()) { auto candidate = paintable_box.hit_test(transformed_position, type); @@ -445,13 +431,6 @@ Optional StackingContext::hit_test(CSSPixelPoint position, HitTes return TraversalDecision::Continue; auto const& paintable_box = verify_cast(paintable); - - // FIXME: Support more overflow variations. - if (paintable_box.computed_values().overflow_x() == CSS::Overflow::Hidden && paintable_box.computed_values().overflow_y() == CSS::Overflow::Hidden) { - if (!paintable_box.absolute_border_box_rect().contains(transformed_position.x(), transformed_position.y())) - return TraversalDecision::SkipChildrenAndContinue; - } - if (paintable_box.is_floating()) { if (auto candidate = paintable_box.hit_test(transformed_position, type); candidate.has_value()) { result = move(candidate); @@ -470,13 +449,6 @@ Optional StackingContext::hit_test(CSSPixelPoint position, HitTes return TraversalDecision::Continue; auto const& paintable_box = verify_cast(paintable); - - // FIXME: Support more overflow variations. - if (paintable_box.computed_values().overflow_x() == CSS::Overflow::Hidden && paintable_box.computed_values().overflow_y() == CSS::Overflow::Hidden) { - if (!paintable_box.absolute_border_box_rect().contains(transformed_position.x(), transformed_position.y())) - return TraversalDecision::SkipChildrenAndContinue; - } - if (!paintable_box.is_absolutely_positioned() && !paintable_box.is_floating()) { if (auto candidate = paintable_box.hit_test(transformed_position, type); candidate.has_value()) { result = move(candidate);