diff --git a/Libraries/LibHTML/DOM/Node.h b/Libraries/LibHTML/DOM/Node.h index 66ff78f4f7..a32f631092 100644 --- a/Libraries/LibHTML/DOM/Node.h +++ b/Libraries/LibHTML/DOM/Node.h @@ -89,7 +89,7 @@ inline bool is(const Node&) template inline bool is(const Node* node) { - return node && is(*node); + return !node || is(*node); } template<> diff --git a/Libraries/LibHTML/Dump.cpp b/Libraries/LibHTML/Dump.cpp index c16d78f5cd..7d3cd81769 100644 --- a/Libraries/LibHTML/Dump.cpp +++ b/Libraries/LibHTML/Dump.cpp @@ -58,35 +58,40 @@ void dump_tree(const LayoutNode& layout_node) else tag_name = "???"; - dbgprintf("%s {%s} at (%d,%d) size %dx%d", - layout_node.class_name(), - tag_name.characters(), - layout_node.x(), - layout_node.y(), - layout_node.width(), - layout_node.height()); + if (!layout_node.is_box()) { + dbgprintf("%s {%s}\n", layout_node.class_name(), tag_name.characters()); + } else { + auto& layout_box = to(layout_node); + dbgprintf("%s {%s} at (%d,%d) size %dx%d", + layout_box.class_name(), + tag_name.characters(), + layout_box.x(), + layout_box.y(), + layout_box.width(), + layout_box.height()); - // Dump the horizontal box properties - dbgprintf(" [%d+%d+%d %d %d+%d+%d]", - layout_node.box_model().margin().left.to_px(), - layout_node.box_model().border().left.to_px(), - layout_node.box_model().padding().left.to_px(), - layout_node.width(), - layout_node.box_model().padding().right.to_px(), - layout_node.box_model().border().right.to_px(), - layout_node.box_model().margin().right.to_px()); + // Dump the horizontal box properties + dbgprintf(" [%d+%d+%d %d %d+%d+%d]", + layout_box.box_model().margin().left.to_px(), + layout_box.box_model().border().left.to_px(), + layout_box.box_model().padding().left.to_px(), + layout_box.width(), + layout_box.box_model().padding().right.to_px(), + layout_box.box_model().border().right.to_px(), + layout_box.box_model().margin().right.to_px()); - // And the vertical box properties - dbgprintf(" [%d+%d+%d %d %d+%d+%d]", - layout_node.box_model().margin().top.to_px(), - layout_node.box_model().border().top.to_px(), - layout_node.box_model().padding().top.to_px(), - layout_node.height(), - layout_node.box_model().padding().bottom.to_px(), - layout_node.box_model().border().bottom.to_px(), - layout_node.box_model().margin().bottom.to_px()); + // And the vertical box properties + dbgprintf(" [%d+%d+%d %d %d+%d+%d]", + layout_box.box_model().margin().top.to_px(), + layout_box.box_model().border().top.to_px(), + layout_box.box_model().padding().top.to_px(), + layout_box.height(), + layout_box.box_model().padding().bottom.to_px(), + layout_box.box_model().border().bottom.to_px(), + layout_box.box_model().margin().bottom.to_px()); - dbgprintf("\n"); + dbgprintf("\n"); + } if (layout_node.is_block() && static_cast(layout_node).children_are_inline()) { auto& block = static_cast(layout_node); diff --git a/Libraries/LibHTML/Layout/LayoutBlock.cpp b/Libraries/LibHTML/Layout/LayoutBlock.cpp index 8cce2f9431..734ada9f00 100644 --- a/Libraries/LibHTML/Layout/LayoutBlock.cpp +++ b/Libraries/LibHTML/Layout/LayoutBlock.cpp @@ -3,9 +3,10 @@ #include #include #include +#include LayoutBlock::LayoutBlock(const Node* node, NonnullRefPtr style) - : LayoutNodeWithStyle(node, move(style)) + : LayoutBox(node, move(style)) { } @@ -39,8 +40,10 @@ void LayoutBlock::layout_block_children() ASSERT(!children_are_inline()); int content_height = 0; for_each_child([&](auto& child) { - child.layout(); - content_height = child.rect().bottom() + child.box_model().full_margin().bottom - rect().top(); + ASSERT(is(child)); + auto& child_block = static_cast(child); + child_block.layout(); + content_height = child_block.rect().bottom() + child_block.box_model().full_margin().bottom - rect().top(); }); rect().set_height(content_height); } @@ -69,8 +72,8 @@ void LayoutBlock::layout_inline_children() fragment.rect().set_x(x() + fragment.rect().x()); fragment.rect().set_y(y() + content_height + (max_height - fragment.rect().height())); - if (fragment.layout_node().is_replaced()) - const_cast(fragment.layout_node()).set_rect(fragment.rect()); + if (is(fragment.layout_node())) + const_cast(to(fragment.layout_node())).set_rect(fragment.rect()); } content_height += max_height; diff --git a/Libraries/LibHTML/Layout/LayoutBlock.h b/Libraries/LibHTML/Layout/LayoutBlock.h index 91b21c8e60..39178be809 100644 --- a/Libraries/LibHTML/Layout/LayoutBlock.h +++ b/Libraries/LibHTML/Layout/LayoutBlock.h @@ -1,11 +1,11 @@ #pragma once -#include +#include #include class Element; -class LayoutBlock : public LayoutNodeWithStyle { +class LayoutBlock : public LayoutBox { public: LayoutBlock(const Node*, NonnullRefPtr); virtual ~LayoutBlock() override; @@ -27,6 +27,11 @@ public: virtual HitTestResult hit_test(const Point&) const override; + LayoutBlock* previous_sibling() { return to(LayoutNode::previous_sibling()); } + const LayoutBlock* previous_sibling() const { return to(LayoutNode::previous_sibling()); } + LayoutBlock* next_sibling() { return to(LayoutNode::next_sibling()); } + const LayoutBlock* next_sibling() const { return to(LayoutNode::next_sibling()); } + private: virtual bool is_block() const override { return true; } diff --git a/Libraries/LibHTML/Layout/LayoutBox.cpp b/Libraries/LibHTML/Layout/LayoutBox.cpp new file mode 100644 index 0000000000..0e7d69afc9 --- /dev/null +++ b/Libraries/LibHTML/Layout/LayoutBox.cpp @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include + +//#define DRAW_BOXES_AROUND_LAYOUT_NODES +//#define DRAW_BOXES_AROUND_HOVERED_NODES + +void LayoutBox::render(RenderingContext& context) +{ +#ifdef DRAW_BOXES_AROUND_LAYOUT_NODES + context.painter().draw_rect(m_rect, Color::Blue); +#endif +#ifdef DRAW_BOXES_AROUND_HOVERED_NODES + if (!is_anonymous() && node() == document().hovered_node()) + context.painter().draw_rect(m_rect, Color::Red); +#endif + + Rect padded_rect; + padded_rect.set_x(x() - box_model().padding().left.to_px()); + padded_rect.set_width(width() + box_model().padding().left.to_px() + box_model().padding().right.to_px()); + padded_rect.set_y(y() - box_model().padding().top.to_px()); + padded_rect.set_height(height() + box_model().padding().top.to_px() + box_model().padding().bottom.to_px()); + + auto bgcolor = style().property(CSS::PropertyID::BackgroundColor); + if (bgcolor.has_value() && bgcolor.value()->is_color()) { + context.painter().fill_rect(padded_rect, bgcolor.value()->to_color(document())); + } + + // FIXME: Respect all individual border sides + auto border_width_value = style().property(CSS::PropertyID::BorderTopWidth); + auto border_color_value = style().property(CSS::PropertyID::BorderTopColor); + auto border_style_value = style().property(CSS::PropertyID::BorderTopStyle); + if (border_width_value.has_value() && border_color_value.has_value()) { + int border_width = border_width_value.value()->to_length().to_px(); + Color border_color = border_color_value.value()->to_color(document()); + + if (border_style_value.has_value() && border_style_value.value()->to_string() == "inset") { + // border-style: inset + auto shadow_color = Color::from_rgb(0x888888); + auto highlight_color = Color::from_rgb(0x5a5a5a); + context.painter().draw_line(padded_rect.top_left(), padded_rect.top_right(), highlight_color, border_width); + context.painter().draw_line(padded_rect.top_right(), padded_rect.bottom_right(), shadow_color, border_width); + context.painter().draw_line(padded_rect.bottom_right(), padded_rect.bottom_left(), shadow_color, border_width); + context.painter().draw_line(padded_rect.bottom_left(), padded_rect.top_left(), highlight_color, border_width); + } else if (border_style_value.has_value() && border_style_value.value()->to_string() == "outset") { + // border-style: outset + auto highlight_color = Color::from_rgb(0x888888); + auto shadow_color = Color::from_rgb(0x5a5a5a); + context.painter().draw_line(padded_rect.top_left(), padded_rect.top_right(), highlight_color, border_width); + context.painter().draw_line(padded_rect.top_right(), padded_rect.bottom_right(), shadow_color, border_width); + context.painter().draw_line(padded_rect.bottom_right(), padded_rect.bottom_left(), shadow_color, border_width); + context.painter().draw_line(padded_rect.bottom_left(), padded_rect.top_left(), highlight_color, border_width); + } else { + // border-style: solid + context.painter().draw_line(padded_rect.top_left(), padded_rect.top_right(), border_color, border_width); + context.painter().draw_line(padded_rect.top_right(), padded_rect.bottom_right(), border_color, border_width); + context.painter().draw_line(padded_rect.bottom_right(), padded_rect.bottom_left(), border_color, border_width); + context.painter().draw_line(padded_rect.bottom_left(), padded_rect.top_left(), border_color, border_width); + } + } +} + +HitTestResult LayoutBox::hit_test(const Point& position) const +{ + // FIXME: It would be nice if we could confidently skip over hit testing + // parts of the layout tree, but currently we can't just check + // m_rect.contains() since inline text rects can't be trusted.. + HitTestResult result { m_rect.contains(position) ? this : nullptr }; + for_each_child([&](auto& child) { + auto child_result = child.hit_test(position); + if (child_result.layout_node) + result = child_result; + }); + return result; +} + +void LayoutBox::set_needs_display() +{ + auto* frame = document().frame(); + ASSERT(frame); + + if (!is_inline()) { + const_cast(frame)->set_needs_display(rect()); + return; + } + + for_each_fragment_of_this([&](auto& fragment) { + if (&fragment.layout_node() == this || is_ancestor_of(fragment.layout_node())) { + const_cast(frame)->set_needs_display(fragment.rect()); + } + return IterationDecision::Continue; + }); +} diff --git a/Libraries/LibHTML/Layout/LayoutBox.h b/Libraries/LibHTML/Layout/LayoutBox.h new file mode 100644 index 0000000000..f66be67571 --- /dev/null +++ b/Libraries/LibHTML/Layout/LayoutBox.h @@ -0,0 +1,39 @@ +#pragma once + +#include + +class LayoutBox : public LayoutNodeWithStyleAndBoxModelMetrics { +public: + const Rect& rect() const { return m_rect; } + Rect& rect() { return m_rect; } + void set_rect(const Rect& rect) { m_rect = rect; } + + int x() const { return rect().x(); } + int y() const { return rect().y(); } + int width() const { return rect().width(); } + int height() const { return rect().height(); } + Size size() const { return rect().size(); } + Point position() const { return rect().location(); } + + virtual HitTestResult hit_test(const Point& position) const override; + virtual void set_needs_display() override; + +protected: + LayoutBox(const Node* node, NonnullRefPtr style) + : LayoutNodeWithStyleAndBoxModelMetrics(node, move(style)) + { + } + + virtual void render(RenderingContext&) override; + +private: + virtual bool is_box() const override { return true; } + + Rect m_rect; +}; + +template<> +inline bool is(const LayoutNode& node) +{ + return node.is_box(); +} diff --git a/Libraries/LibHTML/Layout/LayoutBreak.cpp b/Libraries/LibHTML/Layout/LayoutBreak.cpp index c971d96a75..6332f3476b 100644 --- a/Libraries/LibHTML/Layout/LayoutBreak.cpp +++ b/Libraries/LibHTML/Layout/LayoutBreak.cpp @@ -2,7 +2,7 @@ #include LayoutBreak::LayoutBreak(const HTMLBRElement& element) - : LayoutNode(&element) + : LayoutNodeWithStyleAndBoxModelMetrics(&element, StyleProperties::create()) { set_inline(true); } diff --git a/Libraries/LibHTML/Layout/LayoutBreak.h b/Libraries/LibHTML/Layout/LayoutBreak.h index af803e7ae3..24b87436c2 100644 --- a/Libraries/LibHTML/Layout/LayoutBreak.h +++ b/Libraries/LibHTML/Layout/LayoutBreak.h @@ -3,7 +3,7 @@ #include #include -class LayoutBreak final : public LayoutNode { +class LayoutBreak final : public LayoutNodeWithStyleAndBoxModelMetrics { public: explicit LayoutBreak(const HTMLBRElement&); virtual ~LayoutBreak() override; diff --git a/Libraries/LibHTML/Layout/LayoutDocument.cpp b/Libraries/LibHTML/Layout/LayoutDocument.cpp index afd39456dd..9776803902 100644 --- a/Libraries/LibHTML/Layout/LayoutDocument.cpp +++ b/Libraries/LibHTML/Layout/LayoutDocument.cpp @@ -1,4 +1,5 @@ #include +#include #include LayoutDocument::LayoutDocument(const Document& document, NonnullRefPtr style) @@ -17,10 +18,14 @@ void LayoutDocument::layout() LayoutNode::layout(); + ASSERT(!children_are_inline()); + int lowest_bottom = 0; for_each_child([&](auto& child) { - if (child.rect().bottom() > lowest_bottom) - lowest_bottom = child.rect().bottom(); + ASSERT(is(child)); + auto& child_block = to(child); + if (child_block.rect().bottom() > lowest_bottom) + lowest_bottom = child_block.rect().bottom(); }); rect().set_bottom(lowest_bottom); } diff --git a/Libraries/LibHTML/Layout/LayoutInline.cpp b/Libraries/LibHTML/Layout/LayoutInline.cpp index 5265d9a357..6e4d526461 100644 --- a/Libraries/LibHTML/Layout/LayoutInline.cpp +++ b/Libraries/LibHTML/Layout/LayoutInline.cpp @@ -3,7 +3,7 @@ #include LayoutInline::LayoutInline(const Element& element, NonnullRefPtr style) - : LayoutNodeWithStyle(&element, move(style)) + : LayoutNodeWithStyleAndBoxModelMetrics(&element, move(style)) { set_inline(true); } diff --git a/Libraries/LibHTML/Layout/LayoutInline.h b/Libraries/LibHTML/Layout/LayoutInline.h index 8a12d5e3fa..3fb133d947 100644 --- a/Libraries/LibHTML/Layout/LayoutInline.h +++ b/Libraries/LibHTML/Layout/LayoutInline.h @@ -1,15 +1,12 @@ #pragma once -#include +#include class LayoutBlock; -class LayoutInline : public LayoutNodeWithStyle { +class LayoutInline : public LayoutNodeWithStyleAndBoxModelMetrics { public: LayoutInline(const Element&, NonnullRefPtr); virtual ~LayoutInline() override; - virtual const char* class_name() const override { return "LayoutInline"; } - -private: }; diff --git a/Libraries/LibHTML/Layout/LayoutListItemMarker.cpp b/Libraries/LibHTML/Layout/LayoutListItemMarker.cpp index de2698049b..c82d79a1a1 100644 --- a/Libraries/LibHTML/Layout/LayoutListItemMarker.cpp +++ b/Libraries/LibHTML/Layout/LayoutListItemMarker.cpp @@ -2,7 +2,7 @@ #include LayoutListItemMarker::LayoutListItemMarker() - : LayoutNode(nullptr) + : LayoutBox(nullptr, StyleProperties::create()) { } diff --git a/Libraries/LibHTML/Layout/LayoutListItemMarker.h b/Libraries/LibHTML/Layout/LayoutListItemMarker.h index 245c182c6f..63bf75b90b 100644 --- a/Libraries/LibHTML/Layout/LayoutListItemMarker.h +++ b/Libraries/LibHTML/Layout/LayoutListItemMarker.h @@ -1,8 +1,8 @@ #pragma once -#include +#include -class LayoutListItemMarker final : public LayoutNode { +class LayoutListItemMarker final : public LayoutBox { public: LayoutListItemMarker(); virtual ~LayoutListItemMarker() override; diff --git a/Libraries/LibHTML/Layout/LayoutNode.cpp b/Libraries/LibHTML/Layout/LayoutNode.cpp index 22efbde750..dbd79398af 100644 --- a/Libraries/LibHTML/Layout/LayoutNode.cpp +++ b/Libraries/LibHTML/Layout/LayoutNode.cpp @@ -5,9 +5,6 @@ #include #include -//#define DRAW_BOXES_AROUND_LAYOUT_NODES -//#define DRAW_BOXES_AROUND_HOVERED_NODES - LayoutNode::LayoutNode(const Node* node) : m_node(node) { @@ -42,58 +39,6 @@ void LayoutNode::render(RenderingContext& context) if (!is_visible()) return; -#ifdef DRAW_BOXES_AROUND_LAYOUT_NODES - context.painter().draw_rect(m_rect, Color::Blue); -#endif -#ifdef DRAW_BOXES_AROUND_HOVERED_NODES - if (!is_anonymous() && node() == document().hovered_node()) - context.painter().draw_rect(m_rect, Color::Red); -#endif - - Rect padded_rect; - padded_rect.set_x(x() - box_model().padding().left.to_px()); - padded_rect.set_width(width() + box_model().padding().left.to_px() + box_model().padding().right.to_px()); - padded_rect.set_y(y() - box_model().padding().top.to_px()); - padded_rect.set_height(height() + box_model().padding().top.to_px() + box_model().padding().bottom.to_px()); - - auto bgcolor = style().property(CSS::PropertyID::BackgroundColor); - if (bgcolor.has_value() && bgcolor.value()->is_color()) { - context.painter().fill_rect(padded_rect, bgcolor.value()->to_color(document())); - } - - // FIXME: Respect all individual border sides - auto border_width_value = style().property(CSS::PropertyID::BorderTopWidth); - auto border_color_value = style().property(CSS::PropertyID::BorderTopColor); - auto border_style_value = style().property(CSS::PropertyID::BorderTopStyle); - if (border_width_value.has_value() && border_color_value.has_value()) { - int border_width = border_width_value.value()->to_length().to_px(); - Color border_color = border_color_value.value()->to_color(document()); - - if (border_style_value.has_value() && border_style_value.value()->to_string() == "inset") { - // border-style: inset - auto shadow_color = Color::from_rgb(0x888888); - auto highlight_color = Color::from_rgb(0x5a5a5a); - context.painter().draw_line(padded_rect.top_left(), padded_rect.top_right(), highlight_color, border_width); - context.painter().draw_line(padded_rect.top_right(), padded_rect.bottom_right(), shadow_color, border_width); - context.painter().draw_line(padded_rect.bottom_right(), padded_rect.bottom_left(), shadow_color, border_width); - context.painter().draw_line(padded_rect.bottom_left(), padded_rect.top_left(), highlight_color, border_width); - } else if (border_style_value.has_value() && border_style_value.value()->to_string() == "outset") { - // border-style: outset - auto highlight_color = Color::from_rgb(0x888888); - auto shadow_color = Color::from_rgb(0x5a5a5a); - context.painter().draw_line(padded_rect.top_left(), padded_rect.top_right(), highlight_color, border_width); - context.painter().draw_line(padded_rect.top_right(), padded_rect.bottom_right(), shadow_color, border_width); - context.painter().draw_line(padded_rect.bottom_right(), padded_rect.bottom_left(), shadow_color, border_width); - context.painter().draw_line(padded_rect.bottom_left(), padded_rect.top_left(), highlight_color, border_width); - } else { - // border-style: solid - context.painter().draw_line(padded_rect.top_left(), padded_rect.top_right(), border_color, border_width); - context.painter().draw_line(padded_rect.top_right(), padded_rect.bottom_right(), border_color, border_width); - context.painter().draw_line(padded_rect.bottom_right(), padded_rect.bottom_left(), border_color, border_width); - context.painter().draw_line(padded_rect.bottom_left(), padded_rect.top_left(), border_color, border_width); - } - } - // TODO: render our border for_each_child([&](auto& child) { child.render(context); @@ -102,10 +47,7 @@ void LayoutNode::render(RenderingContext& context) HitTestResult LayoutNode::hit_test(const Point& position) const { - // FIXME: It would be nice if we could confidently skip over hit testing - // parts of the layout tree, but currently we can't just check - // m_rect.contains() since inline text rects can't be trusted.. - HitTestResult result { m_rect.contains(position) ? this : nullptr }; + HitTestResult result; for_each_child([&](auto& child) { auto child_result = child.hit_test(position); if (child_result.layout_node) @@ -134,18 +76,4 @@ void LayoutNode::split_into_lines(LayoutBlock& container) void LayoutNode::set_needs_display() { - auto* frame = document().frame(); - ASSERT(frame); - - if (!is_inline()) { - const_cast(frame)->set_needs_display(rect()); - return; - } - - for_each_fragment_of_this([&](auto& fragment) { - if (&fragment.layout_node() == this || is_ancestor_of(fragment.layout_node())) { - const_cast(frame)->set_needs_display(fragment.rect()); - } - return IterationDecision::Continue; - }); } diff --git a/Libraries/LibHTML/Layout/LayoutNode.h b/Libraries/LibHTML/Layout/LayoutNode.h index 1318f634c6..bc26c2e811 100644 --- a/Libraries/LibHTML/Layout/LayoutNode.h +++ b/Libraries/LibHTML/Layout/LayoutNode.h @@ -24,20 +24,6 @@ class LayoutNode : public TreeNode { public: virtual ~LayoutNode(); - const Rect& rect() const { return m_rect; } - Rect& rect() { return m_rect; } - void set_rect(const Rect& rect) { m_rect = rect; } - - int x() const { return rect().x(); } - int y() const { return rect().y(); } - int width() const { return rect().width(); } - int height() const { return rect().height(); } - Size size() const { return rect().size(); } - Point position() const { return rect().location(); } - - BoxModelMetrics& box_model() { return m_box_metrics; } - const BoxModelMetrics& box_model() const { return m_box_metrics; } - virtual HitTestResult hit_test(const Point&) const; bool is_anonymous() const { return !m_node; } @@ -63,6 +49,7 @@ public: virtual bool is_text() const { return false; } virtual bool is_block() const { return false; } virtual bool is_replaced() const { return false; } + virtual bool is_box() const { return false; } bool has_style() const { return m_has_style; } bool is_inline() const { return m_inline; } @@ -87,7 +74,7 @@ public: bool is_visible() const { return m_visible; } void set_visible(bool visible) { m_visible = visible; } - void set_needs_display(); + virtual void set_needs_display(); template void for_each_fragment_of_this(Callback); @@ -100,8 +87,6 @@ private: const Node* m_node { nullptr }; - BoxModelMetrics m_box_metrics; - Rect m_rect; bool m_inline { false }; bool m_has_style { false }; bool m_visible { true }; @@ -126,6 +111,21 @@ private: NonnullRefPtr m_style; }; +class LayoutNodeWithStyleAndBoxModelMetrics : public LayoutNodeWithStyle { +public: + BoxModelMetrics& box_model() { return m_box_model; } + const BoxModelMetrics& box_model() const { return m_box_model; } + +protected: + LayoutNodeWithStyleAndBoxModelMetrics(const Node* node, NonnullRefPtr style) + : LayoutNodeWithStyle(node, move(style)) + { + } + +private: + BoxModelMetrics m_box_model; +}; + inline const StyleProperties& LayoutNode::style() const { if (m_has_style) @@ -147,7 +147,7 @@ inline bool is(const LayoutNode&) template inline bool is(const LayoutNode* node) { - return node && is(*node); + return !node || is(*node); } template<> diff --git a/Libraries/LibHTML/Layout/LayoutReplaced.cpp b/Libraries/LibHTML/Layout/LayoutReplaced.cpp index 46acbcefee..2551ecd4c8 100644 --- a/Libraries/LibHTML/Layout/LayoutReplaced.cpp +++ b/Libraries/LibHTML/Layout/LayoutReplaced.cpp @@ -3,7 +3,7 @@ #include LayoutReplaced::LayoutReplaced(const Element& element, NonnullRefPtr style) - : LayoutNodeWithStyle(&element, move(style)) + : LayoutBox(&element, move(style)) { // FIXME: Allow non-inline replaced elements. set_inline(true); diff --git a/Libraries/LibHTML/Layout/LayoutReplaced.h b/Libraries/LibHTML/Layout/LayoutReplaced.h index a3392997ec..de80a9294a 100644 --- a/Libraries/LibHTML/Layout/LayoutReplaced.h +++ b/Libraries/LibHTML/Layout/LayoutReplaced.h @@ -1,7 +1,7 @@ #include -#include +#include -class LayoutReplaced : public LayoutNodeWithStyle { +class LayoutReplaced : public LayoutBox { public: LayoutReplaced(const Element&, NonnullRefPtr); virtual ~LayoutReplaced() override; diff --git a/Libraries/LibHTML/Makefile.shared b/Libraries/LibHTML/Makefile.shared index feac259fb3..bbacce889e 100644 --- a/Libraries/LibHTML/Makefile.shared +++ b/Libraries/LibHTML/Makefile.shared @@ -34,6 +34,7 @@ LIBHTML_OBJS = \ Parser/HTMLParser.o \ Parser/CSSParser.o \ Layout/LayoutNode.o \ + Layout/LayoutBox.o \ Layout/LayoutText.o \ Layout/LayoutBlock.o \ Layout/LayoutInline.o \