diff --git a/Userland/Libraries/LibWeb/HTML/WorkerGlobalScope.cpp b/Userland/Libraries/LibWeb/HTML/WorkerGlobalScope.cpp
index 97b0333d873..ec3ce8230fb 100644
--- a/Userland/Libraries/LibWeb/HTML/WorkerGlobalScope.cpp
+++ b/Userland/Libraries/LibWeb/HTML/WorkerGlobalScope.cpp
@@ -70,6 +70,18 @@ void WorkerGlobalScope::set_internal_port(JS::NonnullGCPtr port)
m_internal_port->set_worker_event_target(*this);
}
+// https://html.spec.whatwg.org/multipage/workers.html#close-a-worker
+void WorkerGlobalScope::close()
+{
+ // 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;
+ });
+
+ // 2. Set workerGlobal's closing flag to true. (This prevents any further tasks from being queued.)
+ m_closing = true;
+}
+
// https://html.spec.whatwg.org/multipage/workers.html#importing-scripts-and-libraries
WebIDL::ExceptionOr WorkerGlobalScope::import_scripts(Vector const& urls, PerformTheFetchHook perform_fetch)
{
diff --git a/Userland/Libraries/LibWeb/HTML/WorkerGlobalScope.h b/Userland/Libraries/LibWeb/HTML/WorkerGlobalScope.h
index 813989af8d8..93333b2212e 100644
--- a/Userland/Libraries/LibWeb/HTML/WorkerGlobalScope.h
+++ b/Userland/Libraries/LibWeb/HTML/WorkerGlobalScope.h
@@ -97,6 +97,10 @@ public:
PolicyContainer policy_container() const { return m_policy_container; }
+ bool is_closing() const { return m_closing; }
+
+ void close();
+
protected:
explicit WorkerGlobalScope(JS::Realm&, JS::NonnullGCPtr);
@@ -144,6 +148,9 @@ private:
// https://html.spec.whatwg.org/multipage/workers.html#concept-workerglobalscope-cross-origin-isolated-capability
bool m_cross_origin_isolated_capability { false };
+ // https://html.spec.whatwg.org/multipage/workers.html#dom-workerglobalscope-closing
+ bool m_closing { false };
+
// https://drafts.csswg.org/css-font-loading/#font-source
JS::GCPtr m_fonts;
};