diff --git a/Libraries/LibWeb/HTML/RenderingThread.cpp b/Libraries/LibWeb/HTML/RenderingThread.cpp
index 89432dc462b..71c3d64c2c9 100644
--- a/Libraries/LibWeb/HTML/RenderingThread.cpp
+++ b/Libraries/LibWeb/HTML/RenderingThread.cpp
@@ -13,7 +13,15 @@ namespace Web::HTML {
RenderingThread::RenderingThread()
: m_main_thread_event_loop(Core::EventLoop::current())
+ , m_main_thread_exit_promise(Core::Promise>::construct())
{
+ // FIXME: Come up with a better "event loop exited" notification mechanism.
+ m_main_thread_exit_promise->on_rejection = [this](Error const&) -> void {
+ Threading::MutexLocker const locker { m_rendering_task_mutex };
+ m_exit = true;
+ m_rendering_task_ready_wake_condition.signal();
+ };
+ m_main_thread_event_loop.add_job(m_main_thread_exit_promise);
}
RenderingThread::~RenderingThread()
@@ -58,6 +66,8 @@ void RenderingThread::rendering_thread_loop()
auto painting_surface = painting_surface_for_backing_store(task->backing_store);
m_skia_player->execute(*task->display_list, task->scroll_state_snapshot, painting_surface);
+ if (m_exit)
+ break;
m_main_thread_event_loop.deferred_invoke([callback = move(task->callback)] {
callback();
});
diff --git a/Libraries/LibWeb/HTML/RenderingThread.h b/Libraries/LibWeb/HTML/RenderingThread.h
index f5e0373d68f..7cb92cc61fc 100644
--- a/Libraries/LibWeb/HTML/RenderingThread.h
+++ b/Libraries/LibWeb/HTML/RenderingThread.h
@@ -8,6 +8,7 @@
#include
#include
+#include
#include
#include
#include
@@ -43,6 +44,7 @@ private:
RefPtr m_thread;
Atomic m_exit { false };
+ NonnullRefPtr>> m_main_thread_exit_promise;
struct Task {
NonnullRefPtr display_list;