aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/body.rs7
-rw-r--r--components/script/dom/abstractworkerglobalscope.rs4
-rw-r--r--components/script/dom/analysernode.rs1
-rw-r--r--components/script/dom/audiocontext.rs1
-rw-r--r--components/script/dom/audioscheduledsourcenode.rs1
-rw-r--r--components/script/dom/audiotracklist.rs1
-rw-r--r--components/script/dom/baseaudiocontext.rs1
-rw-r--r--components/script/dom/bluetooth.rs2
-rw-r--r--components/script/dom/dedicatedworkerglobalscope.rs12
-rw-r--r--components/script/dom/document.rs2
-rw-r--r--components/script/dom/eventsource.rs12
-rw-r--r--components/script/dom/filereader.rs38
-rw-r--r--components/script/dom/gamepadhapticactuator.rs15
-rw-r--r--components/script/dom/globalscope.rs151
-rw-r--r--components/script/dom/htmldetailselement.rs1
-rw-r--r--components/script/dom/htmlformelement.rs1
-rw-r--r--components/script/dom/htmlimageelement.rs1
-rw-r--r--components/script/dom/htmlmediaelement.rs1
-rw-r--r--components/script/dom/htmlscriptelement.rs5
-rw-r--r--components/script/dom/offlineaudiocontext.rs1
-rw-r--r--components/script/dom/performance.rs26
-rw-r--r--components/script/dom/rtcpeerconnection.rs3
-rw-r--r--components/script/dom/selection.rs1
-rw-r--r--components/script/dom/serviceworkercontainer.rs5
-rw-r--r--components/script/dom/serviceworkerglobalscope.rs2
-rw-r--r--components/script/dom/storage.rs1
-rw-r--r--components/script/dom/subtlecrypto.rs5
-rw-r--r--components/script/dom/texttracklist.rs1
-rw-r--r--components/script/dom/videotracklist.rs1
-rw-r--r--components/script/dom/webglquery.rs1
-rw-r--r--components/script/dom/webglsync.rs1
-rw-r--r--components/script/dom/webgpu/gpu.rs7
-rw-r--r--components/script/dom/websocket.rs37
-rw-r--r--components/script/dom/webxr/fakexrdevice.rs1
-rw-r--r--components/script/dom/webxr/xrsession.rs1
-rw-r--r--components/script/dom/webxr/xrsystem.rs1
-rw-r--r--components/script/dom/webxr/xrtest.rs1
-rw-r--r--components/script/dom/window.rs2
-rw-r--r--components/script/dom/workerglobalscope.rs50
-rw-r--r--components/script/dom/xmlhttprequest.rs17
-rw-r--r--components/script/fetch.rs2
-rw-r--r--components/script/image_listener.rs1
-rw-r--r--components/script/links.rs1
-rw-r--r--components/script/messaging.rs4
-rw-r--r--components/script/network_listener.rs3
-rw-r--r--components/script/script_module.rs2
-rw-r--r--components/script/script_runtime.rs30
-rw-r--r--components/script/script_thread.rs14
-rw-r--r--components/script/task_manager.rs169
-rw-r--r--components/script/task_source.rs174
-rw-r--r--components/script/task_source/dom_manipulation.rs76
-rw-r--r--components/script/task_source/file_reading.rs72
-rw-r--r--components/script/task_source/gamepad.rs47
-rw-r--r--components/script/task_source/history_traversal.rs34
-rw-r--r--components/script/task_source/media_element.rs56
-rw-r--r--components/script/task_source/mod.rs83
-rw-r--r--components/script/task_source/networking.rs53
-rw-r--r--components/script/task_source/performance_timeline.rs66
-rw-r--r--components/script/task_source/port_message.rs46
-rw-r--r--components/script/task_source/remote_event.rs37
-rw-r--r--components/script/task_source/rendering.rs61
-rw-r--r--components/script/task_source/timer.rs47
-rw-r--r--components/script/task_source/user_interaction.rs69
-rw-r--r--components/script/task_source/websocket.rs37
64 files changed, 417 insertions, 1189 deletions
diff --git a/components/script/body.rs b/components/script/body.rs
index d84e39cd2f9..0d625ac1ff4 100644
--- a/components/script/body.rs
+++ b/components/script/body.rs
@@ -41,7 +41,6 @@ use crate::dom::urlsearchparams::URLSearchParams;
use crate::realms::{enter_realm, AlreadyInRealm, InRealm};
use crate::script_runtime::{CanGc, JSContext};
use crate::task::TaskCanceller;
-use crate::task_source::networking::NetworkingTaskSource;
use crate::task_source::{TaskSource, TaskSourceName};
/// The Dom object, or ReadableStream, that is the source of a body.
@@ -72,7 +71,7 @@ enum StopReading {
#[derive(Clone)]
struct TransmitBodyConnectHandler {
stream: Trusted<ReadableStream>,
- task_source: NetworkingTaskSource,
+ task_source: TaskSource,
canceller: TaskCanceller,
bytes_sender: Option<IpcSender<BodyChunkResponse>>,
control_sender: IpcSender<BodyChunkRequest>,
@@ -84,7 +83,7 @@ struct TransmitBodyConnectHandler {
impl TransmitBodyConnectHandler {
pub fn new(
stream: Trusted<ReadableStream>,
- task_source: NetworkingTaskSource,
+ task_source: TaskSource,
canceller: TaskCanceller,
control_sender: IpcSender<BodyChunkRequest>,
in_memory: Option<Vec<u8>>,
@@ -379,7 +378,7 @@ impl ExtractedBody {
let trusted_stream = Trusted::new(&*stream);
let global = stream.global();
- let task_source = global.networking_task_source();
+ let task_source = global.task_manager().networking_task_source();
let canceller = global.task_canceller(TaskSourceName::Networking);
// In case of the data being in-memory, send everything in one chunk, by-passing SM.
diff --git a/components/script/dom/abstractworkerglobalscope.rs b/components/script/dom/abstractworkerglobalscope.rs
index 0603a888436..966dacaffd1 100644
--- a/components/script/dom/abstractworkerglobalscope.rs
+++ b/components/script/dom/abstractworkerglobalscope.rs
@@ -35,7 +35,7 @@ impl ScriptChan for SendableWorkerScriptChan {
self.sender.send(msg).map_err(|_| ())
}
- fn as_boxed(&self) -> Box<dyn ScriptChan + Send> {
+ fn as_boxed(&self) -> Box<dyn ScriptChan> {
Box::new(SendableWorkerScriptChan {
sender: self.sender.clone(),
worker: self.worker.clone(),
@@ -62,7 +62,7 @@ impl ScriptChan for WorkerThreadWorkerChan {
self.sender.send(msg).map_err(|_| ())
}
- fn as_boxed(&self) -> Box<dyn ScriptChan + Send> {
+ fn as_boxed(&self) -> Box<dyn ScriptChan> {
Box::new(WorkerThreadWorkerChan {
sender: self.sender.clone(),
worker: self.worker.clone(),
diff --git a/components/script/dom/analysernode.rs b/components/script/dom/analysernode.rs
index 47d8f255088..263cf7737d4 100644
--- a/components/script/dom/analysernode.rs
+++ b/components/script/dom/analysernode.rs
@@ -27,7 +27,6 @@ use crate::dom::bindings::reflector::reflect_dom_object_with_proto;
use crate::dom::bindings::root::DomRoot;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct AnalyserNode {
diff --git a/components/script/dom/audiocontext.rs b/components/script/dom/audiocontext.rs
index 9a260617c58..544b8bb474a 100644
--- a/components/script/dom/audiocontext.rs
+++ b/components/script/dom/audiocontext.rs
@@ -35,7 +35,6 @@ use crate::dom::promise::Promise;
use crate::dom::window::Window;
use crate::realms::InRealm;
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct AudioContext {
diff --git a/components/script/dom/audioscheduledsourcenode.rs b/components/script/dom/audioscheduledsourcenode.rs
index c8a970f390e..26a5002ce47 100644
--- a/components/script/dom/audioscheduledsourcenode.rs
+++ b/components/script/dom/audioscheduledsourcenode.rs
@@ -17,7 +17,6 @@ use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::num::Finite;
use crate::dom::bindings::refcounted::Trusted;
use crate::dom::bindings::reflector::DomObject;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct AudioScheduledSourceNode {
diff --git a/components/script/dom/audiotracklist.rs b/components/script/dom/audiotracklist.rs
index 889eb43147f..19dba0fee3c 100644
--- a/components/script/dom/audiotracklist.rs
+++ b/components/script/dom/audiotracklist.rs
@@ -16,7 +16,6 @@ use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlmediaelement::HTMLMediaElement;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct AudioTrackList {
diff --git a/components/script/dom/baseaudiocontext.rs b/components/script/dom/baseaudiocontext.rs
index a93c3d6dd3e..1da48d4b1c8 100644
--- a/components/script/dom/baseaudiocontext.rs
+++ b/components/script/dom/baseaudiocontext.rs
@@ -68,7 +68,6 @@ use crate::dom::stereopannernode::StereoPannerNode;
use crate::dom::window::Window;
use crate::realms::InRealm;
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[allow(dead_code)]
pub enum BaseAudioContextOptions {
diff --git a/components/script/dom/bluetooth.rs b/components/script/dom/bluetooth.rs
index 116c2762e81..a76b7d72065 100644
--- a/components/script/dom/bluetooth.rs
+++ b/components/script/dom/bluetooth.rs
@@ -244,7 +244,7 @@ pub fn response_async<T: AsyncBluetoothListener + DomObject + 'static>(
receiver: &T,
) -> IpcSender<BluetoothResponseResult> {
let (action_sender, action_receiver) = ipc::channel().unwrap();
- let task_source = receiver.global().networking_task_source();
+ let task_source = receiver.global().task_manager().networking_task_source();
let context = Arc::new(Mutex::new(BluetoothContext {
promise: Some(TrustedPromise::new(promise.clone())),
receiver: Trusted::new(receiver),
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs
index a6d65284cb7..6cdae855dba 100644
--- a/components/script/dom/dedicatedworkerglobalscope.rs
+++ b/components/script/dom/dedicatedworkerglobalscope.rs
@@ -60,8 +60,7 @@ use crate::script_runtime::{
ThreadSafeJSContext,
};
use crate::task_queue::{QueuedTask, QueuedTaskConversion, TaskQueue};
-use crate::task_source::networking::NetworkingTaskSource;
-use crate::task_source::TaskSourceName;
+use crate::task_source::{TaskSource, TaskSourceName};
/// Set the `worker` field of a related DedicatedWorkerGlobalScope object to a particular
/// value for the duration of this object's lifetime. This ensures that the related Worker
@@ -192,7 +191,7 @@ pub struct DedicatedWorkerGlobalScope {
worker: DomRefCell<Option<TrustedWorkerAddress>>,
#[ignore_malloc_size_of = "Can't measure trait objects"]
/// Sender to the parent thread.
- parent_sender: Box<dyn ScriptChan + Send>,
+ parent_sender: Box<dyn ScriptChan>,
#[ignore_malloc_size_of = "Arc"]
#[no_trace]
image_cache: Arc<dyn ImageCache>,
@@ -381,13 +380,14 @@ impl DedicatedWorkerGlobalScope {
.origin(origin);
let runtime = unsafe {
- let task_source = NetworkingTaskSource(
- Box::new(WorkerThreadWorkerChan {
+ let task_source = TaskSource {
+ sender: Box::new(WorkerThreadWorkerChan {
sender: own_sender.clone(),
worker: worker.clone(),
}),
pipeline_id,
- );
+ name: TaskSourceName::Networking,
+ };
Runtime::new_with_parent(Some(parent), Some(task_source))
};
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 60997d39277..229d0b11e3f 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -192,7 +192,7 @@ use crate::script_runtime::{CanGc, CommonScriptMsg, ScriptThreadEventCategory};
use crate::script_thread::{with_script_thread, ScriptThread};
use crate::stylesheet_set::StylesheetSetRef;
use crate::task::TaskBox;
-use crate::task_source::{TaskSource, TaskSourceName};
+use crate::task_source::TaskSourceName;
use crate::timers::OneshotTimerCallback;
/// The number of times we are allowed to see spurious `requestAnimationFrame()` calls before
diff --git a/components/script/dom/eventsource.rs b/components/script/dom/eventsource.rs
index 504968931db..a64c5be8088 100644
--- a/components/script/dom/eventsource.rs
+++ b/components/script/dom/eventsource.rs
@@ -45,7 +45,7 @@ use crate::fetch::{create_a_potential_cors_request, FetchCanceller};
use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener};
use crate::realms::enter_realm;
use crate::script_runtime::CanGc;
-use crate::task_source::{TaskSource, TaskSourceName};
+use crate::task_source::TaskSourceName;
use crate::timers::OneshotTimerCallback;
const DEFAULT_RECONNECTION_TIME: Duration = Duration::from_millis(5000);
@@ -113,7 +113,7 @@ impl EventSourceContext {
let global = event_source.global();
let event_source = self.event_source.clone();
// FIXME(nox): Why are errors silenced here?
- let _ = global.remote_event_task_source().queue(
+ let _ = global.task_manager().remote_event_task_source().queue(
task!(announce_the_event_source_connection: move || {
let event_source = event_source.root();
if event_source.ready_state.get() != ReadyState::Closed {
@@ -146,7 +146,7 @@ impl EventSourceContext {
let action_sender = self.action_sender.clone();
let global = event_source.global();
// FIXME(nox): Why are errors silenced here?
- let _ = global.remote_event_task_source().queue(
+ let _ = global.task_manager().remote_event_task_source().queue(
task!(reestablish_the_event_source_onnection: move || {
let event_source = trusted_event_source.root();
@@ -259,7 +259,7 @@ impl EventSourceContext {
let event_source = self.event_source.clone();
let event = Trusted::new(&*event);
// FIXME(nox): Why are errors silenced here?
- let _ = global.remote_event_task_source().queue(
+ let _ = global.task_manager().remote_event_task_source().queue(
task!(dispatch_the_event_source_event: move || {
let event_source = event_source.root();
if event_source.ready_state.get() != ReadyState::Closed {
@@ -500,7 +500,7 @@ impl EventSource {
let global = self.global();
let event_source = Trusted::new(self);
// FIXME(nox): Why are errors silenced here?
- let _ = global.remote_event_task_source().queue(
+ let _ = global.task_manager().remote_event_task_source().queue(
task!(fail_the_event_source_connection: move || {
let event_source = event_source.root();
if event_source.ready_state.get() != ReadyState::Closed {
@@ -605,7 +605,7 @@ impl EventSourceMethods<crate::DomTypeHolder> for EventSource {
};
let listener = NetworkListener {
context: Arc::new(Mutex::new(context)),
- task_source: global.networking_task_source(),
+ task_source: global.task_manager().networking_task_source(),
canceller: Some(global.task_canceller(TaskSourceName::Networking)),
};
ROUTER.add_typed_route(
diff --git a/components/script/dom/filereader.rs b/components/script/dom/filereader.rs
index e8e697eec90..ad21a11f639 100644
--- a/components/script/dom/filereader.rs
+++ b/components/script/dom/filereader.rs
@@ -36,9 +36,41 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::progressevent::ProgressEvent;
use crate::realms::enter_realm;
use crate::script_runtime::{CanGc, JSContext};
-use crate::task_source::file_reading::FileReadingTask;
-use crate::task_source::{TaskSource, TaskSourceName};
+use crate::task::TaskOnce;
+use crate::task_source::TaskSourceName;
+
+#[allow(dead_code)]
+pub enum FileReadingTask {
+ ProcessRead(TrustedFileReader, GenerationId),
+ ProcessReadData(TrustedFileReader, GenerationId),
+ ProcessReadError(TrustedFileReader, GenerationId, DOMErrorName),
+ ProcessReadEOF(TrustedFileReader, GenerationId, ReadMetaData, Vec<u8>),
+}
+
+impl TaskOnce for FileReadingTask {
+ fn run_once(self) {
+ self.handle_task(CanGc::note());
+ }
+}
+
+impl FileReadingTask {
+ pub fn handle_task(self, can_gc: CanGc) {
+ use self::FileReadingTask::*;
+ match self {
+ ProcessRead(reader, gen_id) => FileReader::process_read(reader, gen_id, can_gc),
+ ProcessReadData(reader, gen_id) => {
+ FileReader::process_read_data(reader, gen_id, can_gc)
+ },
+ ProcessReadError(reader, gen_id, error) => {
+ FileReader::process_read_error(reader, gen_id, error, can_gc)
+ },
+ ProcessReadEOF(reader, gen_id, metadata, blob_contents) => {
+ FileReader::process_read_eof(reader, gen_id, metadata, blob_contents, can_gc)
+ },
+ }
+ }
+}
#[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq)]
pub enum FileReaderFunction {
Text,
@@ -472,7 +504,7 @@ impl FileReader {
let filereader = Trusted::new(self);
let global = self.global();
let canceller = global.task_canceller(TaskSourceName::FileReading);
- let task_source = global.file_reading_task_source();
+ let task_source = global.task_manager().file_reading_task_source();
// Queue tasks as appropriate.
let task = FileReadingTask::ProcessRead(filereader.clone(), gen_id);
diff --git a/components/script/dom/gamepadhapticactuator.rs b/components/script/dom/gamepadhapticactuator.rs
index edffeddd901..6892092a9a5 100644
--- a/components/script/dom/gamepadhapticactuator.rs
+++ b/components/script/dom/gamepadhapticactuator.rs
@@ -28,12 +28,11 @@ use crate::dom::promise::Promise;
use crate::realms::InRealm;
use crate::script_runtime::{CanGc, JSContext};
use crate::task::TaskCanceller;
-use crate::task_source::gamepad::GamepadTaskSource;
use crate::task_source::{TaskSource, TaskSourceName};
struct HapticEffectListener {
canceller: TaskCanceller,
- task_source: GamepadTaskSource,
+ task_source: TaskSource,
context: Trusted<GamepadHapticActuator>,
}
@@ -199,7 +198,7 @@ impl GamepadHapticActuatorMethods<crate::DomTypeHolder> for GamepadHapticActuato
if let Some(promise) = self.playing_effect_promise.borrow_mut().take() {
let trusted_promise = TrustedPromise::new(promise);
- let _ = self.global().gamepad_task_source().queue(
+ let _ = self.global().task_manager().gamepad_task_source().queue(
task!(preempt_promise: move || {
let promise = trusted_promise.root();
let message = DOMString::from("preempted");
@@ -221,7 +220,7 @@ impl GamepadHapticActuatorMethods<crate::DomTypeHolder> for GamepadHapticActuato
let (effect_complete_sender, effect_complete_receiver) =
ipc::channel().expect("ipc channel failure");
let (task_source, canceller) = (
- self.global().gamepad_task_source(),
+ self.global().task_manager().gamepad_task_source(),
self.global().task_canceller(TaskSourceName::Gamepad),
);
let listener = HapticEffectListener {
@@ -272,7 +271,7 @@ impl GamepadHapticActuatorMethods<crate::DomTypeHolder> for GamepadHapticActuato
if let Some(promise) = self.playing_effect_promise.borrow_mut().take() {
let trusted_promise = TrustedPromise::new(promise);
- let _ = self.global().gamepad_task_source().queue(
+ let _ = self.global().task_manager().gamepad_task_source().queue(
task!(preempt_promise: move || {
let promise = trusted_promise.root();
let message = DOMString::from("preempted");
@@ -290,7 +289,7 @@ impl GamepadHapticActuatorMethods<crate::DomTypeHolder> for GamepadHapticActuato
let (effect_stop_sender, effect_stop_receiver) =
ipc::channel().expect("ipc channel failure");
let (task_source, canceller) = (
- self.global().gamepad_task_source(),
+ self.global().task_manager().gamepad_task_source(),
self.global().task_canceller(TaskSourceName::Gamepad),
);
let listener = HapticEffectListener {
@@ -342,7 +341,7 @@ impl GamepadHapticActuator {
let trusted_promise = TrustedPromise::new(promise);
let sequence_id = self.sequence_id.get();
let reset_sequence_id = self.reset_sequence_id.get();
- let _ = self.global().gamepad_task_source().queue(
+ let _ = self.global().task_manager().gamepad_task_source().queue(
task!(complete_promise: move || {
if sequence_id != reset_sequence_id {
warn!("Mismatched sequence/reset sequence ids: {} != {}", sequence_id, reset_sequence_id);
@@ -364,7 +363,7 @@ impl GamepadHapticActuator {
}
let this = Trusted::new(self);
- let _ = self.global().gamepad_task_source().queue(
+ let _ = self.global().task_manager().gamepad_task_source().queue(
task!(stop_playing_effect: move || {
let actuator = this.root();
let Some(promise) = actuator.playing_effect_promise.borrow_mut().take() else {
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
index 300c28c636d..632f75c8405 100644
--- a/components/script/dom/globalscope.rs
+++ b/components/script/dom/globalscope.rs
@@ -138,15 +138,7 @@ use crate::script_runtime::{
use crate::script_thread::{with_script_thread, ScriptThread};
use crate::security_manager::CSPViolationReporter;
use crate::task::TaskCanceller;
-use crate::task_source::dom_manipulation::DOMManipulationTaskSource;
-use crate::task_source::file_reading::FileReadingTaskSource;
-use crate::task_source::gamepad::GamepadTaskSource;
-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::task_source::{TaskSource, TaskSourceName};
use crate::timers::{
IsInterval, OneshotTimerCallback, OneshotTimerHandle, OneshotTimers, TimerCallback,
@@ -383,14 +375,14 @@ pub struct GlobalScope {
/// A wrapper for glue-code between the ipc router and the event-loop.
struct MessageListener {
canceller: TaskCanceller,
- task_source: PortMessageQueue,
+ task_source: TaskSource,
context: Trusted<GlobalScope>,
}
/// A wrapper for broadcasts coming in over IPC, and the event-loop.
struct BroadcastListener {
canceller: TaskCanceller,
- task_source: DOMManipulationTaskSource,
+ task_source: TaskSource,
context: Trusted<GlobalScope>,
}
@@ -398,7 +390,7 @@ struct BroadcastListener {
#[derive(Clone)]
pub(crate) struct TimerListener {
canceller: TaskCanceller,
- task_source: TimerTaskSource,
+ task_source: TaskSource,
context: Trusted<GlobalScope>,
}
@@ -410,7 +402,7 @@ struct FileListener {
/// - Some(Empty) => Some(Receiving) => None
/// - Some(Empty) => None
state: Option<FileListenerState>,
- task_source: FileReadingTaskSource,
+ task_source: TaskSource,
task_canceller: TaskCanceller,
}
@@ -860,7 +852,7 @@ impl GlobalScope {
fn timers(&self) -> &OneshotTimers {
self.timers.get_or_init(|| {
let (task_source, canceller) = (
- self.timer_task_source(),
+ self.task_manager().timer_task_source(),
self.task_canceller(TaskSourceName::Timer),
);
OneshotTimers::new(
@@ -1102,7 +1094,7 @@ impl GlobalScope {
for task in message_buffer {
let port_id = *port_id;
let this = Trusted::new(self);
- let _ = self.port_message_queue().queue(
+ let _ = self.task_manager().port_message_queue().queue(
task!(process_pending_port_messages: move || {
let target_global = this.root();
target_global.route_task_to_port(port_id, task, CanGc::note());
@@ -1156,7 +1148,7 @@ impl GlobalScope {
if let Some(entangled_id) = entangled_port {
// Step 7
let this = Trusted::new(self);
- let _ = self.port_message_queue().queue(
+ let _ = self.task_manager().port_message_queue().queue(
task!(post_message: move || {
let global = this.root();
// Note: we do this in a task, as this will ensure the global and constellation
@@ -1253,7 +1245,7 @@ impl GlobalScope {
// to fire the message event
let channel = Trusted::new(&*channel);
let global = Trusted::new(self);
- let _ = self.dom_manipulation_task_source().queue(
+ let _ = self.task_manager().dom_manipulation_task_source().queue(
task!(process_pending_port_messages: move || {
let destination = channel.root();
let global = global.root();
@@ -1447,7 +1439,7 @@ impl GlobalScope {
ipc::channel().expect("ipc channel failure");
let context = Trusted::new(self);
let (task_source, canceller) = (
- self.dom_manipulation_task_source(),
+ self.task_manager().dom_manipulation_task_source(),
self.task_canceller(TaskSourceName::DOMManipulation),
);
let listener = BroadcastListener {
@@ -1500,7 +1492,7 @@ impl GlobalScope {
ipc::channel().expect("ipc channel failure");
let context = Trusted::new(self);
let (task_source, canceller) = (
- self.port_message_queue(),
+ self.task_manager().port_message_queue(),
self.task_canceller(TaskSourceName::PortMessage),
);
let listener = MessageListener {
@@ -1543,7 +1535,7 @@ impl GlobalScope {
// Queue a task to complete the transfer,
// unless the port is re-transferred in the current task.
let this = Trusted::new(self);
- let _ = self.port_message_queue().queue(
+ let _ = self.task_manager().port_message_queue().queue(
task!(process_pending_port_messages: move || {
let target_global = this.root();
target_global.maybe_add_pending_ports();
@@ -2026,7 +2018,7 @@ impl GlobalScope {
let trusted_stream = Trusted::new(&*stream.clone());
let task_canceller = self.task_canceller(TaskSourceName::FileReading);
- let task_source = self.file_reading_task_source();
+ let task_source = self.task_manager().file_reading_task_source();
let mut file_listener = FileListener {
state: Some(FileListenerState::Empty(FileListenerTarget::Stream(
@@ -2051,7 +2043,7 @@ impl GlobalScope {
let trusted_promise = TrustedPromise::new(promise);
let task_canceller = self.task_canceller(TaskSourceName::FileReading);
- let task_source = self.file_reading_task_source();
+ let task_source = self.task_manager().file_reading_task_source();
let mut file_listener = FileListener {
state: Some(FileListenerState::Empty(FileListenerTarget::Promise(
@@ -2595,72 +2587,13 @@ impl GlobalScope {
unreachable!();
}
- /// `TaskSource` to send messages to the gamepad task source of
- /// this global scope.
- /// <https://w3c.github.io/gamepad/#dfn-gamepad-task-source>
- pub fn gamepad_task_source(&self) -> GamepadTaskSource {
+ /// The [`TaskManager`] used to schedule tasks for this [`GlobalScope`].
+ pub fn task_manager(&self) -> &TaskManager {
if let Some(window) = self.downcast::<Window>() {
- return window.task_manager().gamepad_task_source();
- }
- unreachable!();
- }
-
- /// `TaskSource` to send messages to the networking task source of
- /// this global scope.
- pub fn networking_task_source(&self) -> NetworkingTaskSource {
- if let Some(window) = self.downcast::<Window>() {
- return window.task_manager().networking_task_source();
- }
- if let Some(worker) = self.downcast::<WorkerGlobalScope>() {
- return worker.networking_task_source();
- }
- unreachable!();
- }
-
- /// `TaskSource` to send messages to the port message queue of
- /// this global scope.
- pub fn port_message_queue(&self) -> PortMessageQueue {
- if let Some(window) = self.downcast::<Window>() {
- return window.task_manager().port_message_queue();
- }
- if let Some(worker) = self.downcast::<WorkerGlobalScope>() {
- return worker.port_message_queue();
- }
- unreachable!();
- }
-
- /// `TaskSource` to send messages to the timer queue of
- /// this global scope.
- pub fn timer_task_source(&self) -> TimerTaskSource {
- if let Some(window) = self.downcast::<Window>() {
- return window.task_manager().timer_task_source();
- }
- if let Some(worker) = self.downcast::<WorkerGlobalScope>() {
- return worker.timer_task_source();
- }
- unreachable!();
- }
-
- /// `TaskSource` to send messages to the remote-event task source of
- /// this global scope.
- pub fn remote_event_task_source(&self) -> RemoteEventTaskSource {
- if let Some(window) = self.downcast::<Window>() {
- return window.task_manager().remote_event_task_source();
- }
- if let Some(worker) = self.downcast::<WorkerGlobalScope>() {
- return worker.remote_event_task_source();
- }
- unreachable!();
- }
-
- /// `TaskSource` to send messages to the websocket task source of
- /// this global scope.
- pub fn websocket_task_source(&self) -> WebsocketTaskSource {
- if let Some(window) = self.downcast::<Window>() {
- return window.task_manager().websocket_task_source();
+ return window.task_manager();
}
if let Some(worker) = self.downcast::<WorkerGlobalScope>() {
- return worker.websocket_task_source();
+ return worker.task_manager();
}
unreachable!();
}
@@ -2842,7 +2775,8 @@ impl GlobalScope {
scripted_caller.line,
scripted_caller.col,
);
- self.dom_manipulation_task_source()
+ self.task_manager()
+ .dom_manipulation_task_source()
.queue(task, self)
.unwrap();
}
@@ -3024,28 +2958,6 @@ impl GlobalScope {
unreachable!();
}
- pub fn dom_manipulation_task_source(&self) -> DOMManipulationTaskSource {
- if let Some(window) = self.downcast::<Window>() {
- return window.task_manager().dom_manipulation_task_source();
- }
- if let Some(worker) = self.downcast::<WorkerGlobalScope>() {
- return worker.dom_manipulation_task_source();
- }
- unreachable!();
- }
-
- /// Channel to send messages to the file reading task source of
- /// this of this global scope.
- pub fn file_reading_task_source(&self) -> FileReadingTaskSource {
- if let Some(window) = self.downcast::<Window>() {
- return window.task_manager().file_reading_task_source();
- }
- if let Some(worker) = self.downcast::<WorkerGlobalScope>() {
- return worker.file_reading_task_source();
- }
- unreachable!();
- }
-
pub fn runtime_handle(&self) -> ParentRuntime {
if self.is::<Window>() {
ScriptThread::runtime_handle()
@@ -3096,18 +3008,6 @@ impl GlobalScope {
unreachable!();
}
- /// Channel to send messages to the performance timeline task source
- /// of this global scope.
- pub fn performance_timeline_task_source(&self) -> PerformanceTimelineTaskSource {
- if let Some(window) = self.downcast::<Window>() {
- return window.task_manager().performance_timeline_task_source();
- }
- if let Some(worker) = self.downcast::<WorkerGlobalScope>() {
- return worker.performance_timeline_task_source();
- }
- unreachable!();
- }
-
/// <https://w3c.github.io/performance-timeline/#supportedentrytypes-attribute>
pub fn supported_performance_entry_types(&self, cx: SafeJSContext, retval: MutableHandleValue) {
self.frozen_supported_performance_entry_types.get_or_init(
@@ -3261,7 +3161,8 @@ impl GlobalScope {
// TODO: 2. If document is not null and is not allowed to use the "gamepad" permission,
// then abort these steps.
let this = Trusted::new(self);
- self.gamepad_task_source()
+ self.task_manager()
+ .gamepad_task_source()
.queue_with_canceller(
task!(gamepad_connected: move || {
let global = this.root();
@@ -3291,7 +3192,8 @@ impl GlobalScope {
/// <https://www.w3.org/TR/gamepad/#dfn-gamepaddisconnected>
pub fn handle_gamepad_disconnect(&self, index: usize) {
let this = Trusted::new(self);
- self.gamepad_task_source()
+ self.task_manager()
+ .gamepad_task_source()
.queue_with_canceller(
task!(gamepad_disconnected: move || {
let global = this.root();
@@ -3315,7 +3217,8 @@ impl GlobalScope {
let this = Trusted::new(self);
// <https://w3c.github.io/gamepad/#dfn-update-gamepad-state>
- self.gamepad_task_source()
+ self.task_manager()
+ .gamepad_task_source()
.queue_with_canceller(
task!(update_gamepad_state: move || {
let global = this.root();
@@ -3427,7 +3330,7 @@ impl GlobalScope {
&self,
request_builder: RequestBuilder,
context: Arc<Mutex<Listener>>,
- task_source: NetworkingTaskSource,
+ task_source: TaskSource,
cancellation_sender: Option<ipc::IpcReceiver<()>>,
) {
let canceller = Some(self.task_canceller(TaskSourceName::Networking));
diff --git a/components/script/dom/htmldetailselement.rs b/components/script/dom/htmldetailselement.rs
index 44a8a8fe63a..9d5a1030720 100644
--- a/components/script/dom/htmldetailselement.rs
+++ b/components/script/dom/htmldetailselement.rs
@@ -20,7 +20,6 @@ use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{window_from_node, Node, NodeDamage};
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct HTMLDetailsElement {
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index f1f176daeb6..f5dbe6cd299 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -84,7 +84,6 @@ use crate::dom::window::Window;
use crate::links::{get_element_target, LinkRelations};
use crate::script_runtime::CanGc;
use crate::script_thread::ScriptThread;
-use crate::task_source::TaskSource;
#[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq)]
pub struct GenerationId(u32);
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs
index fe32f388e1d..a95f49ef2ef 100644
--- a/components/script/dom/htmlimageelement.rs
+++ b/components/script/dom/htmlimageelement.rs
@@ -98,7 +98,6 @@ use crate::network_listener::{self, PreInvoke, ResourceTimingListener};
use crate::realms::enter_realm;
use crate::script_runtime::CanGc;
use crate::script_thread::ScriptThread;
-use crate::task_source::TaskSource;
#[derive(Clone, Copy, Debug)]
enum ParseState {
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index 18bca9decee..a93d645ee08 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -106,7 +106,6 @@ use crate::network_listener::{self, PreInvoke, ResourceTimingListener};
use crate::realms::{enter_realm, InRealm};
use crate::script_runtime::CanGc;
use crate::script_thread::ScriptThread;
-use crate::task_source::TaskSource;
#[derive(PartialEq)]
enum FrameStatus {
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs
index 244a18568c4..3c34ff70d0d 100644
--- a/components/script/dom/htmlscriptelement.rs
+++ b/components/script/dom/htmlscriptelement.rs
@@ -67,7 +67,6 @@ use crate::script_module::{
};
use crate::script_runtime::CanGc;
use crate::task::TaskCanceller;
-use crate::task_source::dom_manipulation::DOMManipulationTaskSource;
use crate::task_source::{TaskSource, TaskSourceName};
use crate::unminify::{unminify_js, ScriptSource};
@@ -104,7 +103,7 @@ impl ScriptSource for ScriptOrigin {
script_kind: ExternalScriptKind,
final_url: ServoUrl,
url: ServoUrl,
- task_source: DOMManipulationTaskSource,
+ task_source: TaskSource,
canceller: TaskCanceller,
script_text: String,
fetch_options: ScriptFetchOptions,
@@ -478,7 +477,7 @@ impl FetchResponseListener for ClassicContext {
script_kind: self.kind,
final_url,
url: self.url.clone(),
- task_source: global.dom_manipulation_task_source(),
+ task_source: global.task_manager().dom_manipulation_task_source(),
canceller: global.task_canceller(TaskSourceName::DOMManipulation),
script_text: source_string,
fetch_options: self.fetch_options.clone(),
diff --git a/components/script/dom/offlineaudiocontext.rs b/components/script/dom/offlineaudiocontext.rs
index e6f991001f2..f3deeae2cc9 100644
--- a/components/script/dom/offlineaudiocontext.rs
+++ b/components/script/dom/offlineaudiocontext.rs
@@ -32,7 +32,6 @@ use crate::dom::promise::Promise;
use crate::dom::window::Window;
use crate::realms::InRealm;
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct OfflineAudioContext {
diff --git a/components/script/dom/performance.rs b/components/script/dom/performance.rs
index e9f73f26af4..f5aab785293 100644
--- a/components/script/dom/performance.rs
+++ b/components/script/dom/performance.rs
@@ -10,6 +10,7 @@ use base::cross_process_instant::CrossProcessInstant;
use dom_struct::dom_struct;
use time_03::Duration;
+use super::bindings::refcounted::Trusted;
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::PerformanceBinding::{
DOMHighResTimeStamp, PerformanceEntryList as DOMPerformanceEntryList, PerformanceMethods,
@@ -237,8 +238,16 @@ impl Performance {
if !self.pending_notification_observers_task.get() {
self.pending_notification_observers_task.set(true);
- let task_source = self.global().performance_timeline_task_source();
- task_source.queue_notification(&self.global());
+ let task_source = self
+ .global()
+ .task_manager()
+ .performance_timeline_task_source();
+ let global = &self.global();
+ let owner = Trusted::new(&*global.performance());
+ let task = task!(notify_performance_observers: move || {
+ owner.root().notify_observers();
+ });
+ let _ = task_source.queue(task, global);
}
}
let mut observers = self.observers.borrow_mut();
@@ -315,8 +324,17 @@ impl Performance {
// Step 6.
// Queue a new notification task.
self.pending_notification_observers_task.set(true);
- let task_source = self.global().performance_timeline_task_source();
- task_source.queue_notification(&self.global());
+ let task_source = self
+ .global()
+ .task_manager()
+ .performance_timeline_task_source();
+
+ let global = &self.global();
+ let owner = Trusted::new(&*global.performance());
+ let task = task!(notify_performance_observers: move || {
+ owner.root().notify_observers();
+ });
+ let _ = task_source.queue(task, global);
Some(entry_last_index)
}
diff --git a/components/script/dom/rtcpeerconnection.rs b/components/script/dom/rtcpeerconnection.rs
index 8d7fbc4303a..689626f10d2 100644
--- a/components/script/dom/rtcpeerconnection.rs
+++ b/components/script/dom/rtcpeerconnection.rs
@@ -53,7 +53,6 @@ use crate::dom::window::Window;
use crate::realms::{enter_realm, InRealm};
use crate::script_runtime::CanGc;
use crate::task::TaskCanceller;
-use crate::task_source::networking::NetworkingTaskSource;
use crate::task_source::TaskSource;
#[dom_struct]
@@ -81,7 +80,7 @@ pub struct RTCPeerConnection {
struct RTCSignaller {
trusted: Trusted<RTCPeerConnection>,
- task_source: NetworkingTaskSource,
+ task_source: TaskSource,
canceller: TaskCanceller,
}
diff --git a/components/script/dom/selection.rs b/components/script/dom/selection.rs
index a6479404c5c..7347a6464ec 100644
--- a/components/script/dom/selection.rs
+++ b/components/script/dom/selection.rs
@@ -20,7 +20,6 @@ use crate::dom::eventtarget::EventTarget;
use crate::dom::node::{window_from_node, Node};
use crate::dom::range::Range;
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[derive(Clone, Copy, JSTraceable, MallocSizeOf)]
enum Direction {
diff --git a/components/script/dom/serviceworkercontainer.rs b/components/script/dom/serviceworkercontainer.rs
index 5158831bdae..7d71f81c5fd 100644
--- a/components/script/dom/serviceworkercontainer.rs
+++ b/components/script/dom/serviceworkercontainer.rs
@@ -27,7 +27,6 @@ use crate::dom::serviceworkerregistration::ServiceWorkerRegistration;
use crate::realms::{enter_realm, InRealm};
use crate::script_runtime::CanGc;
use crate::task::TaskCanceller;
-use crate::task_source::dom_manipulation::DOMManipulationTaskSource;
use crate::task_source::{TaskSource, TaskSourceName};
#[dom_struct]
@@ -143,7 +142,7 @@ impl ServiceWorkerContainerMethods<crate::DomTypeHolder> for ServiceWorkerContai
// Setup the callback for reject/resolve of the promise,
// from steps running "in-parallel" from here in the serviceworker manager.
let (task_source, task_canceller) = (
- global.dom_manipulation_task_source(),
+ global.task_manager().dom_manipulation_task_source(),
global.task_canceller(TaskSourceName::DOMManipulation),
);
@@ -190,7 +189,7 @@ impl ServiceWorkerContainerMethods<crate::DomTypeHolder> for ServiceWorkerContai
/// <https://w3c.github.io/ServiceWorker/#register>
struct RegisterJobResultHandler {
trusted_promise: Option<TrustedPromise>,
- task_source: DOMManipulationTaskSource,
+ task_source: TaskSource,
task_canceller: TaskCanceller,
}
diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs
index 1703254b83d..d875d4c6f53 100644
--- a/components/script/dom/serviceworkerglobalscope.rs
+++ b/components/script/dom/serviceworkerglobalscope.rs
@@ -143,7 +143,7 @@ impl ScriptChan for ServiceWorkerChan {
.map_err(|_| ())
}
- fn as_boxed(&self) -> Box<dyn ScriptChan + Send> {
+ fn as_boxed(&self) -> Box<dyn ScriptChan> {
Box::new(ServiceWorkerChan {
sender: self.sender.clone(),
})
diff --git a/components/script/dom/storage.rs b/components/script/dom/storage.rs
index d7dbe6f8529..a5865ff72c0 100644
--- a/components/script/dom/storage.rs
+++ b/components/script/dom/storage.rs
@@ -21,7 +21,6 @@ use crate::dom::event::{Event, EventBubbles, EventCancelable};
use crate::dom::storageevent::StorageEvent;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct Storage {
diff --git a/components/script/dom/subtlecrypto.rs b/components/script/dom/subtlecrypto.rs
index df679b72621..344643ef3ce 100644
--- a/components/script/dom/subtlecrypto.rs
+++ b/components/script/dom/subtlecrypto.rs
@@ -54,7 +54,6 @@ use crate::dom::workerglobalscope::WorkerGlobalScope;
use crate::realms::InRealm;
use crate::script_runtime::{CanGc, JSContext};
use crate::task::TaskCanceller;
-use crate::task_source::dom_manipulation::DOMManipulationTaskSource;
use crate::task_source::TaskSource;
// String constants for algorithms/curves
@@ -142,13 +141,13 @@ impl SubtleCrypto {
)
}
- fn task_source_with_canceller(&self) -> (DOMManipulationTaskSource, TaskCanceller) {
+ fn task_source_with_canceller(&self) -> (TaskSource, TaskCanceller) {
if let Some(window) = self.global().downcast::<Window>() {
window
.task_manager()
.dom_manipulation_task_source_with_canceller()
} else if let Some(worker_global) = self.global().downcast::<WorkerGlobalScope>() {
- let task_source = worker_global.dom_manipulation_task_source();
+ let task_source = worker_global.task_manager().dom_manipulation_task_source();
let canceller = worker_global.task_canceller();
(task_source, canceller)
} else {
diff --git a/components/script/dom/texttracklist.rs b/components/script/dom/texttracklist.rs
index d938b8e1dfd..eae7b136cc2 100644
--- a/components/script/dom/texttracklist.rs
+++ b/components/script/dom/texttracklist.rs
@@ -18,7 +18,6 @@ use crate::dom::texttrack::TextTrack;
use crate::dom::trackevent::TrackEvent;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct TextTrackList {
diff --git a/components/script/dom/videotracklist.rs b/components/script/dom/videotracklist.rs
index 650c5ffe526..52a8d212bce 100644
--- a/components/script/dom/videotracklist.rs
+++ b/components/script/dom/videotracklist.rs
@@ -16,7 +16,6 @@ use crate::dom::htmlmediaelement::HTMLMediaElement;
use crate::dom::videotrack::VideoTrack;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct VideoTrackList {
diff --git a/components/script/dom/webglquery.rs b/components/script/dom/webglquery.rs
index e11e7766e93..1f416a3837d 100644
--- a/components/script/dom/webglquery.rs
+++ b/components/script/dom/webglquery.rs
@@ -16,7 +16,6 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::webglobject::WebGLObject;
use crate::dom::webglrenderingcontext::{Operation, WebGLRenderingContext};
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct WebGLQuery {
diff --git a/components/script/dom/webglsync.rs b/components/script/dom/webglsync.rs
index 42e1e51c852..5f07c0620a5 100644
--- a/components/script/dom/webglsync.rs
+++ b/components/script/dom/webglsync.rs
@@ -15,7 +15,6 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::webglobject::WebGLObject;
use crate::dom::webglrenderingcontext::{Operation, WebGLRenderingContext};
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct WebGLSync {
diff --git a/components/script/dom/webgpu/gpu.rs b/components/script/dom/webgpu/gpu.rs
index 5ee5d047113..ba4ce6be221 100644
--- a/components/script/dom/webgpu/gpu.rs
+++ b/components/script/dom/webgpu/gpu.rs
@@ -25,7 +25,7 @@ use crate::dom::promise::Promise;
use crate::dom::webgpu::gpuadapter::GPUAdapter;
use crate::realms::InRealm;
use crate::script_runtime::CanGc;
-use crate::task_source::{TaskSource, TaskSourceName};
+use crate::task_source::TaskSourceName;
#[dom_struct]
#[allow(clippy::upper_case_acronyms)]
@@ -69,7 +69,10 @@ pub fn response_async<T: AsyncWGPUListener + DomObject + 'static>(
receiver: &T,
) -> IpcSender<WebGPUResponse> {
let (action_sender, action_receiver) = ipc::channel().unwrap();
- let task_source = receiver.global().dom_manipulation_task_source();
+ let task_source = receiver
+ .global()
+ .task_manager()
+ .dom_manipulation_task_source();
let canceller = receiver
.global()
.task_canceller(TaskSourceName::DOMManipulation);
diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs
index d8b186057b6..9aa293c29f3 100644
--- a/components/script/dom/websocket.rs
+++ b/components/script/dom/websocket.rs
@@ -38,11 +38,9 @@ use crate::dom::event::{Event, EventBubbles, EventCancelable};
use crate::dom::eventtarget::EventTarget;
use crate::dom::globalscope::GlobalScope;
use crate::dom::messageevent::MessageEvent;
-use crate::script_runtime::ScriptThreadEventCategory::WebSocketEvent;
-use crate::script_runtime::{CanGc, CommonScriptMsg};
+use crate::script_runtime::CanGc;
use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::websocket::WebsocketTaskSource;
-use crate::task_source::TaskSource;
+use crate::task_source::{TaskSource, TaskSourceName};
#[derive(Clone, Copy, Debug, JSTraceable, MallocSizeOf, PartialEq)]
enum WebSocketRequestState {
@@ -72,7 +70,7 @@ mod close_code {
fn close_the_websocket_connection(
address: Trusted<WebSocket>,
- task_source: &WebsocketTaskSource,
+ task_source: &TaskSource,
canceller: &TaskCanceller,
code: Option<u16>,
reason: String,
@@ -88,7 +86,7 @@ fn close_the_websocket_connection(
fn fail_the_websocket_connection(
address: Trusted<WebSocket>,
- task_source: &WebsocketTaskSource,
+ task_source: &TaskSource,
canceller: &TaskCanceller,
) {
let close_task = CloseTask {
@@ -168,19 +166,12 @@ impl WebSocket {
if !self.clearing_buffer.get() && self.ready_state.get() == WebSocketRequestState::Open {
self.clearing_buffer.set(true);
- let task = Box::new(BufferedAmountTask { address });
-
- let pipeline_id = self.global().pipeline_id();
- self.global()
- .script_chan()
- // TODO: Use a dedicated `websocket-task-source` task source instead.
- .send(CommonScriptMsg::Task(
- WebSocketEvent,
- task,
- Some(pipeline_id),
- WebsocketTaskSource::NAME,
- ))
- .unwrap();
+ // TODO(mrobinson): Should this task be cancellable?
+ let _ = self
+ .global()
+ .task_manager()
+ .websocket_task_source()
+ .queue_unconditionally(BufferedAmountTask { address });
}
Ok(true)
@@ -284,8 +275,8 @@ impl WebSocketMethods<crate::DomTypeHolder> for WebSocket {
.core_resource_thread()
.send(CoreResourceMsg::Fetch(request, channels));
- let task_source = global.websocket_task_source();
- let canceller = global.task_canceller(WebsocketTaskSource::NAME);
+ let task_source = global.task_manager().websocket_task_source();
+ let canceller = global.task_canceller(TaskSourceName::WebSocket);
ROUTER.add_typed_route(
dom_event_receiver.to_ipc_receiver(),
Box::new(move |message| match message.unwrap() {
@@ -451,11 +442,11 @@ impl WebSocketMethods<crate::DomTypeHolder> for WebSocket {
// TODO: use a dedicated task source,
// https://html.spec.whatwg.org/multipage/#websocket-task-source
// When making the switch, also update the task_canceller call.
- let task_source = self.global().websocket_task_source();
+ let task_source = self.global().task_manager().websocket_task_source();
fail_the_websocket_connection(
address,
&task_source,
- &self.global().task_canceller(WebsocketTaskSource::NAME),
+ &self.global().task_canceller(TaskSourceName::WebSocket),
);
},
WebSocketRequestState::Open => {
diff --git a/components/script/dom/webxr/fakexrdevice.rs b/components/script/dom/webxr/fakexrdevice.rs
index 194ba0bd087..04440086f90 100644
--- a/components/script/dom/webxr/fakexrdevice.rs
+++ b/components/script/dom/webxr/fakexrdevice.rs
@@ -35,7 +35,6 @@ use crate::dom::fakexrinputcontroller::{init_to_mock_buttons, FakeXRInputControl
use crate::dom::globalscope::GlobalScope;
use crate::dom::promise::Promise;
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct FakeXRDevice {
diff --git a/components/script/dom/webxr/xrsession.rs b/components/script/dom/webxr/xrsession.rs
index 92ac419c585..f3b8a3ce32c 100644
--- a/components/script/dom/webxr/xrsession.rs
+++ b/components/script/dom/webxr/xrsession.rs
@@ -68,7 +68,6 @@ use crate::dom::xrsessionevent::XRSessionEvent;
use crate::dom::xrspace::XRSpace;
use crate::realms::InRealm;
use crate::script_runtime::JSContext;
-use crate::task_source::TaskSource;
use crate::script_runtime::CanGc;
#[dom_struct]
diff --git a/components/script/dom/webxr/xrsystem.rs b/components/script/dom/webxr/xrsystem.rs
index fb28b477e39..82bf4e5d37e 100644
--- a/components/script/dom/webxr/xrsystem.rs
+++ b/components/script/dom/webxr/xrsystem.rs
@@ -35,7 +35,6 @@ use crate::dom::xrtest::XRTest;
use crate::realms::InRealm;
use crate::script_runtime::CanGc;
use crate::script_thread::ScriptThread;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct XRSystem {
diff --git a/components/script/dom/webxr/xrtest.rs b/components/script/dom/webxr/xrtest.rs
index 02c090b2a1f..b56049b6dff 100644
--- a/components/script/dom/webxr/xrtest.rs
+++ b/components/script/dom/webxr/xrtest.rs
@@ -28,7 +28,6 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::promise::Promise;
use crate::script_runtime::CanGc;
use crate::script_thread::ScriptThread;
-use crate::task_source::TaskSource;
#[dom_struct]
pub struct XRTest {
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index ce10d7cc157..fc3d13e60eb 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -158,7 +158,7 @@ use crate::script_runtime::{
};
use crate::script_thread::ScriptThread;
use crate::task_manager::TaskManager;
-use crate::task_source::{TaskSource, TaskSourceName};
+use crate::task_source::TaskSourceName;
use crate::timers::{IsInterval, TimerCallback};
use crate::unminify::unminified_path;
use crate::webdriver_handlers::jsval_to_webdriver;
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>) {
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index a031b625036..d27fc3c06ca 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -73,7 +73,7 @@ use crate::dom::xmlhttprequestupload::XMLHttpRequestUpload;
use crate::fetch::FetchCanceller;
use crate::network_listener::{self, PreInvoke, ResourceTimingListener};
use crate::script_runtime::{CanGc, JSContext};
-use crate::task_source::networking::NetworkingTaskSource;
+use crate::task_source::{TaskSource, TaskSourceName};
use crate::timers::{OneshotTimerCallback, OneshotTimerHandle};
#[derive(Clone, Copy, Debug, JSTraceable, MallocSizeOf, PartialEq)]
@@ -294,7 +294,7 @@ impl XMLHttpRequest {
fn initiate_async_xhr(
context: Arc<Mutex<XHRContext>>,
- task_source: NetworkingTaskSource,
+ task_source: TaskSource,
global: &GlobalScope,
init: RequestBuilder,
cancellation_chan: ipc::IpcReceiver<()>,
@@ -1560,10 +1560,17 @@ impl XMLHttpRequest {
}));
let (task_source, script_port) = if self.sync.get() {
- let (tx, rx) = global.new_script_pair();
- (NetworkingTaskSource(tx, global.pipeline_id()), Some(rx))
+ let (sender, receiver) = global.new_script_pair();
+ (
+ TaskSource {
+ sender,
+ pipeline_id: global.pipeline_id(),
+ name: TaskSourceName::Networking,
+ },
+ Some(receiver),
+ )
} else {
- (global.networking_task_source(), None)
+ (global.task_manager().networking_task_source(), None)
};
let cancel_receiver = self.canceller.borrow_mut().initialize();
diff --git a/components/script/fetch.rs b/components/script/fetch.rs
index 266f848ec7a..39dbfccb603 100644
--- a/components/script/fetch.rs
+++ b/components/script/fetch.rs
@@ -195,7 +195,7 @@ pub fn Fetch(
global.fetch(
request_init,
fetch_context,
- global.networking_task_source(),
+ global.task_manager().networking_task_source(),
None,
);
diff --git a/components/script/image_listener.rs b/components/script/image_listener.rs
index 23489faebab..c07ccd4b231 100644
--- a/components/script/image_listener.rs
+++ b/components/script/image_listener.rs
@@ -12,7 +12,6 @@ use crate::dom::bindings::refcounted::Trusted;
use crate::dom::bindings::reflector::DomObject;
use crate::dom::node::{window_from_node, Node};
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
pub trait ImageCacheListener {
fn generation_id(&self) -> u32;
diff --git a/components/script/links.rs b/components/script/links.rs
index 8312bd13130..d4d318c180e 100644
--- a/components/script/links.rs
+++ b/components/script/links.rs
@@ -22,7 +22,6 @@ use crate::dom::htmllinkelement::HTMLLinkElement;
use crate::dom::node::document_from_node;
use crate::dom::types::{Element, GlobalScope};
use crate::script_runtime::CanGc;
-use crate::task_source::TaskSource;
bitflags::bitflags! {
/// Describes the different relations that can be specified on elements using the `rel`
diff --git a/components/script/messaging.rs b/components/script/messaging.rs
index 76bd536b18c..af768222fd6 100644
--- a/components/script/messaging.rs
+++ b/components/script/messaging.rs
@@ -235,7 +235,7 @@ impl ScriptChan for SendableMainThreadScriptChan {
self.0.send(msg).map_err(|_| ())
}
- fn as_boxed(&self) -> Box<dyn ScriptChan + Send> {
+ fn as_boxed(&self) -> Box<dyn ScriptChan> {
Box::new(SendableMainThreadScriptChan((self.0).clone()))
}
}
@@ -251,7 +251,7 @@ impl ScriptChan for MainThreadScriptChan {
.map_err(|_| ())
}
- fn as_boxed(&self) -> Box<dyn ScriptChan + Send> {
+ fn as_boxed(&self) -> Box<dyn ScriptChan> {
Box::new(MainThreadScriptChan((self.0).clone()))
}
}
diff --git a/components/script/network_listener.rs b/components/script/network_listener.rs
index 413d0932382..407765ddb4b 100644
--- a/components/script/network_listener.rs
+++ b/components/script/network_listener.rs
@@ -17,14 +17,13 @@ use crate::dom::performanceentry::PerformanceEntry;
use crate::dom::performanceresourcetiming::{InitiatorType, PerformanceResourceTiming};
use crate::script_runtime::CanGc;
use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::networking::NetworkingTaskSource;
use crate::task_source::TaskSource;
/// An off-thread sink for async network event tasks. All such events are forwarded to
/// a target thread, where they are invoked on the provided context object.
pub struct NetworkListener<Listener: PreInvoke + Send + 'static> {
pub context: Arc<Mutex<Listener>>,
- pub task_source: NetworkingTaskSource,
+ pub task_source: TaskSource,
pub canceller: Option<TaskCanceller>,
}
diff --git a/components/script/script_module.rs b/components/script/script_module.rs
index eedb00f1799..cb199ad27d1 100644
--- a/components/script/script_module.rs
+++ b/components/script/script_module.rs
@@ -1769,7 +1769,7 @@ fn fetch_single_module_script(
resource_timing: ResourceFetchTiming::new(ResourceTimingType::Resource),
}));
- let task_source = global.networking_task_source();
+ let task_source = global.task_manager().networking_task_source();
let canceller = global.task_canceller(TaskSourceName::Networking);
let network_listener = NetworkListener {
diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs
index 0d3922ec8d9..5c5f3ec8187 100644
--- a/components/script/script_runtime.rs
+++ b/components/script/script_runtime.rs
@@ -49,6 +49,7 @@ use js::rust::{
JSEngineHandle, ParentRuntime, Runtime as RustRuntime,
};
use malloc_size_of::MallocSizeOfOps;
+use malloc_size_of_derive::MallocSizeOf;
use profile_traits::mem::{Report, ReportKind, ReportsChan};
use profile_traits::path;
use profile_traits::time::ProfilerCategory;
@@ -84,7 +85,6 @@ use crate::script_module::EnsureModuleHooksInitialized;
use crate::script_thread::trace_thread;
use crate::security_manager::CSPViolationReporter;
use crate::task::TaskBox;
-use crate::task_source::networking::NetworkingTaskSource;
use crate::task_source::{TaskSource, TaskSourceName};
static JOB_QUEUE_TRAPS: JobQueueTraps = JobQueueTraps {
@@ -124,15 +124,15 @@ impl fmt::Debug for CommonScriptMsg {
}
/// A cloneable interface for communicating with an event loop.
-pub trait ScriptChan: JSTraceable {
+pub trait ScriptChan: JSTraceable + Send {
/// Send a message to the associated event loop.
#[allow(clippy::result_unit_err)]
fn send(&self, msg: CommonScriptMsg) -> Result<(), ()>;
/// Return a cloned version of this sender in a [`Box`].
- fn as_boxed(&self) -> Box<dyn ScriptChan + Send>;
+ fn as_boxed(&self) -> Box<dyn ScriptChan>;
}
-#[derive(Clone, Copy, Debug, Eq, Hash, JSTraceable, PartialEq)]
+#[derive(Clone, Copy, Debug, Eq, Hash, JSTraceable, MallocSizeOf, PartialEq)]
pub enum ScriptThreadEventCategory {
AttachLayout,
ConstellationMsg,
@@ -146,6 +146,7 @@ pub enum ScriptThreadEventCategory {
InputEvent,
NetworkEvent,
PortMessage,
+ Rendering,
Resize,
ScriptEvent,
SetScrollState,
@@ -187,6 +188,7 @@ impl From<ScriptThreadEventCategory> for ProfilerCategory {
},
ScriptThreadEventCategory::PortMessage => ProfilerCategory::ScriptPortMessage,
ScriptThreadEventCategory::Resize => ProfilerCategory::ScriptResize,
+ ScriptThreadEventCategory::Rendering => ProfilerCategory::ScriptRendering,
ScriptThreadEventCategory::ScriptEvent => ProfilerCategory::ScriptEvent,
ScriptThreadEventCategory::ServiceWorkerEvent => {
ProfilerCategory::ScriptServiceWorkerEvent
@@ -223,6 +225,7 @@ impl From<ScriptThreadEventCategory> for ScriptHangAnnotation {
ScriptThreadEventCategory::ImageCacheMsg => ScriptHangAnnotation::ImageCacheMsg,
ScriptThreadEventCategory::InputEvent => ScriptHangAnnotation::InputEvent,
ScriptThreadEventCategory::NetworkEvent => ScriptHangAnnotation::NetworkEvent,
+ ScriptThreadEventCategory::Rendering => ScriptHangAnnotation::Rendering,
ScriptThreadEventCategory::Resize => ScriptHangAnnotation::Resize,
ScriptThreadEventCategory::ScriptEvent => ScriptHangAnnotation::ScriptEvent,
ScriptThreadEventCategory::SetScrollState => ScriptHangAnnotation::SetScrollState,
@@ -376,7 +379,7 @@ unsafe extern "C" fn promise_rejection_tracker(
let trusted_promise = TrustedPromise::new(promise.clone());
// Step 5-4.
- global.dom_manipulation_task_source().queue(
+ global.task_manager().dom_manipulation_task_source().queue(
task!(rejection_handled_event: move || {
let target = target.root();
let cx = GlobalScope::get_cx();
@@ -450,6 +453,7 @@ unsafe extern "C" fn content_security_policy_allows(
scripted_caller.col,
);
global
+ .task_manager()
.dom_manipulation_task_source()
.queue(task, &global)
.unwrap();
@@ -485,7 +489,7 @@ pub fn notify_about_rejected_promises(global: &GlobalScope) {
let target = Trusted::new(global.upcast::<EventTarget>());
// Step 4.
- global.dom_manipulation_task_source().queue(
+ global.task_manager().dom_manipulation_task_source().queue(
task!(unhandled_rejection_event: move || {
let target = target.root();
let cx = GlobalScope::get_cx();
@@ -537,11 +541,11 @@ pub struct Runtime {
rt: RustRuntime,
pub microtask_queue: Rc<MicrotaskQueue>,
job_queue: *mut JobQueue,
- networking_task_src: Option<Box<NetworkingTaskSource>>,
+ networking_task_src: Option<Box<TaskSource>>,
}
impl Runtime {
- /// Create a new runtime, optionally with the given [`NetworkingTaskSource`].
+ /// Create a new runtime, optionally with the given [`TaskSource`] for networking.
///
/// # Safety
///
@@ -551,11 +555,12 @@ impl Runtime {
///
/// This, like many calls to SpiderMoney API, is unsafe.
#[allow(unsafe_code)]
- pub(crate) fn new(networking_task_source: Option<NetworkingTaskSource>) -> Runtime {
+ pub(crate) fn new(networking_task_source: Option<TaskSource>) -> Runtime {
unsafe { Self::new_with_parent(None, networking_task_source) }
}
- /// Create a new runtime, optionally with the given [`ParentRuntime`] and [`NetworkingTaskSource`].
+ /// Create a new runtime, optionally with the given [`ParentRuntime`] and [`TaskSource`]
+ /// for networking.
///
/// # Safety
///
@@ -569,7 +574,7 @@ impl Runtime {
#[allow(unsafe_code)]
pub(crate) unsafe fn new_with_parent(
parent: Option<ParentRuntime>,
- networking_task_source: Option<NetworkingTaskSource>,
+ networking_task_source: Option<TaskSource>,
) -> Runtime {
LiveDOMReferences::initialize();
let (cx, runtime) = if let Some(parent) = parent {
@@ -617,8 +622,7 @@ impl Runtime {
closure: *mut c_void,
dispatchable: *mut JSRunnable,
) -> bool {
- let networking_task_src: &NetworkingTaskSource =
- &*(closure as *mut NetworkingTaskSource);
+ let networking_task_src: &TaskSource = &*(closure as *mut TaskSource);
let runnable = Runnable(dispatchable);
let task = task!(dispatch_to_event_loop_message: move || {
if let Some(cx) = RustRuntime::get() {
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index 9789ad9f2d5..eeede2e971d 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -148,11 +148,11 @@ use crate::microtask::{Microtask, MicrotaskQueue};
use crate::realms::enter_realm;
use crate::script_module::ScriptFetchOptions;
use crate::script_runtime::{
- CanGc, CommonScriptMsg, JSContext, Runtime, ScriptThreadEventCategory, ThreadSafeJSContext,
+ CanGc, CommonScriptMsg, JSContext, Runtime, ScriptChan, ScriptThreadEventCategory,
+ ThreadSafeJSContext,
};
use crate::task_manager::TaskManager;
use crate::task_queue::TaskQueue;
-use crate::task_source::networking::NetworkingTaskSource;
use crate::task_source::{TaskSource, TaskSourceName};
use crate::{devtools, webdriver_handlers};
@@ -690,6 +690,7 @@ impl ScriptThread {
}
});
global
+ .task_manager()
.dom_manipulation_task_source()
.queue(task, global.upcast())
.expect("Enqueing navigate js task on the DOM manipulation task source failed");
@@ -901,10 +902,11 @@ impl ScriptThread {
let (self_sender, self_receiver) = unbounded();
let self_sender = MainThreadScriptChan(self_sender.clone());
- let runtime = Runtime::new(Some(NetworkingTaskSource(
- Box::new(self_sender.clone()),
- state.id,
- )));
+ let runtime = Runtime::new(Some(TaskSource {
+ sender: self_sender.as_boxed(),
+ pipeline_id: state.id,
+ name: TaskSourceName::Networking,
+ }));
let cx = runtime.cx();
unsafe {
diff --git a/components/script/task_manager.rs b/components/script/task_manager.rs
index 08d018f1066..adcca1c58d6 100644
--- a/components/script/task_manager.rs
+++ b/components/script/task_manager.rs
@@ -9,35 +9,22 @@ use std::sync::Arc;
use base::id::PipelineId;
use crate::dom::bindings::cell::DomRefCell;
-use crate::messaging::MainThreadScriptChan;
+use crate::script_runtime::ScriptChan;
use crate::task::TaskCanceller;
-use crate::task_source::dom_manipulation::DOMManipulationTaskSource;
-use crate::task_source::file_reading::FileReadingTaskSource;
-use crate::task_source::gamepad::GamepadTaskSource;
-use crate::task_source::history_traversal::HistoryTraversalTaskSource;
-use crate::task_source::media_element::MediaElementTaskSource;
-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::rendering::RenderingTaskSource;
-use crate::task_source::timer::TimerTaskSource;
-use crate::task_source::user_interaction::UserInteractionTaskSource;
-use crate::task_source::websocket::WebsocketTaskSource;
-use crate::task_source::TaskSourceName;
+use crate::task_source::{TaskSource, TaskSourceName};
macro_rules! task_source_functions {
- ($self:ident, $task_source:ident, $task_source_type:ident, $task_source_name:ident) => {
- pub(crate) fn $task_source(&$self) -> $task_source_type {
+ ($self:ident, $task_source:ident) => {
+ pub(crate) fn $task_source(&$self) -> TaskSource {
$self.$task_source.clone()
}
};
- ($self:ident, $with_canceller:ident, $task_source:ident, $task_source_type:ident, $task_source_name:ident) => {
- pub(crate) fn $with_canceller(&$self) -> ($task_source_type, TaskCanceller) {
- ($self.$task_source.clone(), $self.task_canceller(TaskSourceName::$task_source_name))
+ ($self:ident, $with_canceller:ident, $task_source:ident) => {
+ pub(crate) fn $with_canceller(&$self) -> (TaskSource, TaskCanceller) {
+ ($self.$task_source.clone(), $self.task_canceller($self.$task_source.name))
}
- pub(crate) fn $task_source(&$self) -> $task_source_type {
+ pub(crate) fn $task_source(&$self) -> TaskSource {
$self.$task_source.clone()
}
};
@@ -47,57 +34,44 @@ macro_rules! task_source_functions {
pub struct TaskManager {
#[ignore_malloc_size_of = "task sources are hard"]
pub task_cancellers: DomRefCell<HashMap<TaskSourceName, Arc<AtomicBool>>>,
- #[ignore_malloc_size_of = "task sources are hard"]
- dom_manipulation_task_source: DOMManipulationTaskSource,
- #[ignore_malloc_size_of = "task sources are hard"]
- file_reading_task_source: FileReadingTaskSource,
- #[ignore_malloc_size_of = "task sources are hard"]
- gamepad_task_source: GamepadTaskSource,
- #[ignore_malloc_size_of = "task sources are hard"]
- history_traversal_task_source: HistoryTraversalTaskSource,
- #[ignore_malloc_size_of = "task sources are hard"]
- media_element_task_source: MediaElementTaskSource,
- #[ignore_malloc_size_of = "task sources are hard"]
- networking_task_source: NetworkingTaskSource,
- #[ignore_malloc_size_of = "task sources are hard"]
- performance_timeline_task_source: PerformanceTimelineTaskSource,
- #[ignore_malloc_size_of = "task sources are hard"]
- port_message_queue: PortMessageQueue,
- #[ignore_malloc_size_of = "task sources are hard"]
- user_interaction_task_source: UserInteractionTaskSource,
- #[ignore_malloc_size_of = "task sources are hard"]
- remote_event_task_source: RemoteEventTaskSource,
- #[ignore_malloc_size_of = "task sources are hard"]
- rendering_task_source: RenderingTaskSource,
- #[ignore_malloc_size_of = "task sources are hard"]
- timer_task_source: TimerTaskSource,
- #[ignore_malloc_size_of = "task sources are hard"]
- websocket_task_source: WebsocketTaskSource,
+ dom_manipulation_task_source: TaskSource,
+ file_reading_task_source: TaskSource,
+ gamepad_task_source: TaskSource,
+ history_traversal_task_source: TaskSource,
+ media_element_task_source: TaskSource,
+ networking_task_source: TaskSource,
+ performance_timeline_task_source: TaskSource,
+ port_message_queue: TaskSource,
+ user_interaction_task_source: TaskSource,
+ remote_event_task_source: TaskSource,
+ rendering_task_source: TaskSource,
+ timer_task_source: TaskSource,
+ websocket_task_source: TaskSource,
}
impl TaskManager {
#[allow(clippy::too_many_arguments)]
- pub(crate) fn new(sender: Box<MainThreadScriptChan>, pipeline_id: PipelineId) -> Self {
+ pub(crate) fn new(sender: Box<dyn ScriptChan + Send>, pipeline_id: PipelineId) -> Self {
+ let task_source = |name| TaskSource {
+ sender: sender.as_boxed(),
+ pipeline_id,
+ name,
+ };
+
TaskManager {
- dom_manipulation_task_source: DOMManipulationTaskSource(sender.clone(), pipeline_id),
- file_reading_task_source: FileReadingTaskSource(sender.clone(), pipeline_id),
- gamepad_task_source: GamepadTaskSource(sender.clone(), pipeline_id),
- history_traversal_task_source: HistoryTraversalTaskSource(
- sender.0.clone(),
- pipeline_id,
- ),
- media_element_task_source: MediaElementTaskSource(sender.0.clone(), pipeline_id),
- networking_task_source: NetworkingTaskSource(sender.clone(), pipeline_id),
- performance_timeline_task_source: PerformanceTimelineTaskSource(
- sender.clone(),
- pipeline_id,
- ),
- port_message_queue: PortMessageQueue(sender.clone(), pipeline_id),
- user_interaction_task_source: UserInteractionTaskSource(sender.0.clone(), pipeline_id),
- remote_event_task_source: RemoteEventTaskSource(sender.clone(), pipeline_id),
- rendering_task_source: RenderingTaskSource(sender.clone(), pipeline_id),
- timer_task_source: TimerTaskSource(sender.clone(), pipeline_id),
- websocket_task_source: WebsocketTaskSource(sender.clone(), pipeline_id),
+ dom_manipulation_task_source: task_source(TaskSourceName::DOMManipulation),
+ file_reading_task_source: task_source(TaskSourceName::FileReading),
+ gamepad_task_source: task_source(TaskSourceName::Gamepad),
+ history_traversal_task_source: task_source(TaskSourceName::HistoryTraversal),
+ media_element_task_source: task_source(TaskSourceName::MediaElement),
+ networking_task_source: task_source(TaskSourceName::Networking),
+ performance_timeline_task_source: task_source(TaskSourceName::PerformanceTimeline),
+ port_message_queue: task_source(TaskSourceName::PortMessage),
+ user_interaction_task_source: task_source(TaskSourceName::UserInteraction),
+ remote_event_task_source: task_source(TaskSourceName::RemoteEvent),
+ rendering_task_source: task_source(TaskSourceName::Rendering),
+ timer_task_source: task_source(TaskSourceName::Timer),
+ websocket_task_source: task_source(TaskSourceName::WebSocket),
task_cancellers: Default::default(),
}
}
@@ -105,64 +79,27 @@ impl TaskManager {
task_source_functions!(
self,
dom_manipulation_task_source_with_canceller,
- dom_manipulation_task_source,
- DOMManipulationTaskSource,
- DOMManipulation
+ dom_manipulation_task_source
);
-
- task_source_functions!(self, gamepad_task_source, GamepadTaskSource, Gamepad);
-
+ task_source_functions!(self, gamepad_task_source);
task_source_functions!(
self,
media_element_task_source_with_canceller,
- media_element_task_source,
- MediaElementTaskSource,
- MediaElement
+ media_element_task_source
);
-
- task_source_functions!(
- self,
- user_interaction_task_source,
- UserInteractionTaskSource,
- UserInteraction
- );
-
+ task_source_functions!(self, user_interaction_task_source);
task_source_functions!(
self,
networking_task_source_with_canceller,
- networking_task_source,
- NetworkingTaskSource,
- Networking
- );
-
- task_source_functions!(
- self,
- file_reading_task_source,
- FileReadingTaskSource,
- FileReading
- );
-
- task_source_functions!(
- self,
- performance_timeline_task_source,
- PerformanceTimelineTaskSource,
- PerformanceTimeline
+ networking_task_source
);
-
- task_source_functions!(self, port_message_queue, PortMessageQueue, PortMessage);
-
- task_source_functions!(
- self,
- remote_event_task_source,
- RemoteEventTaskSource,
- RemoteEvent
- );
-
- task_source_functions!(self, rendering_task_source, RenderingTaskSource, Rendering);
-
- task_source_functions!(self, timer_task_source, TimerTaskSource, Timer);
-
- task_source_functions!(self, websocket_task_source, WebsocketTaskSource, Websocket);
+ task_source_functions!(self, file_reading_task_source);
+ task_source_functions!(self, performance_timeline_task_source);
+ task_source_functions!(self, port_message_queue);
+ task_source_functions!(self, remote_event_task_source);
+ task_source_functions!(self, rendering_task_source);
+ task_source_functions!(self, timer_task_source);
+ task_source_functions!(self, websocket_task_source);
pub fn task_canceller(&self, name: TaskSourceName) -> TaskCanceller {
let mut flags = self.task_cancellers.borrow_mut();
diff --git a/components/script/task_source.rs b/components/script/task_source.rs
new file mode 100644
index 00000000000..224357c4f67
--- /dev/null
+++ b/components/script/task_source.rs
@@ -0,0 +1,174 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * 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::fmt;
+use std::result::Result;
+
+use base::id::PipelineId;
+use malloc_size_of_derive::MallocSizeOf;
+use servo_atoms::Atom;
+
+use crate::dom::bindings::inheritance::Castable;
+use crate::dom::bindings::refcounted::Trusted;
+use crate::dom::event::{EventBubbles, EventCancelable, EventTask, SimpleEventTask};
+use crate::dom::eventtarget::EventTarget;
+use crate::dom::types::GlobalScope;
+use crate::dom::window::Window;
+use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory};
+use crate::task::{TaskCanceller, TaskOnce};
+
+/// The names of all task sources, used to differentiate TaskCancellers. Note: When adding a task
+/// source, update this enum. Note: The HistoryTraversalTaskSource is not part of this, because it
+/// doesn't implement TaskSource.
+///
+/// Note: When adding or removing a [`TaskSourceName`], be sure to also update the return value of
+/// [`TaskSourceName::all`].
+#[derive(Clone, Copy, Debug, Eq, Hash, JSTraceable, MallocSizeOf, PartialEq)]
+pub enum TaskSourceName {
+ DOMManipulation,
+ FileReading,
+ HistoryTraversal,
+ Networking,
+ PerformanceTimeline,
+ PortMessage,
+ UserInteraction,
+ RemoteEvent,
+ /// <https://html.spec.whatwg.org/multipage/#rendering-task-source>
+ Rendering,
+ MediaElement,
+ WebSocket,
+ Timer,
+ /// <https://www.w3.org/TR/gamepad/#dfn-gamepad-task-source>
+ Gamepad,
+}
+
+impl From<TaskSourceName> for ScriptThreadEventCategory {
+ fn from(value: TaskSourceName) -> Self {
+ match value {
+ TaskSourceName::DOMManipulation => ScriptThreadEventCategory::ScriptEvent,
+ TaskSourceName::FileReading => ScriptThreadEventCategory::FileRead,
+ TaskSourceName::HistoryTraversal => ScriptThreadEventCategory::HistoryEvent,
+ TaskSourceName::Networking => ScriptThreadEventCategory::NetworkEvent,
+ TaskSourceName::PerformanceTimeline => {
+ ScriptThreadEventCategory::PerformanceTimelineTask
+ },
+ TaskSourceName::PortMessage => ScriptThreadEventCategory::PortMessage,
+ TaskSourceName::UserInteraction => ScriptThreadEventCategory::InputEvent,
+ TaskSourceName::RemoteEvent => ScriptThreadEventCategory::NetworkEvent,
+ TaskSourceName::Rendering => ScriptThreadEventCategory::Rendering,
+ TaskSourceName::MediaElement => ScriptThreadEventCategory::ScriptEvent,
+ TaskSourceName::WebSocket => ScriptThreadEventCategory::WebSocketEvent,
+ TaskSourceName::Timer => ScriptThreadEventCategory::TimerEvent,
+ TaskSourceName::Gamepad => ScriptThreadEventCategory::InputEvent,
+ }
+ }
+}
+
+impl TaskSourceName {
+ pub fn all() -> &'static [TaskSourceName] {
+ &[
+ TaskSourceName::DOMManipulation,
+ TaskSourceName::FileReading,
+ TaskSourceName::HistoryTraversal,
+ TaskSourceName::Networking,
+ TaskSourceName::PerformanceTimeline,
+ TaskSourceName::PortMessage,
+ TaskSourceName::UserInteraction,
+ TaskSourceName::RemoteEvent,
+ TaskSourceName::Rendering,
+ TaskSourceName::MediaElement,
+ TaskSourceName::WebSocket,
+ TaskSourceName::Timer,
+ TaskSourceName::Gamepad,
+ ]
+ }
+}
+
+#[derive(JSTraceable, MallocSizeOf)]
+pub(crate) struct TaskSource {
+ #[ignore_malloc_size_of = "Need to push MallocSizeOf down into the ScriptChan trait implementations"]
+ pub sender: Box<dyn ScriptChan + Send + 'static>,
+ #[no_trace]
+ pub pipeline_id: PipelineId,
+ pub name: TaskSourceName,
+}
+
+impl TaskSource {
+ pub(crate) fn queue_with_canceller<T>(
+ &self,
+ task: T,
+ canceller: &TaskCanceller,
+ ) -> Result<(), ()>
+ where
+ T: TaskOnce + 'static,
+ {
+ let msg = CommonScriptMsg::Task(
+ self.name.into(),
+ Box::new(canceller.wrap_task(task)),
+ Some(self.pipeline_id),
+ self.name,
+ );
+ self.sender.send(msg).map_err(|_| ())
+ }
+
+ pub(crate) fn queue<T>(&self, task: T, global: &GlobalScope) -> Result<(), ()>
+ where
+ T: TaskOnce + 'static,
+ {
+ let canceller = global.task_canceller(self.name);
+ self.queue_with_canceller(task, &canceller)
+ }
+
+ /// This queues a task that will not be cancelled when its associated global scope gets destroyed.
+ pub(crate) fn queue_unconditionally<T>(&self, task: T) -> Result<(), ()>
+ where
+ T: TaskOnce + 'static,
+ {
+ self.sender.send(CommonScriptMsg::Task(
+ self.name.into(),
+ Box::new(task),
+ Some(self.pipeline_id),
+ self.name,
+ ))
+ }
+
+ pub(crate) fn queue_simple_event(&self, target: &EventTarget, name: Atom, window: &Window) {
+ let target = Trusted::new(target);
+ let _ = self.queue(SimpleEventTask { target, name }, window.upcast());
+ }
+
+ pub(crate) fn queue_event(
+ &self,
+ target: &EventTarget,
+ name: Atom,
+ bubbles: EventBubbles,
+ cancelable: EventCancelable,
+ window: &Window,
+ ) {
+ let target = Trusted::new(target);
+ let task = EventTask {
+ target,
+ name,
+ bubbles,
+ cancelable,
+ };
+ let _ = self.queue(task, window.upcast());
+ }
+}
+
+impl Clone for TaskSource {
+ fn clone(&self) -> Self {
+ Self {
+ sender: self.sender.as_boxed(),
+ pipeline_id: self.pipeline_id,
+ name: self.name,
+ }
+ }
+}
+
+impl fmt::Debug for TaskSource {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(f, "{:?}(...)", self.name)
+ }
+}
diff --git a/components/script/task_source/dom_manipulation.rs b/components/script/task_source/dom_manipulation.rs
deleted file mode 100644
index c7800c76239..00000000000
--- a/components/script/task_source/dom_manipulation.rs
+++ /dev/null
@@ -1,76 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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::fmt;
-use std::result::Result;
-
-use base::id::PipelineId;
-use servo_atoms::Atom;
-
-use crate::dom::bindings::inheritance::Castable;
-use crate::dom::bindings::refcounted::Trusted;
-use crate::dom::event::{EventBubbles, EventCancelable, EventTask, SimpleEventTask};
-use crate::dom::eventtarget::EventTarget;
-use crate::dom::window::Window;
-use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(JSTraceable)]
-pub struct DOMManipulationTaskSource(pub Box<dyn ScriptChan + Send>, #[no_trace] pub PipelineId);
-
-impl Clone for DOMManipulationTaskSource {
- fn clone(&self) -> DOMManipulationTaskSource {
- DOMManipulationTaskSource(self.0.as_boxed(), self.1)
- }
-}
-
-impl fmt::Debug for DOMManipulationTaskSource {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "DOMManipulationTaskSource(...)")
- }
-}
-
-impl TaskSource for DOMManipulationTaskSource {
- const NAME: TaskSourceName = TaskSourceName::DOMManipulation;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- let msg_task = CommonScriptMsg::Task(
- ScriptThreadEventCategory::ScriptEvent,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- DOMManipulationTaskSource::NAME,
- );
-
- self.0.send(msg_task).map_err(|_| ())
- }
-}
-
-impl DOMManipulationTaskSource {
- pub fn queue_event(
- &self,
- target: &EventTarget,
- name: Atom,
- bubbles: EventBubbles,
- cancelable: EventCancelable,
- window: &Window,
- ) {
- let target = Trusted::new(target);
- let task = EventTask {
- target,
- name,
- bubbles,
- cancelable,
- };
- let _ = self.queue(task, window.upcast());
- }
-
- pub fn queue_simple_event(&self, target: &EventTarget, name: Atom, window: &Window) {
- let target = Trusted::new(target);
- let _ = self.queue(SimpleEventTask { target, name }, window.upcast());
- }
-}
diff --git a/components/script/task_source/file_reading.rs b/components/script/task_source/file_reading.rs
deleted file mode 100644
index 1f46a41007a..00000000000
--- a/components/script/task_source/file_reading.rs
+++ /dev/null
@@ -1,72 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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 base::id::PipelineId;
-
-use crate::dom::domexception::DOMErrorName;
-use crate::dom::filereader::{FileReader, GenerationId, ReadMetaData, TrustedFileReader};
-use crate::script_runtime::{CanGc, CommonScriptMsg, ScriptChan, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(JSTraceable)]
-pub struct FileReadingTaskSource(
- pub Box<dyn ScriptChan + Send + 'static>,
- #[no_trace] pub PipelineId,
-);
-
-impl Clone for FileReadingTaskSource {
- fn clone(&self) -> FileReadingTaskSource {
- FileReadingTaskSource(self.0.as_boxed(), self.1)
- }
-}
-
-impl TaskSource for FileReadingTaskSource {
- const NAME: TaskSourceName = TaskSourceName::FileReading;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- self.0.send(CommonScriptMsg::Task(
- ScriptThreadEventCategory::FileRead,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- FileReadingTaskSource::NAME,
- ))
- }
-}
-
-impl TaskOnce for FileReadingTask {
- fn run_once(self) {
- self.handle_task(CanGc::note());
- }
-}
-
-#[allow(dead_code)]
-pub enum FileReadingTask {
- ProcessRead(TrustedFileReader, GenerationId),
- ProcessReadData(TrustedFileReader, GenerationId),
- ProcessReadError(TrustedFileReader, GenerationId, DOMErrorName),
- ProcessReadEOF(TrustedFileReader, GenerationId, ReadMetaData, Vec<u8>),
-}
-
-impl FileReadingTask {
- pub fn handle_task(self, can_gc: CanGc) {
- use self::FileReadingTask::*;
-
- match self {
- ProcessRead(reader, gen_id) => FileReader::process_read(reader, gen_id, can_gc),
- ProcessReadData(reader, gen_id) => {
- FileReader::process_read_data(reader, gen_id, can_gc)
- },
- ProcessReadError(reader, gen_id, error) => {
- FileReader::process_read_error(reader, gen_id, error, can_gc)
- },
- ProcessReadEOF(reader, gen_id, metadata, blob_contents) => {
- FileReader::process_read_eof(reader, gen_id, metadata, blob_contents, can_gc)
- },
- }
- }
-}
diff --git a/components/script/task_source/gamepad.rs b/components/script/task_source/gamepad.rs
deleted file mode 100644
index c0ce2736d6a..00000000000
--- a/components/script/task_source/gamepad.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use std::fmt;
-use std::result::Result;
-
-use base::id::PipelineId;
-
-use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(JSTraceable)]
-pub struct GamepadTaskSource(
- pub Box<dyn ScriptChan + Send + 'static>,
- #[no_trace] pub PipelineId,
-);
-
-impl Clone for GamepadTaskSource {
- fn clone(&self) -> GamepadTaskSource {
- GamepadTaskSource(self.0.as_boxed(), self.1)
- }
-}
-
-impl fmt::Debug for GamepadTaskSource {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "GamepadTaskSource(...)")
- }
-}
-
-impl TaskSource for GamepadTaskSource {
- const NAME: TaskSourceName = TaskSourceName::Gamepad;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- let msg = CommonScriptMsg::Task(
- ScriptThreadEventCategory::InputEvent,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- GamepadTaskSource::NAME,
- );
- self.0.send(msg).map_err(|_| ())
- }
-}
diff --git a/components/script/task_source/history_traversal.rs b/components/script/task_source/history_traversal.rs
deleted file mode 100644
index 9eb2daa4dfd..00000000000
--- a/components/script/task_source/history_traversal.rs
+++ /dev/null
@@ -1,34 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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 base::id::PipelineId;
-use crossbeam_channel::Sender;
-
-use crate::messaging::MainThreadScriptMsg;
-use crate::script_runtime::{CommonScriptMsg, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(Clone, JSTraceable)]
-pub(crate) struct HistoryTraversalTaskSource(
- #[no_trace] pub Sender<MainThreadScriptMsg>,
- #[no_trace] pub PipelineId,
-);
-
-impl TaskSource for HistoryTraversalTaskSource {
- const NAME: TaskSourceName = TaskSourceName::HistoryTraversal;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- let msg = MainThreadScriptMsg::Common(CommonScriptMsg::Task(
- ScriptThreadEventCategory::HistoryEvent,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- HistoryTraversalTaskSource::NAME,
- ));
- self.0.send(msg).map_err(|_| ())
- }
-}
diff --git a/components/script/task_source/media_element.rs b/components/script/task_source/media_element.rs
deleted file mode 100644
index f1dfc7f88e7..00000000000
--- a/components/script/task_source/media_element.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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::fmt;
-use std::result::Result;
-
-use base::id::PipelineId;
-use crossbeam_channel::Sender;
-use servo_atoms::Atom;
-
-use crate::dom::bindings::inheritance::Castable;
-use crate::dom::bindings::refcounted::Trusted;
-use crate::dom::event::SimpleEventTask;
-use crate::dom::eventtarget::EventTarget;
-use crate::dom::window::Window;
-use crate::messaging::MainThreadScriptMsg;
-use crate::script_runtime::{CommonScriptMsg, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(Clone, JSTraceable)]
-pub(crate) struct MediaElementTaskSource(
- #[no_trace] pub Sender<MainThreadScriptMsg>,
- #[no_trace] pub PipelineId,
-);
-
-impl fmt::Debug for MediaElementTaskSource {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "MediaElementTaskSource(...)")
- }
-}
-
-impl TaskSource for MediaElementTaskSource {
- const NAME: TaskSourceName = TaskSourceName::MediaElement;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- let msg = MainThreadScriptMsg::Common(CommonScriptMsg::Task(
- ScriptThreadEventCategory::ScriptEvent,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- MediaElementTaskSource::NAME,
- ));
- self.0.send(msg).map_err(|_| ())
- }
-}
-
-impl MediaElementTaskSource {
- pub fn queue_simple_event(&self, target: &EventTarget, name: Atom, window: &Window) {
- let target = Trusted::new(target);
- let _ = self.queue(SimpleEventTask { target, name }, window.upcast());
- }
-}
diff --git a/components/script/task_source/mod.rs b/components/script/task_source/mod.rs
deleted file mode 100644
index beddc9495c6..00000000000
--- a/components/script/task_source/mod.rs
+++ /dev/null
@@ -1,83 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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/. */
-
-pub mod dom_manipulation;
-pub mod file_reading;
-pub mod gamepad;
-pub mod history_traversal;
-pub mod media_element;
-pub mod networking;
-pub mod performance_timeline;
-pub mod port_message;
-pub mod remote_event;
-pub mod rendering;
-pub mod timer;
-pub mod user_interaction;
-pub mod websocket;
-
-use std::result::Result;
-
-use crate::dom::globalscope::GlobalScope;
-use crate::task::{TaskCanceller, TaskOnce};
-
-/// The names of all task sources, used to differentiate TaskCancellers. Note: When adding a task
-/// source, update this enum. Note: The HistoryTraversalTaskSource is not part of this, because it
-/// doesn't implement TaskSource.
-///
-/// Note: When adding or removing a [`TaskSourceName`], be sure to also update the return value of
-/// [`TaskSourceName::all`].
-#[derive(Clone, Copy, Eq, Hash, JSTraceable, PartialEq)]
-pub enum TaskSourceName {
- DOMManipulation,
- FileReading,
- HistoryTraversal,
- Networking,
- PerformanceTimeline,
- PortMessage,
- UserInteraction,
- RemoteEvent,
- /// <https://html.spec.whatwg.org/multipage/#rendering-task-source>
- Rendering,
- MediaElement,
- Websocket,
- Timer,
- /// <https://www.w3.org/TR/gamepad/#dfn-gamepad-task-source>
- Gamepad,
-}
-
-impl TaskSourceName {
- pub fn all() -> &'static [TaskSourceName] {
- &[
- TaskSourceName::DOMManipulation,
- TaskSourceName::FileReading,
- TaskSourceName::HistoryTraversal,
- TaskSourceName::Networking,
- TaskSourceName::PerformanceTimeline,
- TaskSourceName::PortMessage,
- TaskSourceName::UserInteraction,
- TaskSourceName::RemoteEvent,
- TaskSourceName::Rendering,
- TaskSourceName::MediaElement,
- TaskSourceName::Websocket,
- TaskSourceName::Timer,
- TaskSourceName::Gamepad,
- ]
- }
-}
-
-pub trait TaskSource {
- const NAME: TaskSourceName;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static;
-
- fn queue<T>(&self, task: T, global: &GlobalScope) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- let canceller = global.task_canceller(Self::NAME);
- self.queue_with_canceller(task, &canceller)
- }
-}
diff --git a/components/script/task_source/networking.rs b/components/script/task_source/networking.rs
deleted file mode 100644
index 1e5f35a1153..00000000000
--- a/components/script/task_source/networking.rs
+++ /dev/null
@@ -1,53 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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 base::id::PipelineId;
-
-use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(JSTraceable)]
-pub struct NetworkingTaskSource(
- pub Box<dyn ScriptChan + Send + 'static>,
- #[no_trace] pub PipelineId,
-);
-
-impl Clone for NetworkingTaskSource {
- fn clone(&self) -> NetworkingTaskSource {
- NetworkingTaskSource(self.0.as_boxed(), self.1)
- }
-}
-
-impl TaskSource for NetworkingTaskSource {
- const NAME: TaskSourceName = TaskSourceName::Networking;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- self.0.send(CommonScriptMsg::Task(
- ScriptThreadEventCategory::NetworkEvent,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- NetworkingTaskSource::NAME,
- ))
- }
-}
-
-impl NetworkingTaskSource {
- /// This queues a task that will not be cancelled when its associated
- /// global scope gets destroyed.
- pub fn queue_unconditionally<T>(&self, task: T) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- self.0.send(CommonScriptMsg::Task(
- ScriptThreadEventCategory::NetworkEvent,
- Box::new(task),
- Some(self.1),
- NetworkingTaskSource::NAME,
- ))
- }
-}
diff --git a/components/script/task_source/performance_timeline.rs b/components/script/task_source/performance_timeline.rs
deleted file mode 100644
index d18ceacf663..00000000000
--- a/components/script/task_source/performance_timeline.rs
+++ /dev/null
@@ -1,66 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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/. */
-
-// XXX The spec says that the performance timeline task source should be
-// a low priority task and it should be processed during idle periods.
-// We are currently treating this task queue as a normal priority queue.
-
-use std::fmt;
-use std::result::Result;
-
-use base::id::PipelineId;
-
-use crate::dom::bindings::refcounted::Trusted;
-use crate::dom::globalscope::GlobalScope;
-use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(JSTraceable)]
-pub struct PerformanceTimelineTaskSource(
- pub Box<dyn ScriptChan + Send + 'static>,
- #[no_trace] pub PipelineId,
-);
-
-impl Clone for PerformanceTimelineTaskSource {
- fn clone(&self) -> PerformanceTimelineTaskSource {
- PerformanceTimelineTaskSource(self.0.as_boxed(), self.1)
- }
-}
-
-impl fmt::Debug for PerformanceTimelineTaskSource {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "PerformanceTimelineTaskSource(...)")
- }
-}
-
-impl TaskSource for PerformanceTimelineTaskSource {
- const NAME: TaskSourceName = TaskSourceName::PerformanceTimeline;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- let msg = CommonScriptMsg::Task(
- ScriptThreadEventCategory::PerformanceTimelineTask,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- PerformanceTimelineTaskSource::NAME,
- );
- self.0.send(msg).map_err(|_| ())
- }
-}
-
-impl PerformanceTimelineTaskSource {
- pub fn queue_notification(&self, global: &GlobalScope) {
- let owner = Trusted::new(&*global.performance());
- // FIXME(nox): Why are errors silenced here?
- let _ = self.queue(
- task!(notify_performance_observers: move || {
- owner.root().notify_observers();
- }),
- global,
- );
- }
-}
diff --git a/components/script/task_source/port_message.rs b/components/script/task_source/port_message.rs
deleted file mode 100644
index ebc06489ca1..00000000000
--- a/components/script/task_source/port_message.rs
+++ /dev/null
@@ -1,46 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use std::fmt;
-
-use base::id::PipelineId;
-
-use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(JSTraceable)]
-pub struct PortMessageQueue(
- pub Box<dyn ScriptChan + Send + 'static>,
- #[no_trace] pub PipelineId,
-);
-
-impl Clone for PortMessageQueue {
- fn clone(&self) -> PortMessageQueue {
- PortMessageQueue(self.0.as_boxed(), self.1)
- }
-}
-
-impl fmt::Debug for PortMessageQueue {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "PortMessageQueue(...)")
- }
-}
-
-impl TaskSource for PortMessageQueue {
- const NAME: TaskSourceName = TaskSourceName::PortMessage;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- let msg = CommonScriptMsg::Task(
- ScriptThreadEventCategory::PortMessage,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- Self::NAME,
- );
- self.0.send(msg).map_err(|_| ())
- }
-}
diff --git a/components/script/task_source/remote_event.rs b/components/script/task_source/remote_event.rs
deleted file mode 100644
index 12dbc5321a8..00000000000
--- a/components/script/task_source/remote_event.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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 base::id::PipelineId;
-
-use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(JSTraceable)]
-pub struct RemoteEventTaskSource(
- pub Box<dyn ScriptChan + Send + 'static>,
- #[no_trace] pub PipelineId,
-);
-
-impl Clone for RemoteEventTaskSource {
- fn clone(&self) -> RemoteEventTaskSource {
- RemoteEventTaskSource(self.0.as_boxed(), self.1)
- }
-}
-
-impl TaskSource for RemoteEventTaskSource {
- const NAME: TaskSourceName = TaskSourceName::RemoteEvent;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- self.0.send(CommonScriptMsg::Task(
- ScriptThreadEventCategory::NetworkEvent,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- RemoteEventTaskSource::NAME,
- ))
- }
-}
diff --git a/components/script/task_source/rendering.rs b/components/script/task_source/rendering.rs
deleted file mode 100644
index d6d0b2a5018..00000000000
--- a/components/script/task_source/rendering.rs
+++ /dev/null
@@ -1,61 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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::fmt;
-use std::result::Result;
-
-use base::id::PipelineId;
-
-use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(JSTraceable)]
-pub struct RenderingTaskSource(pub Box<dyn ScriptChan + Send>, #[no_trace] pub PipelineId);
-
-impl Clone for RenderingTaskSource {
- fn clone(&self) -> RenderingTaskSource {
- RenderingTaskSource(self.0.as_boxed(), self.1)
- }
-}
-
-impl fmt::Debug for RenderingTaskSource {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "RenderingTaskSource(...)")
- }
-}
-
-impl TaskSource for RenderingTaskSource {
- const NAME: TaskSourceName = TaskSourceName::Rendering;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- let msg_task = CommonScriptMsg::Task(
- ScriptThreadEventCategory::ScriptEvent,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- RenderingTaskSource::NAME,
- );
-
- self.0.send(msg_task).map_err(|_| ())
- }
-}
-
-impl RenderingTaskSource {
- /// This queues a task that will not be cancelled when its associated
- /// global scope gets destroyed.
- pub fn queue_unconditionally<T>(&self, task: T) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- self.0.send(CommonScriptMsg::Task(
- ScriptThreadEventCategory::NetworkEvent,
- Box::new(task),
- Some(self.1),
- RenderingTaskSource::NAME,
- ))
- }
-}
diff --git a/components/script/task_source/timer.rs b/components/script/task_source/timer.rs
deleted file mode 100644
index 1c274231693..00000000000
--- a/components/script/task_source/timer.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-use std::fmt;
-
-use base::id::PipelineId;
-
-use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(JSTraceable)]
-/// <https://html.spec.whatwg.org/multipage/#timer-task-source>
-pub struct TimerTaskSource(
- pub Box<dyn ScriptChan + Send + 'static>,
- #[no_trace] pub PipelineId,
-);
-
-impl Clone for TimerTaskSource {
- fn clone(&self) -> TimerTaskSource {
- TimerTaskSource(self.0.as_boxed(), self.1)
- }
-}
-
-impl fmt::Debug for TimerTaskSource {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "TimerTaskSource(...)")
- }
-}
-
-impl TaskSource for TimerTaskSource {
- const NAME: TaskSourceName = TaskSourceName::Timer;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- let msg = CommonScriptMsg::Task(
- ScriptThreadEventCategory::TimerEvent,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- Self::NAME,
- );
- self.0.send(msg).map_err(|_| ())
- }
-}
diff --git a/components/script/task_source/user_interaction.rs b/components/script/task_source/user_interaction.rs
deleted file mode 100644
index 19ed025fc9a..00000000000
--- a/components/script/task_source/user_interaction.rs
+++ /dev/null
@@ -1,69 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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::fmt;
-use std::result::Result;
-
-use base::id::PipelineId;
-use crossbeam_channel::Sender;
-use servo_atoms::Atom;
-
-use crate::dom::bindings::inheritance::Castable;
-use crate::dom::bindings::refcounted::Trusted;
-use crate::dom::event::{EventBubbles, EventCancelable, EventTask};
-use crate::dom::eventtarget::EventTarget;
-use crate::dom::window::Window;
-use crate::messaging::MainThreadScriptMsg;
-use crate::script_runtime::{CommonScriptMsg, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(Clone, JSTraceable)]
-pub struct UserInteractionTaskSource(
- #[no_trace] pub Sender<MainThreadScriptMsg>,
- #[no_trace] pub PipelineId,
-);
-
-impl fmt::Debug for UserInteractionTaskSource {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "UserInteractionTaskSource(...)")
- }
-}
-
-impl TaskSource for UserInteractionTaskSource {
- const NAME: TaskSourceName = TaskSourceName::UserInteraction;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- let msg = MainThreadScriptMsg::Common(CommonScriptMsg::Task(
- ScriptThreadEventCategory::InputEvent,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- UserInteractionTaskSource::NAME,
- ));
- self.0.send(msg).map_err(|_| ())
- }
-}
-
-impl UserInteractionTaskSource {
- pub fn queue_event(
- &self,
- target: &EventTarget,
- name: Atom,
- bubbles: EventBubbles,
- cancelable: EventCancelable,
- window: &Window,
- ) {
- let target = Trusted::new(target);
- let task = EventTask {
- target,
- name,
- bubbles,
- cancelable,
- };
- let _ = self.queue(task, window.upcast());
- }
-}
diff --git a/components/script/task_source/websocket.rs b/components/script/task_source/websocket.rs
deleted file mode 100644
index 2ae11f99eb8..00000000000
--- a/components/script/task_source/websocket.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * 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 base::id::PipelineId;
-
-use crate::script_runtime::{CommonScriptMsg, ScriptChan, ScriptThreadEventCategory};
-use crate::task::{TaskCanceller, TaskOnce};
-use crate::task_source::{TaskSource, TaskSourceName};
-
-#[derive(JSTraceable)]
-pub struct WebsocketTaskSource(
- pub Box<dyn ScriptChan + Send + 'static>,
- #[no_trace] pub PipelineId,
-);
-
-impl Clone for WebsocketTaskSource {
- fn clone(&self) -> WebsocketTaskSource {
- WebsocketTaskSource(self.0.as_boxed(), self.1)
- }
-}
-
-impl TaskSource for WebsocketTaskSource {
- const NAME: TaskSourceName = TaskSourceName::Websocket;
-
- fn queue_with_canceller<T>(&self, task: T, canceller: &TaskCanceller) -> Result<(), ()>
- where
- T: TaskOnce + 'static,
- {
- self.0.send(CommonScriptMsg::Task(
- ScriptThreadEventCategory::NetworkEvent,
- Box::new(canceller.wrap_task(task)),
- Some(self.1),
- WebsocketTaskSource::NAME,
- ))
- }
-}