From 814bed33b4f66ca7ed2199fd7319c89daf783158 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Sun, 14 Jan 2024 11:14:20 +0100 Subject: [PATCH] LibWeb: Move box_type_agnostic_position() from layout node to paintable For this method, there is no need to go through the layout node when we can directly reach the paintable. --- .../Libraries/LibWeb/HTML/BrowsingContext.cpp | 5 ++-- .../Libraries/LibWeb/HTML/HTMLElement.cpp | 12 +++++----- Userland/Libraries/LibWeb/HTML/Navigable.cpp | 5 ++-- Userland/Libraries/LibWeb/Layout/Node.cpp | 23 ------------------ Userland/Libraries/LibWeb/Layout/Node.h | 2 -- .../Libraries/LibWeb/Page/EventHandler.cpp | 2 +- .../Libraries/LibWeb/Painting/Paintable.cpp | 24 +++++++++++++++++++ .../Libraries/LibWeb/Painting/Paintable.h | 2 ++ 8 files changed, 39 insertions(+), 36 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp index 6041885d6c..2c8c1550a9 100644 --- a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp +++ b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include namespace Web::HTML { @@ -391,9 +392,9 @@ CSSPixelPoint BrowsingContext::to_top_level_position(CSSPixelPoint a_position) break; if (!ancestor->container()) return {}; - if (!ancestor->container()->layout_node()) + if (!ancestor->container()->paintable()) return {}; - position.translate_by(ancestor->container()->layout_node()->box_type_agnostic_position()); + position.translate_by(ancestor->container()->paintable()->box_type_agnostic_position()); } return position; } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp index a96ad581f2..9eafe37242 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp @@ -215,7 +215,7 @@ int HTMLElement::offset_top() const // ignoring any transforms that apply to the element and its ancestors, and terminate this algorithm. auto offset_parent = this->offset_parent(); if (!offset_parent || !offset_parent->layout_node()) { - auto position = layout_node()->box_type_agnostic_position(); + auto position = paintable()->box_type_agnostic_position(); return position.y().to_int(); } @@ -224,8 +224,8 @@ int HTMLElement::offset_top() const // from the y-coordinate of the top border edge of the first box associated with the element, // relative to the initial containing block origin, // ignoring any transforms that apply to the element and its ancestors. - auto offset_parent_position = offset_parent->layout_node()->box_type_agnostic_position(); - auto position = layout_node()->box_type_agnostic_position(); + auto offset_parent_position = offset_parent->paintable()->box_type_agnostic_position(); + auto position = paintable()->box_type_agnostic_position(); return position.y().to_int() - offset_parent_position.y().to_int(); } @@ -248,7 +248,7 @@ int HTMLElement::offset_left() const // ignoring any transforms that apply to the element and its ancestors, and terminate this algorithm. auto offset_parent = this->offset_parent(); if (!offset_parent || !offset_parent->layout_node()) { - auto position = layout_node()->box_type_agnostic_position(); + auto position = paintable()->box_type_agnostic_position(); return position.x().to_int(); } @@ -257,8 +257,8 @@ int HTMLElement::offset_left() const // from the x-coordinate of the left border edge of the first CSS layout box associated with the element, // relative to the initial containing block origin, // ignoring any transforms that apply to the element and its ancestors. - auto offset_parent_position = offset_parent->layout_node()->box_type_agnostic_position(); - auto position = layout_node()->box_type_agnostic_position(); + auto offset_parent_position = offset_parent->paintable()->box_type_agnostic_position(); + auto position = paintable()->box_type_agnostic_position(); return position.x().to_int() - offset_parent_position.x().to_int(); } diff --git a/Userland/Libraries/LibWeb/HTML/Navigable.cpp b/Userland/Libraries/LibWeb/HTML/Navigable.cpp index b23abbfd6c..951845a1de 100644 --- a/Userland/Libraries/LibWeb/HTML/Navigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/Navigable.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -1920,9 +1921,9 @@ CSSPixelPoint Navigable::to_top_level_position(CSSPixelPoint a_position) break; if (!ancestor->container()) return {}; - if (!ancestor->container()->layout_node()) + if (!ancestor->container()->paintable()) return {}; - position.translate_by(ancestor->container()->layout_node()->box_type_agnostic_position()); + position.translate_by(ancestor->container()->paintable()->box_type_agnostic_position()); } return position; } diff --git a/Userland/Libraries/LibWeb/Layout/Node.cpp b/Userland/Libraries/LibWeb/Layout/Node.cpp index 9f1dc6f80a..51dfaf14f8 100644 --- a/Userland/Libraries/LibWeb/Layout/Node.cpp +++ b/Userland/Libraries/LibWeb/Layout/Node.cpp @@ -251,29 +251,6 @@ void Node::set_needs_display() }); } -CSSPixelPoint Node::box_type_agnostic_position() const -{ - if (is(*this)) - return verify_cast(*this).paintable_box()->absolute_position(); - VERIFY(is_inline()); - - if (paintable() && paintable()->is_inline_paintable()) { - auto const& inline_paintable = static_cast(*paintable()); - if (!inline_paintable.fragments().is_empty()) - return inline_paintable.fragments().first().absolute_rect().location(); - VERIFY_NOT_REACHED(); - } - - CSSPixelPoint position; - if (auto const* block = containing_block(); block && block->paintable() && is(*block->paintable())) { - static_cast(*block->paintable_box()).for_each_fragment([&](auto& fragment) { - position = fragment.absolute_rect().location(); - return IterationDecision::Break; - }); - } - return position; -} - bool Node::is_floating() const { if (!has_style()) diff --git a/Userland/Libraries/LibWeb/Layout/Node.h b/Userland/Libraries/LibWeb/Layout/Node.h index e04e682299..bd6136636e 100644 --- a/Userland/Libraries/LibWeb/Layout/Node.h +++ b/Userland/Libraries/LibWeb/Layout/Node.h @@ -160,8 +160,6 @@ public: bool children_are_inline() const { return m_children_are_inline; } void set_children_are_inline(bool value) { m_children_are_inline = value; } - CSSPixelPoint box_type_agnostic_position() const; - enum class SelectionState { None, // No selection Start, // Selection starts in this Node diff --git a/Userland/Libraries/LibWeb/Page/EventHandler.cpp b/Userland/Libraries/LibWeb/Page/EventHandler.cpp index 20bd880152..4d0bed3c6e 100644 --- a/Userland/Libraries/LibWeb/Page/EventHandler.cpp +++ b/Userland/Libraries/LibWeb/Page/EventHandler.cpp @@ -116,7 +116,7 @@ static Gfx::StandardCursor cursor_css_to_gfx(Optional cursor) static CSSPixelPoint compute_mouse_event_offset(CSSPixelPoint position, Layout::Node const& layout_node) { - auto top_left_of_layout_node = layout_node.box_type_agnostic_position(); + auto top_left_of_layout_node = layout_node.paintable()->box_type_agnostic_position(); return { position.x() - top_left_of_layout_node.x(), position.y() - top_left_of_layout_node.y() diff --git a/Userland/Libraries/LibWeb/Painting/Paintable.cpp b/Userland/Libraries/LibWeb/Painting/Paintable.cpp index 2294cd674c..9727183443 100644 --- a/Userland/Libraries/LibWeb/Painting/Paintable.cpp +++ b/Userland/Libraries/LibWeb/Painting/Paintable.cpp @@ -131,4 +131,28 @@ PaintableBox const* Paintable::nearest_scrollable_ancestor_within_stacking_conte return nullptr; } +CSSPixelPoint Paintable::box_type_agnostic_position() const +{ + if (is_paintable_box()) + return static_cast(this)->absolute_position(); + + VERIFY(is_inline()); + if (is_inline_paintable()) { + auto const& inline_paintable = static_cast(*this); + if (!inline_paintable.fragments().is_empty()) + return inline_paintable.fragments().first().absolute_rect().location(); + VERIFY_NOT_REACHED(); + } + + CSSPixelPoint position; + if (auto const* block = containing_block(); block && block->paintable() && is(*block->paintable())) { + static_cast(*block->paintable_box()).for_each_fragment([&](auto& fragment) { + position = fragment.absolute_rect().location(); + return IterationDecision::Break; + }); + } + + return position; +} + } diff --git a/Userland/Libraries/LibWeb/Painting/Paintable.h b/Userland/Libraries/LibWeb/Painting/Paintable.h index 44c3171f93..9f517e5b65 100644 --- a/Userland/Libraries/LibWeb/Painting/Paintable.h +++ b/Userland/Libraries/LibWeb/Painting/Paintable.h @@ -186,6 +186,8 @@ public: PaintableBox const* nearest_scrollable_ancestor_within_stacking_context() const; + CSSPixelPoint box_type_agnostic_position() const; + protected: explicit Paintable(Layout::Node const&);