From 6f34b52e3999da7bf345cdc5e8b9ce8752b499f5 Mon Sep 17 00:00:00 2001 From: Gregory Terzian Date: Fri, 29 May 2020 18:12:02 +0800 Subject: [PATCH] properly shutdown dedicated workers when the owning scope shuts-down --- components/script/dom/dedicatedworkerglobalscope.rs | 1 + components/script/dom/globalscope.rs | 11 ++++++++++- components/script/dom/window.rs | 4 ++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index edd9d6b9480..c764678b80a 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -460,6 +460,7 @@ impl DedicatedWorkerGlobalScope { parent_sender, CommonScriptMsg::CollectReports, ); + scope.clear_js_runtime(); }) .expect("Thread spawning failed") } diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index 1a66e4d94f9..d03333e8541 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -794,9 +794,18 @@ impl GlobalScope { } /// Remove the routers for ports and broadcast-channels. - pub fn remove_web_messaging_infra(&self) { + /// Drain the list of workers. + pub fn remove_web_messaging_and_dedicated_workers_infra(&self) { self.remove_message_ports_router(); self.remove_broadcast_channel_router(); + + // Drop each ref to a worker explicitly now, + // which will send a shutdown signal, + // and join on the worker thread. + self.list_auto_close_worker + .borrow_mut() + .drain(0..) + .for_each(|worker| drop(worker)); } /// Update our state to un-managed, diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 16126dcf1b9..d7308c7462d 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -1441,8 +1441,8 @@ impl Window { } pub fn clear_js_runtime(&self) { - // Remove the infra for managing messageports and broadcast channels. - self.upcast::().remove_web_messaging_infra(); + self.upcast::() + .remove_web_messaging_and_dedicated_workers_infra(); // Clean up any active promises // https://github.com/servo/servo/issues/15318