diff options
author | Andreas Kling <kling@serenityos.org> | 2022-10-14 12:38:02 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-10-14 19:50:15 +0200 |
commit | b062a0fb7cb44036d16a36269164c537b137c3a4 (patch) | |
tree | 91c22c8da1b9a6892aebb3683d84b8494c6e7b41 /Userland | |
parent | c70801ddbc1815768c397e355aecf1e08d5a86fd (diff) | |
download | serenity-b062a0fb7cb44036d16a36269164c537b137c3a4.zip |
LibWeb: Make TextNode::ChunkIterator emit an empty chunk for content:""
This ensures that we create a line box for content:"", which would
otherwise get pruned by the empty line cleanup in IFC.
The empty line box is important in this case, since it gives us a
reference point for measuring the automatic height of the IFC's
containing block. By having an empty line, we can now correctly measure
the impact of vertical margins on a generated box with content:""
and allow them to contribute to the block height.
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp | 2 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Layout/TextNode.cpp | 14 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Layout/TextNode.h | 3 |
3 files changed, 16 insertions, 3 deletions
diff --git a/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp b/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp index 44def1b158..c879393b2d 100644 --- a/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp +++ b/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp @@ -264,7 +264,7 @@ void InlineLevelIterator::enter_text_node(Layout::TextNode const& text_node) .do_respect_linebreaks = do_respect_linebreaks, .is_first_chunk = true, .is_last_chunk = false, - .chunk_iterator = TextNode::ChunkIterator { text_node.text_for_rendering(), do_wrap_lines, do_respect_linebreaks }, + .chunk_iterator = TextNode::ChunkIterator { text_node.text_for_rendering(), do_wrap_lines, do_respect_linebreaks, text_node.is_generated() && text_node.text_for_rendering().is_empty() }, }; m_text_node_context->next_chunk = m_text_node_context->chunk_iterator.next(); } diff --git a/Userland/Libraries/LibWeb/Layout/TextNode.cpp b/Userland/Libraries/LibWeb/Layout/TextNode.cpp index f1ad910b88..bee02d93ad 100644 --- a/Userland/Libraries/LibWeb/Layout/TextNode.cpp +++ b/Userland/Libraries/LibWeb/Layout/TextNode.cpp @@ -85,9 +85,10 @@ void TextNode::compute_text_for_rendering(bool collapse) m_text_for_rendering = builder.to_string(); } -TextNode::ChunkIterator::ChunkIterator(StringView text, bool wrap_lines, bool respect_linebreaks) +TextNode::ChunkIterator::ChunkIterator(StringView text, bool wrap_lines, bool respect_linebreaks, bool is_generated_empty_string) : m_wrap_lines(wrap_lines) , m_respect_linebreaks(respect_linebreaks) + , m_should_emit_one_empty_chunk(is_generated_empty_string) , m_utf8_view(text) , m_iterator(m_utf8_view.begin()) { @@ -95,6 +96,17 @@ TextNode::ChunkIterator::ChunkIterator(StringView text, bool wrap_lines, bool re Optional<TextNode::Chunk> TextNode::ChunkIterator::next() { + if (m_should_emit_one_empty_chunk) { + m_should_emit_one_empty_chunk = false; + return Chunk { + .view = {}, + .start = 0, + .length = 0, + .has_breaking_newline = false, + .is_all_whitespace = false, + }; + } + if (m_iterator == m_utf8_view.end()) return {}; diff --git a/Userland/Libraries/LibWeb/Layout/TextNode.h b/Userland/Libraries/LibWeb/Layout/TextNode.h index 0d64f31417..128f80b893 100644 --- a/Userland/Libraries/LibWeb/Layout/TextNode.h +++ b/Userland/Libraries/LibWeb/Layout/TextNode.h @@ -33,7 +33,7 @@ public: class ChunkIterator { public: - ChunkIterator(StringView text, bool wrap_lines, bool respect_linebreaks); + ChunkIterator(StringView text, bool wrap_lines, bool respect_linebreaks, bool is_generated_empty_string); Optional<Chunk> next(); private: @@ -41,6 +41,7 @@ public: bool const m_wrap_lines; bool const m_respect_linebreaks; + bool m_should_emit_one_empty_chunk { false }; Utf8View m_utf8_view; Utf8View::Iterator m_iterator; }; |