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; }