Browse Source

LibWeb: Don't append collapsible whitespace to start of new line

After performing a required line break, and the next text chunk is
all collapsible whitespace, simply discard the whitespace.
Andreas Kling 3 years ago
parent
commit
d32630e17b

+ 4 - 1
Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp

@@ -257,7 +257,10 @@ void InlineFormattingContext::generate_line_boxes(LayoutMode layout_mode)
 
 
         case InlineLevelIterator::Item::Type::Text: {
         case InlineLevelIterator::Item::Type::Text: {
             auto& text_node = verify_cast<Layout::TextNode>(*item.node);
             auto& text_node = verify_cast<Layout::TextNode>(*item.node);
-            line_builder.break_if_needed(layout_mode, item.border_box_width(), item.should_force_break);
+            if (line_builder.break_if_needed(layout_mode, item.border_box_width(), item.should_force_break)) {
+                if (item.is_collapsible_whitespace)
+                    break;
+            }
             line_builder.append_text_chunk(
             line_builder.append_text_chunk(
                 text_node,
                 text_node,
                 item.offset_in_node,
                 item.offset_in_node,

+ 6 - 2
Userland/Libraries/LibWeb/Layout/LineBuilder.h

@@ -22,10 +22,14 @@ public:
     void append_box(Box const&, float leading_size, float trailing_size, float leading_margin, float trailing_margin);
     void append_box(Box const&, float leading_size, float trailing_size, float leading_margin, float trailing_margin);
     void append_text_chunk(TextNode const&, size_t offset_in_node, size_t length_in_node, float leading_size, float trailing_size, float leading_margin, float trailing_margin, float content_width, float content_height);
     void append_text_chunk(TextNode const&, size_t offset_in_node, size_t length_in_node, float leading_size, float trailing_size, float leading_margin, float trailing_margin, float content_width, float content_height);
 
 
-    void break_if_needed(LayoutMode layout_mode, float next_item_width, bool should_force_break)
+    // Returns whether a line break occurred.
+    bool 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))
+        if (should_break(layout_mode, next_item_width, should_force_break)) {
             break_line();
             break_line();
+            return true;
+        }
+        return false;
     }
     }
 
 
     float available_width_for_current_line() const { return m_available_width_for_current_line; }
     float available_width_for_current_line() const { return m_available_width_for_current_line; }