Explorar el Código

LibWeb: Stop timers when finalizing a Window or WorkerGlobalScope

This avoids an assertion that timers are not active when destroyed.
Andreas Kling hace 1 año
padre
commit
40f87f0954

+ 6 - 0
Userland/Libraries/LibWeb/HTML/Window.cpp

@@ -130,6 +130,12 @@ void Window::visit_edges(JS::Cell::Visitor& visitor)
     visitor.visit(m_byte_length_queuing_strategy_size_function);
     visitor.visit(m_byte_length_queuing_strategy_size_function);
 }
 }
 
 
+void Window::finalize()
+{
+    Base::finalize();
+    WindowOrWorkerGlobalScopeMixin::finalize();
+}
+
 Window::~Window() = default;
 Window::~Window() = default;
 
 
 // https://html.spec.whatwg.org/multipage/nav-history-apis.html#normalizing-the-feature-name
 // https://html.spec.whatwg.org/multipage/nav-history-apis.html#normalizing-the-feature-name

+ 1 - 0
Userland/Libraries/LibWeb/HTML/Window.h

@@ -210,6 +210,7 @@ private:
     explicit Window(JS::Realm&);
     explicit Window(JS::Realm&);
 
 
     virtual void visit_edges(Cell::Visitor&) override;
     virtual void visit_edges(Cell::Visitor&) override;
+    virtual void finalize() override;
 
 
     // ^HTML::GlobalEventHandlers
     // ^HTML::GlobalEventHandlers
     virtual DOM::EventTarget& global_event_handlers_to_event_target(FlyString const&) override { return *this; }
     virtual DOM::EventTarget& global_event_handlers_to_event_target(FlyString const&) override { return *this; }

+ 5 - 0
Userland/Libraries/LibWeb/HTML/WindowOrWorkerGlobalScope.cpp

@@ -64,6 +64,11 @@ void WindowOrWorkerGlobalScopeMixin::visit_edges(JS::Cell::Visitor& visitor)
         entry.value.visit_edges(visitor);
         entry.value.visit_edges(visitor);
 }
 }
 
 
+void WindowOrWorkerGlobalScopeMixin::finalize()
+{
+    clear_map_of_active_timers();
+}
+
 // https://html.spec.whatwg.org/multipage/webappapis.html#dom-origin
 // https://html.spec.whatwg.org/multipage/webappapis.html#dom-origin
 WebIDL::ExceptionOr<String> WindowOrWorkerGlobalScopeMixin::origin() const
 WebIDL::ExceptionOr<String> WindowOrWorkerGlobalScopeMixin::origin() const
 {
 {

+ 1 - 0
Userland/Libraries/LibWeb/HTML/WindowOrWorkerGlobalScope.h

@@ -64,6 +64,7 @@ public:
 protected:
 protected:
     void initialize(JS::Realm&);
     void initialize(JS::Realm&);
     void visit_edges(JS::Cell::Visitor&);
     void visit_edges(JS::Cell::Visitor&);
+    void finalize();
 
 
 private:
 private:
     enum class Repeat {
     enum class Repeat {

+ 6 - 0
Userland/Libraries/LibWeb/HTML/WorkerGlobalScope.cpp

@@ -55,6 +55,12 @@ void WorkerGlobalScope::visit_edges(Cell::Visitor& visitor)
     visitor.visit(m_page);
     visitor.visit(m_page);
 }
 }
 
 
+void WorkerGlobalScope::finalize()
+{
+    Base::finalize();
+    WindowOrWorkerGlobalScopeMixin::finalize();
+}
+
 void WorkerGlobalScope::set_internal_port(JS::NonnullGCPtr<MessagePort> port)
 void WorkerGlobalScope::set_internal_port(JS::NonnullGCPtr<MessagePort> port)
 {
 {
     m_internal_port = port;
     m_internal_port = port;

+ 1 - 0
Userland/Libraries/LibWeb/HTML/WorkerGlobalScope.h

@@ -95,6 +95,7 @@ protected:
 
 
 private:
 private:
     virtual void visit_edges(Cell::Visitor&) override;
     virtual void visit_edges(Cell::Visitor&) override;
+    virtual void finalize() override;
 
 
     JS::GCPtr<WorkerLocation> m_location;
     JS::GCPtr<WorkerLocation> m_location;
     JS::GCPtr<WorkerNavigator> m_navigator;
     JS::GCPtr<WorkerNavigator> m_navigator;