From 41f3817b36f4dd08f3d3ce612adfd6bad2a59950 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 18 Mar 2020 20:05:15 +0100 Subject: [PATCH] LibWeb: Use a JS::Handle to keep the EventListener function alive --- Libraries/LibWeb/Bindings/EventListenerWrapper.cpp | 6 ------ Libraries/LibWeb/Bindings/EventListenerWrapper.h | 1 - Libraries/LibWeb/Bindings/EventTargetWrapper.cpp | 4 ++-- Libraries/LibWeb/DOM/EventListener.cpp | 11 +++++++++++ Libraries/LibWeb/DOM/EventListener.h | 10 +++++----- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Libraries/LibWeb/Bindings/EventListenerWrapper.cpp b/Libraries/LibWeb/Bindings/EventListenerWrapper.cpp index d01d5fa15b..0948d29d45 100644 --- a/Libraries/LibWeb/Bindings/EventListenerWrapper.cpp +++ b/Libraries/LibWeb/Bindings/EventListenerWrapper.cpp @@ -14,11 +14,5 @@ EventListenerWrapper::~EventListenerWrapper() { } -void EventListenerWrapper::visit_children(JS::Cell::Visitor& visitor) -{ - Wrapper::visit_children(visitor); - visitor.visit(impl().function()); -} - } } diff --git a/Libraries/LibWeb/Bindings/EventListenerWrapper.h b/Libraries/LibWeb/Bindings/EventListenerWrapper.h index c3a3bcc86d..c049275816 100644 --- a/Libraries/LibWeb/Bindings/EventListenerWrapper.h +++ b/Libraries/LibWeb/Bindings/EventListenerWrapper.h @@ -41,7 +41,6 @@ public: private: virtual const char* class_name() const override { return "EventListenerWrapper"; } - virtual void visit_children(JS::Cell::Visitor&) override; NonnullRefPtr m_impl; }; diff --git a/Libraries/LibWeb/Bindings/EventTargetWrapper.cpp b/Libraries/LibWeb/Bindings/EventTargetWrapper.cpp index 0d92f395e4..0d30ec086f 100644 --- a/Libraries/LibWeb/Bindings/EventTargetWrapper.cpp +++ b/Libraries/LibWeb/Bindings/EventTargetWrapper.cpp @@ -18,8 +18,8 @@ EventTargetWrapper::EventTargetWrapper(EventTarget& impl) auto event_name = arguments[0].to_string(); ASSERT(arguments[1].is_object()); ASSERT(arguments[1].as_object()->is_function()); - auto listener = adopt(*new EventListener(static_cast(const_cast(arguments[1].as_object())))); - wrap(this_object->heap(), *listener); + auto* function = static_cast(const_cast(arguments[1].as_object())); + auto listener = adopt(*new EventListener(JS::make_handle(function))); static_cast(this_object)->impl().add_event_listener(event_name, move(listener)); return JS::js_undefined(); }); diff --git a/Libraries/LibWeb/DOM/EventListener.cpp b/Libraries/LibWeb/DOM/EventListener.cpp index e69de29bb2..4cad68964a 100644 --- a/Libraries/LibWeb/DOM/EventListener.cpp +++ b/Libraries/LibWeb/DOM/EventListener.cpp @@ -0,0 +1,11 @@ +#include +#include + +namespace Web { + +JS::Function* EventListener::function() +{ + return m_function.cell(); +} + +} diff --git a/Libraries/LibWeb/DOM/EventListener.h b/Libraries/LibWeb/DOM/EventListener.h index e6e3a8ede9..1c32d919b7 100644 --- a/Libraries/LibWeb/DOM/EventListener.h +++ b/Libraries/LibWeb/DOM/EventListener.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include namespace Web { @@ -12,15 +12,15 @@ class EventListener public: using WrapperType = Bindings::EventListenerWrapper; - explicit EventListener(JS::Function* function) - : m_function(function) + explicit EventListener(JS::Handle function) + : m_function(move(function)) { } - JS::Function* function() { return m_function; } + JS::Function* function(); private: - JS::Function* m_function { nullptr }; + JS::Handle m_function; }; }