#pragma once #include #include class Element; class LayoutBlock : public LayoutNodeWithStyle { public: LayoutBlock(const Node*, NonnullRefPtr); virtual ~LayoutBlock() override; virtual const char* class_name() const override { return "LayoutBlock"; } virtual void layout() override; virtual void render(RenderingContext&) override; 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; } LineBox& ensure_last_line_box(); LineBox& add_line_box(); virtual HitTestResult hit_test(const Point&) const override; private: virtual bool is_block() const override { return true; } NonnullRefPtr style_for_anonymous_block() const; void layout_inline_children(); void layout_block_children(); void compute_width(); void compute_position(); void compute_height(); Vector m_line_boxes; }; template void LayoutNode::for_each_fragment_of_this(Callback callback) { auto& block = *containing_block(); for (auto& line_box : block.line_boxes()) { for (auto& fragment : line_box.fragments()) { if (callback(fragment) == IterationDecision::Break) return; } } } template<> inline bool is(const LayoutNode& node) { return node.is_block(); }