Jelajahi Sumber

LibWeb: Use paintable to represent event tracking node

The use of layout nodes likely predated the paintable tree, but now
there is no point in introducing another level of indirection.
Aliaksandr Kalenik 1 tahun lalu
induk
melakukan
31e5b5f5de

+ 2 - 0
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_last_child);
     visitor.visit(m_next_sibling);
     visitor.visit(m_next_sibling);
     visitor.visit(m_previous_sibling);
     visitor.visit(m_previous_sibling);
+
+    m_event_handler.visit_edges(visitor);
 }
 }
 
 
 // https://html.spec.whatwg.org/multipage/document-sequences.html#bc-traversable
 // https://html.spec.whatwg.org/multipage/document-sequences.html#bc-traversable

+ 11 - 6
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);
     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
 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> EventHandler::target_for_mouse_position(CSSPixelPoint position)
 Optional<EventHandler::Target> 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())
     if (auto result = paint_root()->hit_test(position, Painting::HitTestType::Exact); result.has_value())
@@ -893,4 +893,9 @@ Optional<EventHandler::Target> EventHandler::target_for_mouse_position(CSSPixelP
     return {};
     return {};
 }
 }
 
 
+void EventHandler::visit_edges(JS::Cell::Visitor& visitor) const
+{
+    visitor.visit(m_mouse_event_tracking_paintable);
+}
+
 }
 }

+ 5 - 2
Userland/Libraries/LibWeb/Page/EventHandler.h

@@ -12,6 +12,7 @@
 #include <Kernel/API/KeyCode.h>
 #include <Kernel/API/KeyCode.h>
 #include <LibGUI/Forward.h>
 #include <LibGUI/Forward.h>
 #include <LibGfx/Forward.h>
 #include <LibGfx/Forward.h>
+#include <LibJS/Heap/Cell.h>
 #include <LibJS/Heap/GCPtr.h>
 #include <LibJS/Heap/GCPtr.h>
 #include <LibWeb/Forward.h>
 #include <LibWeb/Forward.h>
 #include <LibWeb/Page/EditEventHandler.h>
 #include <LibWeb/Page/EditEventHandler.h>
@@ -33,10 +34,12 @@ public:
     bool handle_keydown(KeyCode, unsigned modifiers, u32 code_point);
     bool handle_keydown(KeyCode, unsigned modifiers, u32 code_point);
     bool handle_keyup(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<EditEventHandler> value) { m_edit_event_handler = move(value); }
     void set_edit_event_handler(NonnullOwnPtr<EditEventHandler> value) { m_edit_event_handler = move(value); }
 
 
+    void visit_edges(JS::Cell::Visitor& visitor) const;
+
 private:
 private:
     bool focus_next_element();
     bool focus_next_element();
     bool focus_previous_element();
     bool focus_previous_element();
@@ -59,7 +62,7 @@ private:
 
 
     bool m_in_mouse_selection { false };
     bool m_in_mouse_selection { false };
 
 
-    WeakPtr<Layout::Node> m_mouse_event_tracking_layout_node;
+    JS::GCPtr<Painting::Paintable> m_mouse_event_tracking_paintable;
 
 
     NonnullOwnPtr<EditEventHandler> m_edit_event_handler;
     NonnullOwnPtr<EditEventHandler> m_edit_event_handler;
 
 

+ 2 - 2
Userland/Libraries/LibWeb/Painting/LabelablePaintable.cpp

@@ -42,7 +42,7 @@ LabelablePaintable::DispatchEventOfSameName LabelablePaintable::handle_mousedown
 
 
     set_being_pressed(true);
     set_being_pressed(true);
     m_tracking_mouse = 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;
     return DispatchEventOfSameName::Yes;
 }
 }
 
 
@@ -57,7 +57,7 @@ LabelablePaintable::DispatchEventOfSameName LabelablePaintable::handle_mouseup(B
 
 
     set_being_pressed(false);
     set_being_pressed(false);
     m_tracking_mouse = 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;
     return DispatchEventOfSameName::Yes;
 }
 }
 
 

+ 2 - 2
Userland/Libraries/LibWeb/Painting/MediaPaintable.cpp

@@ -284,7 +284,7 @@ MediaPaintable::DispatchEventOfSameName MediaPaintable::handle_mousedown(Badge<E
     }
     }
 
 
     if (media_element.layout_mouse_tracking_component({}).has_value())
     if (media_element.layout_mouse_tracking_component({}).has_value())
-        const_cast<HTML::BrowsingContext&>(browsing_context()).event_handler().set_mouse_event_tracking_layout_node(&layout_node());
+        const_cast<HTML::BrowsingContext&>(browsing_context()).event_handler().set_mouse_event_tracking_paintable(this);
 
 
     return DispatchEventOfSameName::Yes;
     return DispatchEventOfSameName::Yes;
 }
 }
@@ -306,7 +306,7 @@ MediaPaintable::DispatchEventOfSameName MediaPaintable::handle_mouseup(Badge<Eve
             break;
             break;
         }
         }
 
 
-        const_cast<HTML::BrowsingContext&>(browsing_context()).event_handler().set_mouse_event_tracking_layout_node(nullptr);
+        const_cast<HTML::BrowsingContext&>(browsing_context()).event_handler().set_mouse_event_tracking_paintable(nullptr);
         media_element.set_layout_mouse_tracking_component({}, {});
         media_element.set_layout_mouse_tracking_component({}, {});
 
 
         return DispatchEventOfSameName::Yes;
         return DispatchEventOfSameName::Yes;

+ 2 - 2
Userland/Libraries/LibWeb/Painting/TextPaintable.cpp

@@ -42,7 +42,7 @@ TextPaintable::DispatchEventOfSameName TextPaintable::handle_mousedown(Badge<Eve
     if (!label)
     if (!label)
         return DispatchEventOfSameName::No;
         return DispatchEventOfSameName::No;
     const_cast<Layout::Label*>(label)->handle_mousedown_on_label({}, position, button);
     const_cast<Layout::Label*>(label)->handle_mousedown_on_label({}, position, button);
-    const_cast<HTML::BrowsingContext&>(browsing_context()).event_handler().set_mouse_event_tracking_layout_node(&const_cast<Layout::TextNode&>(layout_node()));
+    const_cast<HTML::BrowsingContext&>(browsing_context()).event_handler().set_mouse_event_tracking_paintable(this);
     return DispatchEventOfSameName::Yes;
     return DispatchEventOfSameName::Yes;
 }
 }
 
 
@@ -53,7 +53,7 @@ TextPaintable::DispatchEventOfSameName TextPaintable::handle_mouseup(Badge<Event
         return DispatchEventOfSameName::No;
         return DispatchEventOfSameName::No;
 
 
     const_cast<Layout::Label*>(label)->handle_mouseup_on_label({}, position, button);
     const_cast<Layout::Label*>(label)->handle_mouseup_on_label({}, position, button);
-    const_cast<HTML::BrowsingContext&>(browsing_context()).event_handler().set_mouse_event_tracking_layout_node(nullptr);
+    const_cast<HTML::BrowsingContext&>(browsing_context()).event_handler().set_mouse_event_tracking_paintable(nullptr);
     return DispatchEventOfSameName::Yes;
     return DispatchEventOfSameName::Yes;
 }
 }