LibHTML: Fix broken line splitting behavior in LayoutReplaced

Replaced elements will now properly create line breaks when they use up
the available horizontal space.

This fixes an issue with <img>'s lining up instead of breaking.
This commit is contained in:
Andreas Kling 2019-10-13 17:24:00 +02:00
parent 282456dc37
commit 44979ad7a5
Notes: sideshowbarker 2024-07-19 11:42:09 +09:00
4 changed files with 23 additions and 3 deletions

View File

@ -244,3 +244,16 @@ NonnullRefPtr<StyleProperties> LayoutBlock::style_for_anonymous_block() const
return new_style;
}
LineBox& LayoutBlock::ensure_last_line_box()
{
if (m_line_boxes.is_empty())
m_line_boxes.append(LineBox());
return m_line_boxes.last();
}
LineBox& LayoutBlock::add_line_box()
{
m_line_boxes.append(LineBox());
return m_line_boxes.last();
}

View File

@ -22,6 +22,9 @@ public:
Vector<LineBox>& line_boxes() { return m_line_boxes; }
const Vector<LineBox>& line_boxes() const { return m_line_boxes; }
LineBox& ensure_last_line_box();
LineBox& add_line_box();
virtual HitTestResult hit_test(const Point&) const override;
private:

View File

@ -28,6 +28,9 @@ public:
Rect& rect() { return m_rect; }
void set_rect(const Rect& rect) { m_rect = rect; }
int width() const { return rect().width(); }
int height() const { return rect().height(); }
BoxModelMetrics& box_model() { return m_box_metrics; }
const BoxModelMetrics& box_model() const { return m_box_metrics; }

View File

@ -17,7 +17,8 @@ void LayoutReplaced::split_into_lines(LayoutBlock& container)
{
layout();
if (container.line_boxes().is_empty())
container.line_boxes().append(LineBox());
container.line_boxes().last().add_fragment(*this, 0, 0, rect().width(), rect().height());
auto* line_box = &container.ensure_last_line_box();
if (line_box->width() + width() > container.width())
line_box = &container.add_line_box();
line_box->add_fragment(*this, 0, 0, width(), height());
}