LibWeb: Don't prune whitespace nodes from layout tree

Various whitespace-related issues have been fixed, and support for the
different CSS white-space values is improved enough that I think we can
stop doing the hack where we just prune whitespace nodes from the tree
and actually let them show up.

This is a nice step forward for correctness with the slight downside of
cluttering up layout tree dumps with tons of whitespace text nodes.
But hey, that's the web we know & love. :^)

Fixes #4427.
This commit is contained in:
Andreas Kling 2021-01-06 14:48:54 +01:00
parent 29a4da30b7
commit 612827eff3
Notes: sideshowbarker 2024-07-19 00:04:28 +09:00
3 changed files with 0 additions and 24 deletions

View file

@ -57,21 +57,6 @@ static bool is_all_whitespace(const StringView& string)
return true;
}
const String& TextNode::text_for_style(const CSS::StyleProperties& style) const
{
static String one_space = " ";
if (is_all_whitespace(dom_node().data())) {
switch (style.white_space().value_or(CSS::WhiteSpace::Normal)) {
case CSS::WhiteSpace::Pre:
case CSS::WhiteSpace::PreWrap:
break;
default:
return one_space;
}
}
return dom_node().data();
}
void TextNode::paint_fragment(PaintContext& context, const LineBoxFragment& fragment, PaintPhase phase) const
{
auto& painter = context.painter();

View file

@ -40,7 +40,6 @@ public:
const DOM::Text& dom_node() const { return static_cast<const DOM::Text&>(*Node::dom_node()); }
const String& text_for_style(const CSS::StyleProperties&) const;
const String& text_for_rendering() const { return m_text_for_rendering; }
virtual void paint_fragment(PaintContext&, const LineBoxFragment&, PaintPhase) const override;

View file

@ -91,18 +91,10 @@ void TreeBuilder::create_layout_tree(DOM::Node& dom_node)
if (dom_node.parent() && !dom_node.parent()->layout_node())
return;
const CSS::StyleProperties* parent_style = nullptr;
if (!m_parent_stack.is_empty() && m_parent_stack.last()->dom_node() && m_parent_stack.last()->dom_node()->is_element())
parent_style = downcast<DOM::Element>(*m_parent_stack.last()->dom_node()).specified_css_values();
auto layout_node = dom_node.create_layout_node();
if (!layout_node)
return;
// Discard empty whitespace nodes. This might not be ideal for correctness, but it does make the tree nicer.
if (is<TextNode>(*layout_node) && downcast<TextNode>(*layout_node).text_for_style(*parent_style) == " ")
return;
if (!dom_node.parent()) {
m_layout_root = layout_node;
} else {