diff --git a/Userland/Libraries/LibWeb/Layout/LayoutState.cpp b/Userland/Libraries/LibWeb/Layout/LayoutState.cpp index fe82224976..fc1d772016 100644 --- a/Userland/Libraries/LibWeb/Layout/LayoutState.cpp +++ b/Userland/Libraries/LibWeb/Layout/LayoutState.cpp @@ -103,6 +103,8 @@ void LayoutState::commit() HashTable text_nodes; + Vector paintables_with_lines; + for (auto& it : used_values_per_layout_node) { auto& used_values = *it.value; auto& node = const_cast(used_values.node()); @@ -130,17 +132,26 @@ void LayoutState::commit() } if (is(box)) { - for (auto& line_box : used_values.line_boxes) { - for (auto& fragment : line_box.fragments()) { - if (fragment.layout_node().is_text_node()) - text_nodes.set(static_cast(const_cast(&fragment.layout_node()))); - } - } - static_cast(paintable_box).set_line_boxes(move(used_values.line_boxes)); + auto& paintable_with_lines = static_cast(paintable_box); + paintable_with_lines.set_line_boxes(move(used_values.line_boxes)); + paintables_with_lines.append(paintable_with_lines); } } } + // Measure absolute rect of each line box. Also collect all text nodes. + for (auto& paintable_with_lines : paintables_with_lines) { + for (auto& line_box : paintable_with_lines.line_boxes()) { + CSSPixelRect line_box_absolute_rect; + for (auto const& fragment : line_box.fragments()) { + line_box_absolute_rect = line_box_absolute_rect.united(fragment.absolute_rect()); + if (fragment.layout_node().is_text_node()) + text_nodes.set(static_cast(const_cast(&fragment.layout_node()))); + } + const_cast(line_box).set_absolute_rect(line_box_absolute_rect); + } + } + // Measure overflow in scroll containers. for (auto& it : used_values_per_layout_node) { auto& used_values = *it.value; diff --git a/Userland/Libraries/LibWeb/Layout/LineBox.h b/Userland/Libraries/LibWeb/Layout/LineBox.h index 31bf60fd03..bfc958d648 100644 --- a/Userland/Libraries/LibWeb/Layout/LineBox.h +++ b/Userland/Libraries/LibWeb/Layout/LineBox.h @@ -32,11 +32,16 @@ public: CSSPixels original_available_width() const { return m_original_available_width; } + CSSPixelRect const& absolute_rect() const { return m_absolute_rect; } + void set_absolute_rect(CSSPixelRect const& rect) { m_absolute_rect = rect; } + private: friend class BlockContainer; friend class InlineFormattingContext; friend class LineBuilder; + CSSPixelRect m_absolute_rect; + Vector m_fragments; CSSPixels m_width { 0 }; CSSPixels m_height { 0 };