Skip to content

Commit

Permalink
LibWeb: Always check paintable boxes children during hit-testing
Browse files Browse the repository at this point in the history
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 #23219
  • Loading branch information
kalenikaliaksandr authored and awesomekling committed Mar 5, 2024
1 parent c1dbde7 commit 16f33aa
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Run Clicked!
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
here be bugsyou can't see me toggle open
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<!DOCTYPE html><style>
body {
margin: 0;
}

* {
border: 1px solid black;
}

nav {
position: absolute;
height: 600px;
}

nav > div {
height: 100%;
}
</style><nav><div></div><button id="btn">Run</button></nav>
<script src="../include.js"></script>
<script>
asyncTest(done => {
btn.onclick = () => {
println("Clicked!");
done();
};
internals.click(20, 615);
});
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<style>
body {
margin: 0;
}
</style>
<details id="details"><summary><span>here be bugs</span></summary><span>you can't see me</span></details>
<script src="../include.js"></script>
<script>
asyncTest(done => {
details.ontoggle = (event) => {
println(`toggle ${event.newState}`);
done();
};
internals.click(5, 5);
});
</script>
6 changes: 3 additions & 3 deletions Userland/Libraries/LibWeb/Painting/PaintableBox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;

Expand Down

0 comments on commit 16f33aa

Please sign in to comment.