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&);