1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 06:07:44 +00:00

LibWeb: Fix whitespace getting trimmed incorrectly

Whitespace at the end of line should only be trimmed when
'white-space' is set to 'normal', 'nowrap', or 'pre-line'.
This commit is contained in:
Sebastian Zaha 2023-07-16 14:10:47 +02:00 committed by Andreas Kling
parent ce4b09dfd1
commit 92b56ded02
3 changed files with 41 additions and 13 deletions

View file

@ -33,27 +33,39 @@ void LineBox::add_fragment(Node const& layout_node, int start, int length, CSSPi
void LineBox::trim_trailing_whitespace()
{
while (!m_fragments.is_empty() && m_fragments.last().is_justifiable_whitespace()) {
auto fragment = m_fragments.take_last();
m_width -= fragment.width();
auto should_trim = [](LineBoxFragment* fragment) {
auto ws = fragment->layout_node().computed_values().white_space();
return ws == CSS::WhiteSpace::Normal || ws == CSS::WhiteSpace::Nowrap || ws == CSS::WhiteSpace::PreLine;
};
LineBoxFragment* last_fragment = nullptr;
for (;;) {
if (m_fragments.is_empty())
return;
// last_fragment cannot be null from here on down, as m_fragments is not empty.
last_fragment = &m_fragments.last();
if (!should_trim(last_fragment))
return;
if (last_fragment->is_justifiable_whitespace()) {
m_width -= last_fragment->width();
m_fragments.remove(m_fragments.size() - 1);
} else {
break;
}
}
if (m_fragments.is_empty())
return;
auto& last_fragment = m_fragments.last();
auto last_text = last_fragment.text();
auto last_text = last_fragment->text();
if (last_text.is_null())
return;
while (last_fragment.length()) {
auto last_character = last_text[last_fragment.length() - 1];
while (last_fragment->length()) {
auto last_character = last_text[last_fragment->length() - 1];
if (!is_ascii_space(last_character))
break;
int last_character_width = last_fragment.layout_node().font().glyph_width(last_character);
last_fragment.m_length -= 1;
last_fragment.set_width(last_fragment.width() - last_character_width);
int last_character_width = last_fragment->layout_node().font().glyph_width(last_character);
last_fragment->m_length -= 1;
last_fragment->set_width(last_fragment->width() - last_character_width);
m_width -= last_character_width;
}
}