diff --git a/Libraries/LibHTML/Layout/LayoutBlock.cpp b/Libraries/LibHTML/Layout/LayoutBlock.cpp index 5102b111ce..73a374ec65 100644 --- a/Libraries/LibHTML/Layout/LayoutBlock.cpp +++ b/Libraries/LibHTML/Layout/LayoutBlock.cpp @@ -18,6 +18,7 @@ LayoutNode& LayoutBlock::inline_wrapper() { if (!last_child() || !last_child()->is_block() || last_child()->node() != nullptr) { append_child(adopt(*new LayoutBlock(nullptr, style_for_anonymous_block()))); + last_child()->set_children_are_inline(true); } return *last_child(); } @@ -40,7 +41,9 @@ void LayoutBlock::layout_block_children() ASSERT(!children_are_inline()); int content_height = 0; for_each_child([&](auto& child) { - ASSERT(is(child)); + // FIXME: What should we do here? Something like a might have a bunch of useless text children.. + if (child.is_inline()) + return; auto& child_block = static_cast(child); child_block.layout(); content_height = child_block.rect().bottom() + child_block.box_model().full_margin().bottom - rect().top(); @@ -238,11 +241,6 @@ void LayoutBlock::render(RenderingContext& context) } } -bool LayoutBlock::children_are_inline() const -{ - return first_child() && first_child()->is_inline(); -} - HitTestResult LayoutBlock::hit_test(const Point& position) const { if (!children_are_inline()) diff --git a/Libraries/LibHTML/Layout/LayoutBlock.h b/Libraries/LibHTML/Layout/LayoutBlock.h index 39178be809..84e3ef7ef7 100644 --- a/Libraries/LibHTML/Layout/LayoutBlock.h +++ b/Libraries/LibHTML/Layout/LayoutBlock.h @@ -17,8 +17,6 @@ public: virtual LayoutNode& inline_wrapper() override; - bool children_are_inline() const; - Vector& line_boxes() { return m_line_boxes; } const Vector& line_boxes() const { return m_line_boxes; } diff --git a/Libraries/LibHTML/Layout/LayoutNode.h b/Libraries/LibHTML/Layout/LayoutNode.h index bc26c2e811..b13d4c5500 100644 --- a/Libraries/LibHTML/Layout/LayoutNode.h +++ b/Libraries/LibHTML/Layout/LayoutNode.h @@ -79,6 +79,9 @@ public: template void for_each_fragment_of_this(Callback); + bool children_are_inline() const { return m_children_are_inline; } + void set_children_are_inline(bool value) { m_children_are_inline = value; } + protected: explicit LayoutNode(const Node*); @@ -90,6 +93,7 @@ private: bool m_inline { false }; bool m_has_style { false }; bool m_visible { true }; + bool m_children_are_inline { false }; }; class LayoutNodeWithStyle : public LayoutNode { diff --git a/Libraries/LibHTML/Layout/LayoutTreeBuilder.cpp b/Libraries/LibHTML/Layout/LayoutTreeBuilder.cpp index 2a3637b6b3..571734134b 100644 --- a/Libraries/LibHTML/Layout/LayoutTreeBuilder.cpp +++ b/Libraries/LibHTML/Layout/LayoutTreeBuilder.cpp @@ -42,6 +42,9 @@ static RefPtr create_layout_tree(Node& node, const StyleProperties* } } + if (have_inline_children && !have_block_children) + layout_node->set_children_are_inline(true); + return layout_node; }