mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-25 09:00:22 +00:00
LibWeb: Use HeapFunction for Platform::Timer
This commit is contained in:
parent
ede3c91688
commit
de1a805898
Notes:
github-actions[bot]
2024-10-30 19:57:21 +00:00
Author: https://github.com/shannonbooth Commit: https://github.com/LadybirdBrowser/ladybird/commit/de1a805898a Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2062 Reviewed-by: https://github.com/kalenikaliaksandr ✅
8 changed files with 28 additions and 18 deletions
|
@ -63,7 +63,7 @@ void ImageStyleValue::load_any_resources(DOM::Document& document)
|
||||||
if (image_data->is_animated() && image_data->frame_count() > 1) {
|
if (image_data->is_animated() && image_data->frame_count() > 1) {
|
||||||
m_timer = Platform::Timer::create(m_document->heap());
|
m_timer = Platform::Timer::create(m_document->heap());
|
||||||
m_timer->set_interval(image_data->frame_duration(0));
|
m_timer->set_interval(image_data->frame_duration(0));
|
||||||
m_timer->on_timeout = [this] { animate(); };
|
m_timer->on_timeout = JS::create_heap_function(m_document->heap(), [this] { animate(); });
|
||||||
m_timer->start();
|
m_timer->start();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -54,9 +54,9 @@ void EventLoop::visit_edges(Visitor& visitor)
|
||||||
void EventLoop::schedule()
|
void EventLoop::schedule()
|
||||||
{
|
{
|
||||||
if (!m_system_event_loop_timer) {
|
if (!m_system_event_loop_timer) {
|
||||||
m_system_event_loop_timer = Platform::Timer::create_single_shot(heap(), 0, [this] {
|
m_system_event_loop_timer = Platform::Timer::create_single_shot(heap(), 0, JS::create_heap_function(heap(), [this] {
|
||||||
process();
|
process();
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_system_event_loop_timer->is_active())
|
if (!m_system_event_loop_timer->is_active())
|
||||||
|
|
|
@ -415,12 +415,12 @@ void ResourceLoader::load(LoadRequest& request, SuccessCallback success_callback
|
||||||
|
|
||||||
if (timeout.has_value() && timeout.value() > 0) {
|
if (timeout.has_value() && timeout.value() > 0) {
|
||||||
auto timer = Platform::Timer::create_single_shot(m_heap, timeout.value(), nullptr);
|
auto timer = Platform::Timer::create_single_shot(m_heap, timeout.value(), nullptr);
|
||||||
timer->on_timeout = [timer, protocol_request, timeout_callback = move(timeout_callback)] {
|
timer->on_timeout = JS::create_heap_function(m_heap, [timer = JS::make_handle(timer), protocol_request, timeout_callback = move(timeout_callback)] {
|
||||||
(void)timer;
|
(void)timer;
|
||||||
protocol_request->stop();
|
protocol_request->stop();
|
||||||
if (timeout_callback)
|
if (timeout_callback)
|
||||||
timeout_callback();
|
timeout_callback();
|
||||||
};
|
});
|
||||||
timer->start();
|
timer->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <LibJS/Heap/HeapFunction.h>
|
||||||
#include <LibWeb/Platform/EventLoopPlugin.h>
|
#include <LibWeb/Platform/EventLoopPlugin.h>
|
||||||
#include <LibWeb/Platform/Timer.h>
|
#include <LibWeb/Platform/Timer.h>
|
||||||
|
|
||||||
|
@ -11,12 +12,18 @@ namespace Web::Platform {
|
||||||
|
|
||||||
Timer::~Timer() = default;
|
Timer::~Timer() = default;
|
||||||
|
|
||||||
|
void Timer::visit_edges(JS::Cell::Visitor& visitor)
|
||||||
|
{
|
||||||
|
Base::visit_edges(visitor);
|
||||||
|
visitor.visit(on_timeout);
|
||||||
|
}
|
||||||
|
|
||||||
JS::NonnullGCPtr<Timer> Timer::create(JS::Heap& heap)
|
JS::NonnullGCPtr<Timer> Timer::create(JS::Heap& heap)
|
||||||
{
|
{
|
||||||
return EventLoopPlugin::the().create_timer(heap);
|
return EventLoopPlugin::the().create_timer(heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
JS::NonnullGCPtr<Timer> Timer::create_repeating(JS::Heap& heap, int interval_ms, JS::SafeFunction<void()>&& timeout_handler)
|
JS::NonnullGCPtr<Timer> Timer::create_repeating(JS::Heap& heap, int interval_ms, JS::GCPtr<JS::HeapFunction<void()>> timeout_handler)
|
||||||
{
|
{
|
||||||
auto timer = EventLoopPlugin::the().create_timer(heap);
|
auto timer = EventLoopPlugin::the().create_timer(heap);
|
||||||
timer->set_single_shot(false);
|
timer->set_single_shot(false);
|
||||||
|
@ -25,7 +32,7 @@ JS::NonnullGCPtr<Timer> Timer::create_repeating(JS::Heap& heap, int interval_ms,
|
||||||
return timer;
|
return timer;
|
||||||
}
|
}
|
||||||
|
|
||||||
JS::NonnullGCPtr<Timer> Timer::create_single_shot(JS::Heap& heap, int interval_ms, JS::SafeFunction<void()>&& timeout_handler)
|
JS::NonnullGCPtr<Timer> Timer::create_single_shot(JS::Heap& heap, int interval_ms, JS::GCPtr<JS::HeapFunction<void()>> timeout_handler)
|
||||||
{
|
{
|
||||||
auto timer = EventLoopPlugin::the().create_timer(heap);
|
auto timer = EventLoopPlugin::the().create_timer(heap);
|
||||||
timer->set_single_shot(true);
|
timer->set_single_shot(true);
|
||||||
|
|
|
@ -17,8 +17,8 @@ class Timer : public JS::Cell {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static JS::NonnullGCPtr<Timer> create(JS::Heap&);
|
static JS::NonnullGCPtr<Timer> create(JS::Heap&);
|
||||||
static JS::NonnullGCPtr<Timer> create_repeating(JS::Heap&, int interval_ms, JS::SafeFunction<void()>&& timeout_handler);
|
static JS::NonnullGCPtr<Timer> create_repeating(JS::Heap&, int interval_ms, JS::GCPtr<JS::HeapFunction<void()>> timeout_handler);
|
||||||
static JS::NonnullGCPtr<Timer> create_single_shot(JS::Heap&, int interval_ms, JS::SafeFunction<void()>&& timeout_handler);
|
static JS::NonnullGCPtr<Timer> create_single_shot(JS::Heap&, int interval_ms, JS::GCPtr<JS::HeapFunction<void()>> timeout_handler);
|
||||||
|
|
||||||
virtual ~Timer();
|
virtual ~Timer();
|
||||||
|
|
||||||
|
@ -37,7 +37,10 @@ public:
|
||||||
virtual bool is_single_shot() const = 0;
|
virtual bool is_single_shot() const = 0;
|
||||||
virtual void set_single_shot(bool) = 0;
|
virtual void set_single_shot(bool) = 0;
|
||||||
|
|
||||||
JS::SafeFunction<void()> on_timeout;
|
JS::GCPtr<JS::HeapFunction<void()>> on_timeout;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void visit_edges(JS::Cell::Visitor&) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "TimerSerenity.h"
|
#include "TimerSerenity.h"
|
||||||
#include <AK/NonnullRefPtr.h>
|
|
||||||
#include <LibCore/Timer.h>
|
#include <LibCore/Timer.h>
|
||||||
#include <LibJS/Heap/Heap.h>
|
#include <LibJS/Heap/Heap.h>
|
||||||
|
#include <LibJS/Heap/HeapFunction.h>
|
||||||
|
|
||||||
namespace Web::Platform {
|
namespace Web::Platform {
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ TimerSerenity::TimerSerenity()
|
||||||
{
|
{
|
||||||
m_timer->on_timeout = [this] {
|
m_timer->on_timeout = [this] {
|
||||||
if (on_timeout)
|
if (on_timeout)
|
||||||
on_timeout();
|
on_timeout->function()();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -879,14 +879,14 @@ WebIDL::ExceptionOr<void> XMLHttpRequest::send(Optional<DocumentOrXMLHttpRequest
|
||||||
auto timer = Platform::Timer::create_single_shot(heap(), m_timeout, nullptr);
|
auto timer = Platform::Timer::create_single_shot(heap(), m_timeout, nullptr);
|
||||||
|
|
||||||
// NOTE: `timer` is kept alive by capturing into the lambda for the GC to see
|
// NOTE: `timer` is kept alive by capturing into the lambda for the GC to see
|
||||||
// NOTE: `this` and `request` is kept alive by Platform::Timer using JS::SafeFunction.
|
// NOTE: `this` and `request` is kept alive by Platform::Timer using a Handle.
|
||||||
timer->on_timeout = [this, request, timer]() {
|
timer->on_timeout = JS::create_heap_function(heap(), [this, request, timer = JS::make_handle(timer)]() {
|
||||||
(void)timer;
|
(void)timer;
|
||||||
if (!request->done()) {
|
if (!request->done()) {
|
||||||
m_timed_out = true;
|
m_timed_out = true;
|
||||||
m_fetch_controller->terminate();
|
m_fetch_controller->terminate();
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
timer->start();
|
timer->start();
|
||||||
}
|
}
|
||||||
|
@ -933,10 +933,10 @@ WebIDL::ExceptionOr<void> XMLHttpRequest::send(Optional<DocumentOrXMLHttpRequest
|
||||||
auto timer = Platform::Timer::create_single_shot(heap(), m_timeout, nullptr);
|
auto timer = Platform::Timer::create_single_shot(heap(), m_timeout, nullptr);
|
||||||
|
|
||||||
// NOTE: `timer` is kept alive by capturing into the lambda for the GC to see
|
// NOTE: `timer` is kept alive by capturing into the lambda for the GC to see
|
||||||
timer->on_timeout = [timer, &did_time_out]() {
|
timer->on_timeout = JS::create_heap_function(heap(), [timer = JS::make_handle(timer), &did_time_out]() {
|
||||||
(void)timer;
|
(void)timer;
|
||||||
did_time_out = true;
|
did_time_out = true;
|
||||||
};
|
});
|
||||||
|
|
||||||
timer->start();
|
timer->start();
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ ConnectionFromClient::ConnectionFromClient(JS::Heap& heap, IPC::Transport transp
|
||||||
, m_heap(heap)
|
, m_heap(heap)
|
||||||
, m_page_host(PageHost::create(*this))
|
, m_page_host(PageHost::create(*this))
|
||||||
{
|
{
|
||||||
m_input_event_queue_timer = Web::Platform::Timer::create_single_shot(m_heap, 0, [this] { process_next_input_event(); });
|
m_input_event_queue_timer = Web::Platform::Timer::create_single_shot(m_heap, 0, JS::create_heap_function(heap, [this] { process_next_input_event(); }));
|
||||||
}
|
}
|
||||||
|
|
||||||
ConnectionFromClient::~ConnectionFromClient() = default;
|
ConnectionFromClient::~ConnectionFromClient() = default;
|
||||||
|
|
Loading…
Reference in a new issue