From 9f39ad89293ac2140e3605080426cd998fca3d94 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 21 Jan 2022 14:15:10 +0100 Subject: [PATCH] LibWeb: Ignore some collapsible whitespace when building lines When collapsing whitespace, we can skip over all-whitespace chunks at the start of each line, and immediately following fragments that themselves end in whitespace. --- Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp | 4 ++++ Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp | 1 + Userland/Libraries/LibWeb/Layout/InlineLevelIterator.h | 1 + 3 files changed, 6 insertions(+) diff --git a/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp index 27ca5447aa2..0e16fa1f214 100644 --- a/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp @@ -168,6 +168,10 @@ void InlineFormattingContext::generate_line_boxes(LayoutMode layout_mode) break; auto& item = item_opt.value(); + // Ignore collapsible whitespace chunks at the start of line, and if the last fragment already ends in whitespace. + if (item.is_collapsible_whitespace && containing_block().line_boxes().last().is_empty_or_ends_in_whitespace()) + continue; + switch (item.type) { case InlineLevelIterator::Item::Type::ForcedBreak: line_builder.break_line(); diff --git a/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp b/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp index 192fb3431ea..266c9a24610 100644 --- a/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp +++ b/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp @@ -64,6 +64,7 @@ Optional InlineLevelIterator::next(float available_wi .length_in_node = chunk.length, .width = chunk_width, .should_force_break = m_text_node_context->do_respect_linebreaks && chunk.has_breaking_newline, + .is_collapsible_whitespace = m_text_node_context->do_collapse && chunk.is_all_whitespace, }; return item; diff --git a/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.h b/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.h index d605f53bc71..a3fee1c3b10 100644 --- a/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.h +++ b/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.h @@ -32,6 +32,7 @@ public: size_t length_in_node { 0 }; float width { 0.0f }; bool should_force_break { false }; + bool is_collapsible_whitespace { false }; }; explicit InlineLevelIterator(Layout::Box& container, LayoutMode layout_mode)