summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-10-14 12:38:02 +0200
committerAndreas Kling <kling@serenityos.org>2022-10-14 19:50:15 +0200
commitb062a0fb7cb44036d16a36269164c537b137c3a4 (patch)
tree91c22c8da1b9a6892aebb3683d84b8494c6e7b41 /Userland
parentc70801ddbc1815768c397e355aecf1e08d5a86fd (diff)
downloadserenity-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.cpp2
-rw-r--r--Userland/Libraries/LibWeb/Layout/TextNode.cpp14
-rw-r--r--Userland/Libraries/LibWeb/Layout/TextNode.h3
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;
};