From 807891c0df081084abf6227c05e7ce489fe29508 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 4 Apr 2023 09:02:00 -0400 Subject: [PATCH] LibWeb: Support unique task sources Some elements, like HTMLMediaElement, must have a unique task sources for every instance of that element that is created. Support this with a simple wrapper around IDAllocator. --- Userland/Libraries/LibWeb/HTML/EventLoop/Task.cpp | 13 +++++++++++++ Userland/Libraries/LibWeb/HTML/EventLoop/Task.h | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/Userland/Libraries/LibWeb/HTML/EventLoop/Task.cpp b/Userland/Libraries/LibWeb/HTML/EventLoop/Task.cpp index 91f89765a4..60471f68d2 100644 --- a/Userland/Libraries/LibWeb/HTML/EventLoop/Task.cpp +++ b/Userland/Libraries/LibWeb/HTML/EventLoop/Task.cpp @@ -4,11 +4,14 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include namespace Web::HTML { +static IDAllocator s_unique_task_source_allocator { static_cast(Task::Source::UniqueTaskSourceStart) }; + Task::Task(Source source, DOM::Document const* document, JS::SafeFunction steps) : m_source(source) , m_steps(move(steps)) @@ -35,4 +38,14 @@ DOM::Document const* Task::document() const return m_document.ptr(); } +UniqueTaskSource::UniqueTaskSource() + : source(static_cast(s_unique_task_source_allocator.allocate())) +{ +} + +UniqueTaskSource::~UniqueTaskSource() +{ + s_unique_task_source_allocator.deallocate(static_cast(source)); +} + } diff --git a/Userland/Libraries/LibWeb/HTML/EventLoop/Task.h b/Userland/Libraries/LibWeb/HTML/EventLoop/Task.h index a850df2152..98f8ca3b1e 100644 --- a/Userland/Libraries/LibWeb/HTML/EventLoop/Task.h +++ b/Userland/Libraries/LibWeb/HTML/EventLoop/Task.h @@ -15,6 +15,8 @@ namespace Web::HTML { +struct UniqueTaskSource; + class Task { public: // https://html.spec.whatwg.org/multipage/webappapis.html#generic-task-sources @@ -29,6 +31,10 @@ public: Microtask, TimerTask, JavaScriptEngine, + + // Some elements, such as the HTMLMediaElement, must have a unique task source per instance. + // Keep this field last, to serve as the base value of all unique task sources. + UniqueTaskSourceStart, }; static NonnullOwnPtr create(Source source, DOM::Document const* document, JS::SafeFunction steps) @@ -52,4 +58,11 @@ private: JS::Handle m_document; }; +struct UniqueTaskSource { + UniqueTaskSource(); + ~UniqueTaskSource(); + + Task::Source const source; +}; + }