aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/workerglobalscope.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/workerglobalscope.rs')
-rw-r--r--components/script/dom/workerglobalscope.rs50
1 files changed, 10 insertions, 40 deletions
diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs
index 7fd73750de7..abe993ad06a 100644
--- a/components/script/dom/workerglobalscope.rs
+++ b/components/script/dom/workerglobalscope.rs
@@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use std::cell::{RefCell, RefMut};
+use std::cell::{OnceCell, RefCell, RefMut};
use std::default::Default;
use std::rc::Rc;
use std::sync::atomic::{AtomicBool, Ordering};
@@ -44,7 +44,7 @@ use crate::dom::bindings::reflector::DomObject;
use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::bindings::settings_stack::AutoEntryScript;
use crate::dom::bindings::str::{DOMString, USVString};
-use crate::dom::bindings::trace::RootedTraceableBox;
+use crate::dom::bindings::trace::{CustomTraceable, RootedTraceableBox};
use crate::dom::crypto::Crypto;
use crate::dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope;
use crate::dom::globalscope::GlobalScope;
@@ -60,14 +60,7 @@ use crate::fetch;
use crate::realms::{enter_realm, InRealm};
use crate::script_runtime::{CanGc, CommonScriptMsg, JSContext, Runtime, ScriptChan, ScriptPort};
use crate::task::TaskCanceller;
-use crate::task_source::dom_manipulation::DOMManipulationTaskSource;
-use crate::task_source::file_reading::FileReadingTaskSource;
-use crate::task_source::networking::NetworkingTaskSource;
-use crate::task_source::performance_timeline::PerformanceTimelineTaskSource;
-use crate::task_source::port_message::PortMessageQueue;
-use crate::task_source::remote_event::RemoteEventTaskSource;
-use crate::task_source::timer::TimerTaskSource;
-use crate::task_source::websocket::WebsocketTaskSource;
+use crate::task_manager::TaskManager;
use crate::timers::{IsInterval, TimerCallback};
pub fn prepare_workerscope_init(
@@ -135,6 +128,9 @@ pub struct WorkerGlobalScope {
/// Timers are handled in the service worker event loop.
#[no_trace]
timer_scheduler: RefCell<TimerScheduler>,
+
+ /// A [`TaskManager`] for this [`WorkerGlobalScope`].
+ task_manager: OnceCell<TaskManager>,
}
impl WorkerGlobalScope {
@@ -189,6 +185,7 @@ impl WorkerGlobalScope {
navigation_start: CrossProcessInstant::now(),
performance: Default::default(),
timer_scheduler: RefCell::default(),
+ task_manager: Default::default(),
}
}
@@ -510,36 +507,9 @@ impl WorkerGlobalScope {
}
}
- pub fn dom_manipulation_task_source(&self) -> DOMManipulationTaskSource {
- DOMManipulationTaskSource(self.script_chan(), self.pipeline_id())
- }
-
- pub fn file_reading_task_source(&self) -> FileReadingTaskSource {
- FileReadingTaskSource(self.script_chan(), self.pipeline_id())
- }
-
- pub fn networking_task_source(&self) -> NetworkingTaskSource {
- NetworkingTaskSource(self.script_chan(), self.pipeline_id())
- }
-
- pub fn performance_timeline_task_source(&self) -> PerformanceTimelineTaskSource {
- PerformanceTimelineTaskSource(self.script_chan(), self.pipeline_id())
- }
-
- pub fn port_message_queue(&self) -> PortMessageQueue {
- PortMessageQueue(self.script_chan(), self.pipeline_id())
- }
-
- pub fn timer_task_source(&self) -> TimerTaskSource {
- TimerTaskSource(self.script_chan(), self.pipeline_id())
- }
-
- pub fn remote_event_task_source(&self) -> RemoteEventTaskSource {
- RemoteEventTaskSource(self.script_chan(), self.pipeline_id())
- }
-
- pub fn websocket_task_source(&self) -> WebsocketTaskSource {
- WebsocketTaskSource(self.script_chan(), self.pipeline_id())
+ pub(crate) fn task_manager(&self) -> &TaskManager {
+ self.task_manager
+ .get_or_init(|| TaskManager::new(self.script_chan(), self.pipeline_id()))
}
pub fn new_script_pair(&self) -> (Box<dyn ScriptChan + Send>, Box<dyn ScriptPort + Send>) {