mirror of
https://github.com/RGBCube/serenity
synced 2025-05-20 17:05:07 +00:00
LibWeb: Weakly store a reference to the Window object in timer tasks
This prevents a crash when refreshing or navigating away from the Acid3 test page while it is actively running.
This commit is contained in:
parent
02004b7055
commit
430559ea51
2 changed files with 13 additions and 5 deletions
|
@ -200,7 +200,11 @@ i32 Window::run_timer_initialization_steps(Bindings::TimerHandler handler, i32 t
|
||||||
// 8. Assert: initiating script is not null, since this algorithm is always called from some script.
|
// 8. Assert: initiating script is not null, since this algorithm is always called from some script.
|
||||||
|
|
||||||
// 9. Let task be a task that runs the following substeps:
|
// 9. Let task be a task that runs the following substeps:
|
||||||
auto task = [window = NonnullRefPtr(*this), handler = move(handler), timeout, arguments = move(arguments), repeat, id]() mutable {
|
auto task = [weak_window = make_weak_ptr(), handler = move(handler), timeout, arguments = move(arguments), repeat, id]() mutable {
|
||||||
|
auto window = weak_window.strong_ref();
|
||||||
|
if (!window)
|
||||||
|
return;
|
||||||
|
|
||||||
// 1. If id does not exist in global's map of active timers, then abort these steps.
|
// 1. If id does not exist in global's map of active timers, then abort these steps.
|
||||||
if (!window->m_timers.contains(id))
|
if (!window->m_timers.contains(id))
|
||||||
return;
|
return;
|
||||||
|
@ -253,10 +257,12 @@ i32 Window::run_timer_initialization_steps(Bindings::TimerHandler handler, i32 t
|
||||||
// 11. FIXME: Set task's timer nesting level to nesting level.
|
// 11. FIXME: Set task's timer nesting level to nesting level.
|
||||||
|
|
||||||
// 12. Let completionStep be an algorithm step which queues a global task on the timer task source given global to run task.
|
// 12. Let completionStep be an algorithm step which queues a global task on the timer task source given global to run task.
|
||||||
auto completion_step = [window = NonnullRefPtr(*this), task = move(task)]() mutable {
|
auto completion_step = [weak_window = make_weak_ptr(), task = move(task)]() mutable {
|
||||||
HTML::queue_global_task(HTML::Task::Source::TimerTask, *window->wrapper(), [task = move(task)]() mutable {
|
auto window = weak_window.strong_ref();
|
||||||
task();
|
if (!window)
|
||||||
});
|
return;
|
||||||
|
|
||||||
|
HTML::queue_global_task(HTML::Task::Source::TimerTask, *window->wrapper(), move(task));
|
||||||
};
|
};
|
||||||
|
|
||||||
// 13. Run steps after a timeout given global, "setTimeout/setInterval", timeout, completionStep, and id.
|
// 13. Run steps after a timeout given global, "setTimeout/setInterval", timeout, completionStep, and id.
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <AK/IDAllocator.h>
|
#include <AK/IDAllocator.h>
|
||||||
#include <AK/RefCounted.h>
|
#include <AK/RefCounted.h>
|
||||||
#include <AK/RefPtr.h>
|
#include <AK/RefPtr.h>
|
||||||
|
#include <AK/Weakable.h>
|
||||||
#include <LibWeb/Bindings/WindowObject.h>
|
#include <LibWeb/Bindings/WindowObject.h>
|
||||||
#include <LibWeb/Bindings/Wrappable.h>
|
#include <LibWeb/Bindings/Wrappable.h>
|
||||||
#include <LibWeb/CSS/MediaQueryList.h>
|
#include <LibWeb/CSS/MediaQueryList.h>
|
||||||
|
@ -26,6 +27,7 @@ class RequestAnimationFrameCallback;
|
||||||
|
|
||||||
class Window final
|
class Window final
|
||||||
: public RefCounted<Window>
|
: public RefCounted<Window>
|
||||||
|
, public Weakable<Window>
|
||||||
, public DOM::EventTarget
|
, public DOM::EventTarget
|
||||||
, public HTML::GlobalEventHandlers {
|
, public HTML::GlobalEventHandlers {
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue