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);