LibWeb: Make hit-testing work with display: inline-block;

When hit testing encountered a block with inline children, we assumed
that the inline children are nothing but text boxes. An inline-block
box is actually a block child of a block with inline children, so we
have to handle that scenario as well. :^)

Fixes #2353.
This commit is contained in:
Andreas Kling 2020-05-23 21:06:24 +02:00
parent a01fd7ecc5
commit 634ce37663
Notes: sideshowbarker 2024-07-19 06:12:09 +09:00
3 changed files with 18 additions and 0 deletions

View file

@ -0,0 +1,15 @@
<html>
<head>
<style>
p {
display: inline-block;
}
</style>
</head>
<body>
<p>
Here is some test text.
Here is a <a href="http://example.com">test link</a>.
</p>
</body>
</html>

View file

@ -28,6 +28,7 @@ span#ua {
<p>Your user agent is: <b><span id="ua"></span></b></p>
<p>Some small test pages:</p>
<ul>
<li><a href="inline-block-link.html">link inside display: inline-block</a></li>
<li><a href="set-interval.html">setInterval() test</a></li>
<li><a href="html-escape-test.html">html character escape test</a></li>
<li><a href="location.html">window.location property</a></li>

View file

@ -391,6 +391,8 @@ HitTestResult LayoutBlock::hit_test(const Gfx::Point& position) const
for (auto& line_box : m_line_boxes) {
for (auto& fragment : line_box.fragments()) {
if (enclosing_int_rect(fragment.rect()).contains(position)) {
if (fragment.layout_node().is_block())
return to<LayoutBlock>(fragment.layout_node()).hit_test(position);
return { fragment.layout_node(), fragment.text_index_at(position.x()) };
}
}