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