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;
}