1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:38:11 +00:00

LibWeb: Clear all active timers when document is destroyed

This change implements a step from the document's destroy procedure in
the specification, saying that all active timers should be cleared.

By doing this, we also fix the leaking of a document in case where we
have navigated away from a page that has scheduled timers that haven't
yet been triggered.
This commit is contained in:
Aliaksandr Kalenik 2023-09-26 11:44:56 +02:00 committed by Andreas Kling
parent 73ef102b01
commit 67c727177e
6 changed files with 44 additions and 1 deletions

View file

@ -183,15 +183,26 @@ i32 WindowOrWorkerGlobalScopeMixin::set_interval(TimerHandler handler, i32 timeo
// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-cleartimeout
void WindowOrWorkerGlobalScopeMixin::clear_timeout(i32 id)
{
if (auto timer = m_timers.get(id); timer.has_value())
timer.value()->stop();
m_timers.remove(id);
}
// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-clearinterval
void WindowOrWorkerGlobalScopeMixin::clear_interval(i32 id)
{
if (auto timer = m_timers.get(id); timer.has_value())
timer.value()->stop();
m_timers.remove(id);
}
void WindowOrWorkerGlobalScopeMixin::clear_map_of_active_timers()
{
for (auto& it : m_timers)
it.value->stop();
m_timers.clear();
}
// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timer-initialisation-steps
// With no active script fix from https://github.com/whatwg/html/pull/9712
i32 WindowOrWorkerGlobalScopeMixin::run_timer_initialization_steps(TimerHandler handler, i32 timeout, JS::MarkedVector<JS::Value> arguments, Repeat repeat, Optional<i32> previous_id)