script: Migrate swmanager to GenericChannel (#39076)

Migrate `ServiceWorkerMsg` and `SWManagerMsg` to GenericChannel

Testing: Covered by service worker wpt tests
Part of #38912

Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
This commit is contained in:
Jonathan Schwender 2025-09-01 21:23:16 +02:00 committed by GitHub
parent 93aeac056b
commit ce8b05738c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 44 additions and 34 deletions

View file

@ -7,6 +7,7 @@ use std::sync::atomic::AtomicBool;
use std::thread::{self, JoinHandle};
use std::time::{Duration, Instant};
use base::generic_channel::GenericSender;
use base::id::PipelineId;
use constellation_traits::{
ScopeThings, ServiceWorkerMsg, WorkerGlobalScopeInit, WorkerScriptLoadOrigin,
@ -15,7 +16,7 @@ use crossbeam_channel::{Receiver, Sender, after, unbounded};
use devtools_traits::DevtoolScriptControlMsg;
use dom_struct::dom_struct;
use fonts::FontContext;
use ipc_channel::ipc::{IpcReceiver, IpcSender};
use ipc_channel::ipc::IpcReceiver;
use ipc_channel::router::ROUTER;
use js::jsapi::{JS_AddInterruptCallback, JSContext};
use js::jsval::UndefinedValue;
@ -161,7 +162,7 @@ pub(crate) struct ServiceWorkerGlobalScope {
#[ignore_malloc_size_of = "Defined in std"]
#[no_trace]
swmanager_sender: IpcSender<ServiceWorkerMsg>,
swmanager_sender: GenericSender<ServiceWorkerMsg>,
#[no_trace]
scope_url: ServoUrl,
@ -224,7 +225,7 @@ impl ServiceWorkerGlobalScope {
own_sender: Sender<ServiceWorkerScriptMsg>,
receiver: Receiver<ServiceWorkerScriptMsg>,
time_out_port: Receiver<Instant>,
swmanager_sender: IpcSender<ServiceWorkerMsg>,
swmanager_sender: GenericSender<ServiceWorkerMsg>,
scope_url: ServoUrl,
control_receiver: Receiver<ServiceWorkerControlMsg>,
closing: Arc<AtomicBool>,
@ -263,7 +264,7 @@ impl ServiceWorkerGlobalScope {
own_sender: Sender<ServiceWorkerScriptMsg>,
receiver: Receiver<ServiceWorkerScriptMsg>,
time_out_port: Receiver<Instant>,
swmanager_sender: IpcSender<ServiceWorkerMsg>,
swmanager_sender: GenericSender<ServiceWorkerMsg>,
scope_url: ServoUrl,
control_receiver: Receiver<ServiceWorkerControlMsg>,
closing: Arc<AtomicBool>,
@ -293,7 +294,7 @@ impl ServiceWorkerGlobalScope {
own_sender: Sender<ServiceWorkerScriptMsg>,
receiver: Receiver<ServiceWorkerScriptMsg>,
devtools_receiver: IpcReceiver<DevtoolScriptControlMsg>,
swmanager_sender: IpcSender<ServiceWorkerMsg>,
swmanager_sender: GenericSender<ServiceWorkerMsg>,
scope_url: ServoUrl,
control_receiver: Receiver<ServiceWorkerControlMsg>,
context_sender: Sender<ThreadSafeJSContext>,

View file

@ -12,14 +12,15 @@ use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
use std::thread::{self, JoinHandle};
use base::generic_channel::{self, GenericSender, ReceiveError, RoutedReceiver};
use base::id::{PipelineNamespace, ServiceWorkerId, ServiceWorkerRegistrationId};
use constellation_traits::{
DOMMessage, Job, JobError, JobResult, JobResultValue, JobType, SWManagerMsg, SWManagerSenders,
ScopeThings, ServiceWorkerManagerFactory, ServiceWorkerMsg,
};
use crossbeam_channel::{Receiver, RecvError, Sender, select, unbounded};
use crossbeam_channel::{Receiver, Sender, select, unbounded};
use fonts::FontContext;
use ipc_channel::ipc::{self, IpcSender};
use ipc_channel::ipc;
use ipc_channel::router::ROUTER;
use net_traits::{CoreResourceMsg, CustomResponseMediator};
use servo_config::pref;
@ -217,11 +218,11 @@ pub struct ServiceWorkerManager {
registrations: HashMap<ServoUrl, ServiceWorkerRegistration>,
// Will be useful to implement posting a message to a client.
// See https://github.com/servo/servo/issues/24660
_constellation_sender: IpcSender<SWManagerMsg>,
_constellation_sender: GenericSender<SWManagerMsg>,
// own sender to send messages here
own_sender: IpcSender<ServiceWorkerMsg>,
own_sender: GenericSender<ServiceWorkerMsg>,
// receiver to receive messages from constellation
own_port: Receiver<ServiceWorkerMsg>,
own_port: RoutedReceiver<ServiceWorkerMsg>,
// to receive resource messages
resource_receiver: Receiver<CustomResponseMediator>,
/// A shared [`FontContext`] to use for all service workers spawned by this [`ServiceWorkerManager`].
@ -230,10 +231,10 @@ pub struct ServiceWorkerManager {
impl ServiceWorkerManager {
fn new(
own_sender: IpcSender<ServiceWorkerMsg>,
from_constellation_receiver: Receiver<ServiceWorkerMsg>,
own_sender: GenericSender<ServiceWorkerMsg>,
from_constellation_receiver: RoutedReceiver<ServiceWorkerMsg>,
resource_port: Receiver<CustomResponseMediator>,
constellation_sender: IpcSender<SWManagerMsg>,
constellation_sender: GenericSender<SWManagerMsg>,
font_context: Arc<FontContext>,
) -> ServiceWorkerManager {
// Install a pipeline-namespace in the current thread.
@ -289,10 +290,10 @@ impl ServiceWorkerManager {
true
}
fn receive_message(&mut self) -> Result<Message, RecvError> {
fn receive_message(&mut self) -> generic_channel::ReceiveResult<Message> {
select! {
recv(self.own_port) -> msg => msg.map(|m| Message::FromConstellation(Box::new(m))),
recv(self.resource_receiver) -> msg => msg.map(Message::FromResource),
recv(self.own_port) -> result_msg => generic_channel::to_receive_result::<ServiceWorkerMsg>(result_msg).map(|msg| Message::FromConstellation(Box::new(msg))),
recv(self.resource_receiver) -> msg => msg.map(Message::FromResource).map_err(|_e| ReceiveError::Disconnected),
}
}
@ -452,7 +453,7 @@ impl ServiceWorkerManager {
/// <https://w3c.github.io/ServiceWorker/#update-algorithm>
fn update_serviceworker(
own_sender: IpcSender<ServiceWorkerMsg>,
own_sender: GenericSender<ServiceWorkerMsg>,
scope_url: ServoUrl,
scope_things: ScopeThings,
font_context: Arc<FontContext>,
@ -510,7 +511,7 @@ impl ServiceWorkerManagerFactory for ServiceWorkerManager {
compositor_api,
} = sw_senders;
let from_constellation = ROUTER.route_ipc_receiver_to_new_crossbeam_receiver(receiver);
let from_constellation = receiver.route_preserving_errors();
let resource_port = ROUTER.route_ipc_receiver_to_new_crossbeam_receiver(resource_port);
let _ = resource_threads
.core_thread