瀏覽代碼

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.
Andreas Kling 5 年之前
父節點
當前提交
44979ad7a5

+ 13 - 0
Libraries/LibHTML/Layout/LayoutBlock.cpp

@@ -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();
+}

+ 3 - 0
Libraries/LibHTML/Layout/LayoutBlock.h

@@ -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:

+ 3 - 0
Libraries/LibHTML/Layout/LayoutNode.h

@@ -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; }
 

+ 4 - 3
Libraries/LibHTML/Layout/LayoutReplaced.cpp

@@ -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());
 }