From 7e2d2ed0ce79ee090fec677ecb35e22e8955c7a8 Mon Sep 17 00:00:00 2001 From: Gae24 <96017547+Gae24@users.noreply.github.com> Date: Sun, 4 May 2025 19:05:27 +0200 Subject: [PATCH] script: add `TaskSource` argument to `route_promise` (#36831) Added task_source argument to route_promise, enabling callers to pick the correct TaskSource. Testing: No testing required, straightforward refactor Fixes: #36825 Signed-off-by: Gae24 <96017547+Gae24@users.noreply.github.com> --- components/script/dom/servointernals.rs | 4 +++- components/script/dom/webgpu/gpu.rs | 4 +++- components/script/dom/webgpu/gpuadapter.rs | 6 +++++- components/script/dom/webgpu/gpubuffer.rs | 6 +++++- components/script/dom/webgpu/gpudevice.rs | 18 +++++++++++++++--- components/script/dom/webgpu/gpuqueue.rs | 4 +++- .../script/dom/webgpu/gpushadermodule.rs | 9 ++++++++- components/script/routed_promise.rs | 10 ++++------ 8 files changed, 46 insertions(+), 15 deletions(-) diff --git a/components/script/dom/servointernals.rs b/components/script/dom/servointernals.rs index 54516c9a5b0..eb7260b61be 100644 --- a/components/script/dom/servointernals.rs +++ b/components/script/dom/servointernals.rs @@ -43,7 +43,9 @@ impl ServoInternalsMethods for ServoInternals { fn ReportMemory(&self, comp: InRealm, can_gc: CanGc) -> Rc { let global = &self.global(); let promise = Promise::new_in_current_realm(comp, can_gc); - let sender = route_promise(&promise, self); + let task_source = global.task_manager().dom_manipulation_task_source(); + let sender = route_promise(&promise, self, task_source); + let script_to_constellation_chan = global.script_to_constellation_chan(); if script_to_constellation_chan .send(ScriptToConstellationMessage::ReportMemory(sender)) diff --git a/components/script/dom/webgpu/gpu.rs b/components/script/dom/webgpu/gpu.rs index f02ae386772..20380e07bfb 100644 --- a/components/script/dom/webgpu/gpu.rs +++ b/components/script/dom/webgpu/gpu.rs @@ -56,7 +56,9 @@ impl GPUMethods for GPU { ) -> Rc { let global = &self.global(); let promise = Promise::new_in_current_realm(comp, can_gc); - let sender = route_promise(&promise, self); + let task_source = global.task_manager().dom_manipulation_task_source(); + let sender = route_promise(&promise, self, task_source); + let power_preference = match options.powerPreference { Some(GPUPowerPreference::Low_power) => PowerPreference::LowPower, Some(GPUPowerPreference::High_performance) => PowerPreference::HighPerformance, diff --git a/components/script/dom/webgpu/gpuadapter.rs b/components/script/dom/webgpu/gpuadapter.rs index 16d5dfed4a2..e22eca173ca 100644 --- a/components/script/dom/webgpu/gpuadapter.rs +++ b/components/script/dom/webgpu/gpuadapter.rs @@ -117,7 +117,11 @@ impl GPUAdapterMethods for GPUAdapter { ) -> Rc { // Step 2 let promise = Promise::new_in_current_realm(comp, can_gc); - let sender = route_promise(&promise, self); + let sender = route_promise( + &promise, + self, + self.global().task_manager().dom_manipulation_task_source(), + ); let mut required_features = wgpu_types::Features::empty(); for &ext in descriptor.requiredFeatures.iter() { if let Some(feature) = gpu_to_wgt_feature(ext) { diff --git a/components/script/dom/webgpu/gpubuffer.rs b/components/script/dom/webgpu/gpubuffer.rs index e8d5b8a16dd..0b41d386b4a 100644 --- a/components/script/dom/webgpu/gpubuffer.rs +++ b/components/script/dom/webgpu/gpubuffer.rs @@ -271,7 +271,11 @@ impl GPUBufferMethods for GPUBuffer { }, }; - let sender = route_promise(&promise, self); + let sender = route_promise( + &promise, + self, + self.global().task_manager().dom_manipulation_task_source(), + ); if let Err(e) = self.channel.0.send(WebGPURequest::BufferMapAsync { sender, buffer_id: self.buffer.0, diff --git a/components/script/dom/webgpu/gpudevice.rs b/components/script/dom/webgpu/gpudevice.rs index 17b4425275e..9fa9f044daa 100644 --- a/components/script/dom/webgpu/gpudevice.rs +++ b/components/script/dom/webgpu/gpudevice.rs @@ -470,7 +470,11 @@ impl GPUDeviceMethods for GPUDevice { can_gc: CanGc, ) -> Rc { let promise = Promise::new_in_current_realm(comp, can_gc); - let sender = route_promise(&promise, self); + let sender = route_promise( + &promise, + self, + self.global().task_manager().dom_manipulation_task_source(), + ); GPUComputePipeline::create(self, descriptor, Some(sender)); promise } @@ -518,7 +522,11 @@ impl GPUDeviceMethods for GPUDevice { ) -> Fallible> { let (implicit_ids, desc) = self.parse_render_pipeline(descriptor)?; let promise = Promise::new_in_current_realm(comp, can_gc); - let sender = route_promise(&promise, self); + let sender = route_promise( + &promise, + self, + self.global().task_manager().dom_manipulation_task_source(), + ); GPURenderPipeline::create(self, implicit_ids, desc, Some(sender))?; Ok(promise) } @@ -549,7 +557,11 @@ impl GPUDeviceMethods for GPUDevice { /// fn PopErrorScope(&self, comp: InRealm, can_gc: CanGc) -> Rc { let promise = Promise::new_in_current_realm(comp, can_gc); - let sender = route_promise(&promise, self); + let sender = route_promise( + &promise, + self, + self.global().task_manager().dom_manipulation_task_source(), + ); if self .channel .0 diff --git a/components/script/dom/webgpu/gpuqueue.rs b/components/script/dom/webgpu/gpuqueue.rs index bdcb2c53782..535e315e8c0 100644 --- a/components/script/dom/webgpu/gpuqueue.rs +++ b/components/script/dom/webgpu/gpuqueue.rs @@ -200,7 +200,9 @@ impl GPUQueueMethods for GPUQueue { fn OnSubmittedWorkDone(&self, can_gc: CanGc) -> Rc { let global = self.global(); let promise = Promise::new(&global, can_gc); - let sender = route_promise(&promise, self); + let task_source = global.task_manager().dom_manipulation_task_source(); + let sender = route_promise(&promise, self, task_source); + if let Err(e) = self .channel .0 diff --git a/components/script/dom/webgpu/gpushadermodule.rs b/components/script/dom/webgpu/gpushadermodule.rs index fd9e65788c8..79d1325cf0f 100644 --- a/components/script/dom/webgpu/gpushadermodule.rs +++ b/components/script/dom/webgpu/gpushadermodule.rs @@ -95,7 +95,14 @@ impl GPUShaderModule { promise.clone(), can_gc, ); - let sender = route_promise(&promise, &*shader_module); + let sender = route_promise( + &promise, + &*shader_module, + device + .global() + .task_manager() + .dom_manipulation_task_source(), + ); device .channel() .0 diff --git a/components/script/routed_promise.rs b/components/script/routed_promise.rs index 67e5edd7370..c3eea88ed71 100644 --- a/components/script/routed_promise.rs +++ b/components/script/routed_promise.rs @@ -10,9 +10,10 @@ use serde::Serialize; use serde::de::DeserializeOwned; use crate::dom::bindings::refcounted::{Trusted, TrustedPromise}; -use crate::dom::bindings::reflector::{DomGlobal, DomObject}; +use crate::dom::bindings::reflector::DomObject; use crate::dom::promise::Promise; use crate::script_runtime::CanGc; +use crate::task_source::TaskSource; pub(crate) trait RoutedPromiseListener { fn handle_response(&self, response: R, promise: &Rc, can_gc: CanGc); @@ -44,13 +45,10 @@ pub(crate) fn route_promise< >( promise: &Rc, receiver: &T, + task_source: TaskSource, ) -> IpcSender { let (action_sender, action_receiver) = ipc::channel().unwrap(); - let task_source = receiver - .global() - .task_manager() - .dom_manipulation_task_source() - .to_sendable(); + let task_source = task_source.to_sendable(); let mut trusted: Option = Some(TrustedPromise::new(promise.clone())); let trusted_receiver = Trusted::new(receiver); ROUTER.add_typed_route(