LibWeb: Don't discard PostedMessage tasks when closing a worker

The spec expects `postMessage()` to act as if it is invoked
immediately. Since `postMessage()` isn't actually invoked immediately,
keep tasks with source `PostedMessage` in the task queue, so that these
tasks are processed. Fixes a hang when `WorkerGlobalScope.close()` is
called immediately after `postMessage()`.
This commit is contained in:
Tim Ledbetter 2024-10-06 22:41:11 +01:00 committed by Andreas Kling
commit fd8d350b47
Notes: github-actions[bot] 2024-10-08 04:52:03 +00:00
5 changed files with 21 additions and 2 deletions

View file

@ -68,8 +68,9 @@ void WorkerGlobalScope::set_internal_port(JS::NonnullGCPtr<MessagePort> port)
void WorkerGlobalScope::close_a_worker()
{
// 1. Discard any tasks that have been added to workerGlobal's relevant agent's event loop's task queues.
relevant_settings_object(*this).responsible_event_loop().task_queue().remove_tasks_matching([](HTML::Task const&) {
return true;
relevant_settings_object(*this).responsible_event_loop().task_queue().remove_tasks_matching([](HTML::Task const& task) {
// NOTE: We don't discard tasks with the PostedMessage source, as the spec expects PostMessage() to act as if it is invoked immediately
return task.source() != HTML::Task::Source::PostedMessage;
});
// 2. Set workerGlobal's closing flag to true. (This prevents any further tasks from being queued.)