diff --git a/Libraries/LibWeb/DOM/EditingHostManager.h b/Libraries/LibWeb/DOM/EditingHostManager.h index 283aca0e825..dd6dc179bf5 100644 --- a/Libraries/LibWeb/DOM/EditingHostManager.h +++ b/Libraries/LibWeb/DOM/EditingHostManager.h @@ -14,7 +14,8 @@ namespace Web::DOM { -class EditingHostManager : public JS::Cell +class EditingHostManager + : public JS::Cell , public InputEventsTarget { GC_CELL(EditingHostManager, JS::Cell); GC_DECLARE_ALLOCATOR(EditingHostManager); @@ -45,6 +46,8 @@ public: private: EditingHostManager(GC::Ref); + virtual GC::Ref as_cell() override { return *this; } + GC::Ref m_document; GC::Ptr m_active_contenteditable_element; }; diff --git a/Libraries/LibWeb/DOM/InputEventsTarget.h b/Libraries/LibWeb/DOM/InputEventsTarget.h index 95a32b3dd62..58b007fb5ce 100644 --- a/Libraries/LibWeb/DOM/InputEventsTarget.h +++ b/Libraries/LibWeb/DOM/InputEventsTarget.h @@ -15,6 +15,8 @@ class InputEventsTarget { public: virtual ~InputEventsTarget() = default; + virtual GC::Ref as_cell() = 0; + virtual void handle_insert(String const&) = 0; virtual void handle_return_key() = 0; diff --git a/Libraries/LibWeb/HTML/FormAssociatedElement.cpp b/Libraries/LibWeb/HTML/FormAssociatedElement.cpp index 0887c8824e7..3bc1cd8f39d 100644 --- a/Libraries/LibWeb/HTML/FormAssociatedElement.cpp +++ b/Libraries/LibWeb/HTML/FormAssociatedElement.cpp @@ -969,4 +969,9 @@ GC::Ptr FormAssociatedTextControlElement::cursor_position() const return nullptr; } +GC::Ref FormAssociatedTextControlElement::as_cell() +{ + return form_associated_element_to_html_element(); +} + } diff --git a/Libraries/LibWeb/HTML/FormAssociatedElement.h b/Libraries/LibWeb/HTML/FormAssociatedElement.h index 6536283174e..b9975bc42c6 100644 --- a/Libraries/LibWeb/HTML/FormAssociatedElement.h +++ b/Libraries/LibWeb/HTML/FormAssociatedElement.h @@ -160,7 +160,8 @@ enum class SelectionSource { DOM, }; -class FormAssociatedTextControlElement : public FormAssociatedElement +class FormAssociatedTextControlElement + : public FormAssociatedElement , public InputEventsTarget { public: // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#concept-textarea/input-relevant-value @@ -231,6 +232,8 @@ protected: void relevant_value_was_changed(); private: + virtual GC::Ref as_cell() override; + void collapse_selection_to_offset(size_t); void selection_was_changed(); diff --git a/Libraries/LibWeb/Page/EventHandler.cpp b/Libraries/LibWeb/Page/EventHandler.cpp index 4076719dda9..2a19aaa2029 100644 --- a/Libraries/LibWeb/Page/EventHandler.cpp +++ b/Libraries/LibWeb/Page/EventHandler.cpp @@ -1375,6 +1375,9 @@ void EventHandler::visit_edges(JS::Cell::Visitor& visitor) const { m_drag_and_drop_event_handler->visit_edges(visitor); visitor.visit(m_mouse_event_tracking_paintable); + + if (m_mouse_selection_target) + visitor.visit(m_mouse_selection_target->as_cell()); } Unicode::Segmenter& EventHandler::word_segmenter() diff --git a/Tests/LibWeb/Text/expected/UIEvents/gc-mouse-selection-target.txt b/Tests/LibWeb/Text/expected/UIEvents/gc-mouse-selection-target.txt new file mode 100644 index 00000000000..aaecaf93c4a --- /dev/null +++ b/Tests/LibWeb/Text/expected/UIEvents/gc-mouse-selection-target.txt @@ -0,0 +1 @@ +PASS (didn't crash) diff --git a/Tests/LibWeb/Text/input/UIEvents/gc-mouse-selection-target.html b/Tests/LibWeb/Text/input/UIEvents/gc-mouse-selection-target.html new file mode 100644 index 00000000000..a8ff1965de5 --- /dev/null +++ b/Tests/LibWeb/Text/input/UIEvents/gc-mouse-selection-target.html @@ -0,0 +1,37 @@ + + + +