1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 22:17:45 +00:00

LibWeb: Use JS::SafeFunction in run_timer_initialization_steps()

This commit is contained in:
Andreas Kling 2022-10-16 15:18:07 +02:00
parent a8bdf866d9
commit 57f508f048

View file

@ -189,20 +189,16 @@ i32 Window::run_timer_initialization_steps(TimerHandler handler, i32 timeout, JS
// 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 = [weak_window = make_weak_ptr<Window>(), handler = move(handler), timeout, arguments = move(arguments), repeat, id]() mutable { JS::SafeFunction<void()> task = [this, handler = move(handler), timeout, arguments = move(arguments), repeat, id]() mutable {
JS::GCPtr<Window> window = weak_window.ptr();
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 (!m_timers.contains(id))
return; return;
handler.visit( handler.visit(
// 2. If handler is a Function, then invoke handler given arguments with the callback this value set to thisArg. If this throws an exception, catch it, and report the exception. // 2. If handler is a Function, then invoke handler given arguments with the callback this value set to thisArg. If this throws an exception, catch it, and report the exception.
[&](JS::Handle<WebIDL::CallbackType> callback) { [&](JS::Handle<WebIDL::CallbackType> callback) {
if (auto result = WebIDL::invoke_callback(*callback, window.ptr(), arguments); result.is_error()) if (auto result = WebIDL::invoke_callback(*callback, this, arguments); result.is_error())
HTML::report_exception(result, weak_window->realm()); HTML::report_exception(result, realm());
}, },
// 3. Otherwise: // 3. Otherwise:
[&](String const& source) { [&](String const& source) {
@ -210,10 +206,10 @@ i32 Window::run_timer_initialization_steps(TimerHandler handler, i32 timeout, JS
// FIXME: 2. Perform HostEnsureCanCompileStrings(callerRealm, calleeRealm). If this throws an exception, catch it, report the exception, and abort these steps. // FIXME: 2. Perform HostEnsureCanCompileStrings(callerRealm, calleeRealm). If this throws an exception, catch it, report the exception, and abort these steps.
// 3. Let settings object be global's relevant settings object. // 3. Let settings object be global's relevant settings object.
auto& settings_object = window->associated_document().relevant_settings_object(); auto& settings_object = associated_document().relevant_settings_object();
// 4. Let base URL be initiating script's base URL. // 4. Let base URL be initiating script's base URL.
auto url = window->associated_document().url(); auto url = associated_document().url();
// 5. Assert: base URL is not null, as initiating script is a classic script or a JavaScript module script. // 5. Assert: base URL is not null, as initiating script is a classic script or a JavaScript module script.
@ -226,18 +222,18 @@ i32 Window::run_timer_initialization_steps(TimerHandler handler, i32 timeout, JS
}); });
// 4. If id does not exist in global's map of active timers, then abort these steps. // 4. If id does not exist in global's map of active timers, then abort these steps.
if (!window->m_timers.contains(id)) if (!m_timers.contains(id))
return; return;
switch (repeat) { switch (repeat) {
// 5. If repeat is true, then perform the timer initialization steps again, given global, handler, timeout, arguments, true, and id. // 5. If repeat is true, then perform the timer initialization steps again, given global, handler, timeout, arguments, true, and id.
case Repeat::Yes: case Repeat::Yes:
window->run_timer_initialization_steps(handler, timeout, move(arguments), repeat, id); run_timer_initialization_steps(handler, timeout, move(arguments), repeat, id);
break; break;
// 6. Otherwise, remove global's map of active timers[id]. // 6. Otherwise, remove global's map of active timers[id].
case Repeat::No: case Repeat::No:
window->m_timers.remove(id); m_timers.remove(id);
break; break;
} }
}; };
@ -246,12 +242,8 @@ i32 Window::run_timer_initialization_steps(TimerHandler handler, i32 timeout, JS
// FIXME: 11. Set task's timer nesting level to nesting level. // FIXME: 11. 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 = [weak_window = make_weak_ptr<Window>(), task = move(task)]() mutable { JS::SafeFunction<void()> completion_step = [this, task = move(task)]() mutable {
JS::GCPtr<Window> window = weak_window.ptr(); HTML::queue_global_task(HTML::Task::Source::TimerTask, *this, move(task));
if (!window)
return;
HTML::queue_global_task(HTML::Task::Source::TimerTask, *window, 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.