diff --git a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp
index e8eed6f311..6041885d6c 100644
--- a/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp
+++ b/Userland/Libraries/LibWeb/HTML/BrowsingContext.cpp
@@ -297,6 +297,8 @@ void BrowsingContext::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_last_child);
visitor.visit(m_next_sibling);
visitor.visit(m_previous_sibling);
+
+ m_event_handler.visit_edges(visitor);
}
// https://html.spec.whatwg.org/multipage/document-sequences.html#bc-traversable
diff --git a/Userland/Libraries/LibWeb/Page/EventHandler.cpp b/Userland/Libraries/LibWeb/Page/EventHandler.cpp
index 096f1353bb..20bd880152 100644
--- a/Userland/Libraries/LibWeb/Page/EventHandler.cpp
+++ b/Userland/Libraries/LibWeb/Page/EventHandler.cpp
@@ -836,9 +836,9 @@ bool EventHandler::handle_keyup(KeyCode key, u32 modifiers, u32 code_point)
return fire_keyboard_event(UIEvents::EventNames::keyup, m_browsing_context, key, modifiers, code_point);
}
-void EventHandler::set_mouse_event_tracking_layout_node(Layout::Node* layout_node)
+void EventHandler::set_mouse_event_tracking_paintable(Painting::Paintable* paintable)
{
- m_mouse_event_tracking_layout_node = layout_node;
+ m_mouse_event_tracking_paintable = paintable;
}
CSSPixelPoint EventHandler::compute_mouse_event_client_offset(CSSPixelPoint event_page_position) const
@@ -880,11 +880,11 @@ CSSPixelPoint EventHandler::compute_mouse_event_movement(CSSPixelPoint screen_po
Optional EventHandler::target_for_mouse_position(CSSPixelPoint position)
{
- if (m_mouse_event_tracking_layout_node) {
- if (m_mouse_event_tracking_layout_node->paintable()->wants_mouse_events())
- return Target { m_mouse_event_tracking_layout_node->paintable(), {} };
+ if (m_mouse_event_tracking_paintable) {
+ if (m_mouse_event_tracking_paintable->wants_mouse_events())
+ return Target { m_mouse_event_tracking_paintable, {} };
- m_mouse_event_tracking_layout_node = nullptr;
+ m_mouse_event_tracking_paintable = nullptr;
}
if (auto result = paint_root()->hit_test(position, Painting::HitTestType::Exact); result.has_value())
@@ -893,4 +893,9 @@ Optional EventHandler::target_for_mouse_position(CSSPixelP
return {};
}
+void EventHandler::visit_edges(JS::Cell::Visitor& visitor) const
+{
+ visitor.visit(m_mouse_event_tracking_paintable);
+}
+
}
diff --git a/Userland/Libraries/LibWeb/Page/EventHandler.h b/Userland/Libraries/LibWeb/Page/EventHandler.h
index 596449a8a4..33467fdab7 100644
--- a/Userland/Libraries/LibWeb/Page/EventHandler.h
+++ b/Userland/Libraries/LibWeb/Page/EventHandler.h
@@ -12,6 +12,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -33,10 +34,12 @@ public:
bool handle_keydown(KeyCode, unsigned modifiers, u32 code_point);
bool handle_keyup(KeyCode, unsigned modifiers, u32 code_point);
- void set_mouse_event_tracking_layout_node(Layout::Node*);
+ void set_mouse_event_tracking_paintable(Painting::Paintable*);
void set_edit_event_handler(NonnullOwnPtr value) { m_edit_event_handler = move(value); }
+ void visit_edges(JS::Cell::Visitor& visitor) const;
+
private:
bool focus_next_element();
bool focus_previous_element();
@@ -59,7 +62,7 @@ private:
bool m_in_mouse_selection { false };
- WeakPtr m_mouse_event_tracking_layout_node;
+ JS::GCPtr m_mouse_event_tracking_paintable;
NonnullOwnPtr m_edit_event_handler;
diff --git a/Userland/Libraries/LibWeb/Painting/LabelablePaintable.cpp b/Userland/Libraries/LibWeb/Painting/LabelablePaintable.cpp
index c9e09ad5ab..e013333c67 100644
--- a/Userland/Libraries/LibWeb/Painting/LabelablePaintable.cpp
+++ b/Userland/Libraries/LibWeb/Painting/LabelablePaintable.cpp
@@ -42,7 +42,7 @@ LabelablePaintable::DispatchEventOfSameName LabelablePaintable::handle_mousedown
set_being_pressed(true);
m_tracking_mouse = true;
- browsing_context().event_handler().set_mouse_event_tracking_layout_node(&layout_box());
+ browsing_context().event_handler().set_mouse_event_tracking_paintable(this);
return DispatchEventOfSameName::Yes;
}
@@ -57,7 +57,7 @@ LabelablePaintable::DispatchEventOfSameName LabelablePaintable::handle_mouseup(B
set_being_pressed(false);
m_tracking_mouse = false;
- browsing_context().event_handler().set_mouse_event_tracking_layout_node(nullptr);
+ browsing_context().event_handler().set_mouse_event_tracking_paintable(nullptr);
return DispatchEventOfSameName::Yes;
}
diff --git a/Userland/Libraries/LibWeb/Painting/MediaPaintable.cpp b/Userland/Libraries/LibWeb/Painting/MediaPaintable.cpp
index 52f9e106c8..0123c2a61e 100644
--- a/Userland/Libraries/LibWeb/Painting/MediaPaintable.cpp
+++ b/Userland/Libraries/LibWeb/Painting/MediaPaintable.cpp
@@ -284,7 +284,7 @@ MediaPaintable::DispatchEventOfSameName MediaPaintable::handle_mousedown(Badge(browsing_context()).event_handler().set_mouse_event_tracking_layout_node(&layout_node());
+ const_cast(browsing_context()).event_handler().set_mouse_event_tracking_paintable(this);
return DispatchEventOfSameName::Yes;
}
@@ -306,7 +306,7 @@ MediaPaintable::DispatchEventOfSameName MediaPaintable::handle_mouseup(Badge(browsing_context()).event_handler().set_mouse_event_tracking_layout_node(nullptr);
+ const_cast(browsing_context()).event_handler().set_mouse_event_tracking_paintable(nullptr);
media_element.set_layout_mouse_tracking_component({}, {});
return DispatchEventOfSameName::Yes;
diff --git a/Userland/Libraries/LibWeb/Painting/TextPaintable.cpp b/Userland/Libraries/LibWeb/Painting/TextPaintable.cpp
index 09aa19ed60..dcb9d2f443 100644
--- a/Userland/Libraries/LibWeb/Painting/TextPaintable.cpp
+++ b/Userland/Libraries/LibWeb/Painting/TextPaintable.cpp
@@ -42,7 +42,7 @@ TextPaintable::DispatchEventOfSameName TextPaintable::handle_mousedown(Badge(label)->handle_mousedown_on_label({}, position, button);
- const_cast(browsing_context()).event_handler().set_mouse_event_tracking_layout_node(&const_cast(layout_node()));
+ const_cast(browsing_context()).event_handler().set_mouse_event_tracking_paintable(this);
return DispatchEventOfSameName::Yes;
}
@@ -53,7 +53,7 @@ TextPaintable::DispatchEventOfSameName TextPaintable::handle_mouseup(Badge(label)->handle_mouseup_on_label({}, position, button);
- const_cast(browsing_context()).event_handler().set_mouse_event_tracking_layout_node(nullptr);
+ const_cast(browsing_context()).event_handler().set_mouse_event_tracking_paintable(nullptr);
return DispatchEventOfSameName::Yes;
}