ladybird/Libraries/LibWeb/Layout/InlineNode.cpp
Jelle Raaijmakers 336684bc5c LibWeb: Support inserting non-inline elements into inline elements
Our layout tree requires that all containers either have inline or
non-inline children. In order to support the layout of non-inline
elements inside inline elements, we need to do a bit of tree
restructuring. It effectively simulates temporarily closing all inline
nodes, appending the block element, and resumes appending to the last
open inline node.

The acid1.txt expectation needed to be updated to reflect the fact that
we now hoist its <p> elements out of the inline <form> they were in.
Visually, the before and after situations for acid1.html are identical.
2025-01-23 09:33:10 +01:00

38 lines
1.3 KiB
C++

/*
* Copyright (c) 2018-2022, Andreas Kling <andreas@ladybird.org>
* Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
* Copyright (c) 2024, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/DOM/Document.h>
#include <LibWeb/DOM/Element.h>
#include <LibWeb/Layout/InlineFormattingContext.h>
#include <LibWeb/Layout/InlineNode.h>
namespace Web::Layout {
GC_DEFINE_ALLOCATOR(InlineNode);
InlineNode::InlineNode(DOM::Document& document, DOM::Element* element, GC::Ref<CSS::ComputedProperties> style)
: Layout::NodeWithStyleAndBoxModelMetrics(document, element, move(style))
{
}
InlineNode::~InlineNode() = default;
GC::Ptr<Painting::PaintableWithLines> InlineNode::create_paintable_for_line_with_index(size_t line_index) const
{
for (auto const& paintable : paintables()) {
if (is<Painting::PaintableWithLines>(paintable)) {
auto const& paintable_with_lines = static_cast<Painting::PaintableWithLines const&>(paintable);
if (paintable_with_lines.line_index() == line_index) {
return const_cast<Painting::PaintableWithLines&>(paintable_with_lines);
}
}
}
return Painting::PaintableWithLines::create(*this, line_index);
}
}