浏览代码

LibWeb: Make LineBuilder respect LayoutMode::OnlyRequiredLineBreaks

In this layout mode, we should only break when forced (e.g by an
explicit <br> tag.) This is used when determining intrinsic sizes.)
Andreas Kling 3 年之前
父节点
当前提交
251b2f49a2
共有 2 个文件被更改,包括 16 次插入6 次删除
  1. 9 5
      Userland/Libraries/LibWeb/Layout/LineBuilder.cpp
  2. 7 1
      Userland/Libraries/LibWeb/Layout/LineBuilder.h

+ 9 - 5
Userland/Libraries/LibWeb/Layout/LineBuilder.cpp

@@ -46,12 +46,16 @@ void LineBuilder::append_text_chunk(TextNode& text_node, size_t offset_in_node,
     m_max_height_on_current_line = max(m_max_height_on_current_line, height);
 }
 
-void LineBuilder::break_if_needed(LayoutMode layout_mode, float next_item_width, bool should_force_break)
+bool LineBuilder::should_break(LayoutMode layout_mode, float next_item_width, bool should_force_break)
 {
-    if (layout_mode == LayoutMode::AllPossibleLineBreaks
-        || should_force_break
-        || (m_context.containing_block().line_boxes().last().width() + next_item_width) > m_available_width_for_current_line)
-        break_line();
+    if (layout_mode == LayoutMode::AllPossibleLineBreaks)
+        return true;
+    if (should_force_break)
+        return true;
+    if (layout_mode == LayoutMode::OnlyRequiredLineBreaks)
+        return false;
+    auto current_line_width = m_context.containing_block().line_boxes().last().width();
+    return (current_line_width + next_item_width) > m_available_width_for_current_line;
 }
 
 void LineBuilder::update_last_line()

+ 7 - 1
Userland/Libraries/LibWeb/Layout/LineBuilder.h

@@ -23,13 +23,19 @@ public:
     void append_box(Box&);
     void append_text_chunk(TextNode&, size_t offset_in_node, size_t length_in_node, float width, float height);
 
-    void break_if_needed(LayoutMode, float next_item_width, bool should_force_break);
+    void break_if_needed(LayoutMode layout_mode, float next_item_width, bool should_force_break)
+    {
+        if (should_break(layout_mode, next_item_width, should_force_break))
+            break_line();
+    }
 
     float available_width_for_current_line() const { return m_available_width_for_current_line; }
 
     void update_last_line();
 
 private:
+    bool should_break(LayoutMode, float next_item_width, bool should_force_break);
+
     InlineFormattingContext& m_context;
     float m_available_width_for_current_line { 0 };
     float m_current_y { 0 };