aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/serviceworker_manager.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/serviceworker_manager.rs')
-rw-r--r--components/script/serviceworker_manager.rs64
1 files changed, 42 insertions, 22 deletions
diff --git a/components/script/serviceworker_manager.rs b/components/script/serviceworker_manager.rs
index 109628ae94e..66d4d995d32 100644
--- a/components/script/serviceworker_manager.rs
+++ b/components/script/serviceworker_manager.rs
@@ -15,8 +15,12 @@ use devtools_traits::{DevtoolsPageInfo, ScriptToDevtoolsControlMsg};
use ipc_channel::ipc::{self, IpcSender};
use ipc_channel::router::ROUTER;
use net_traits::{CoreResourceMsg, CustomResponseMediator};
-use script_traits::{DOMMessage, SWManagerMsg, SWManagerSenders, ScopeThings, ServiceWorkerMsg};
+use script_traits::{
+ DOMMessage, SWManagerMsg, SWManagerSenders, ScopeThings, ServiceWorkerManagerFactory,
+ ServiceWorkerMsg,
+};
use servo_config::pref;
+use servo_url::ImmutableOrigin;
use servo_url::ServoUrl;
use std::collections::HashMap;
use std::thread;
@@ -31,6 +35,9 @@ pub struct ServiceWorkerManager {
registered_workers: HashMap<ServoUrl, ScopeThings>,
// map of active service worker descriptors
active_workers: HashMap<ServoUrl, Sender<ServiceWorkerScriptMsg>>,
+ // Will be useful to implement posting a message to a client.
+ // See https://github.com/servo/servo/issues/24660
+ _constellation_sender: IpcSender<SWManagerMsg>,
// own sender to send messages here
own_sender: IpcSender<ServiceWorkerMsg>,
// receiver to receive messages from constellation
@@ -44,6 +51,7 @@ impl ServiceWorkerManager {
own_sender: IpcSender<ServiceWorkerMsg>,
from_constellation_receiver: Receiver<ServiceWorkerMsg>,
resource_port: Receiver<CustomResponseMediator>,
+ constellation_sender: IpcSender<SWManagerMsg>,
) -> ServiceWorkerManager {
ServiceWorkerManager {
registered_workers: HashMap::new(),
@@ -51,30 +59,10 @@ impl ServiceWorkerManager {
own_sender: own_sender,
own_port: from_constellation_receiver,
resource_receiver: resource_port,
+ _constellation_sender: constellation_sender,
}
}
- pub fn spawn_manager(sw_senders: SWManagerSenders) {
- let (own_sender, from_constellation_receiver) = ipc::channel().unwrap();
- let (resource_chan, resource_port) = ipc::channel().unwrap();
- let from_constellation =
- ROUTER.route_ipc_receiver_to_new_crossbeam_receiver(from_constellation_receiver);
- let resource_port = ROUTER.route_ipc_receiver_to_new_crossbeam_receiver(resource_port);
- let _ = sw_senders
- .resource_sender
- .send(CoreResourceMsg::NetworkMediator(resource_chan));
- let _ = sw_senders
- .swmanager_sender
- .send(SWManagerMsg::OwnSender(own_sender.clone()));
- thread::Builder::new()
- .name("ServiceWorkerManager".to_owned())
- .spawn(move || {
- ServiceWorkerManager::new(own_sender, from_constellation, resource_port)
- .handle_message();
- })
- .expect("Thread spawning failed");
- }
-
pub fn get_matching_scope(&self, load_url: &ServoUrl) -> Option<ServoUrl> {
for scope in self.registered_workers.keys() {
if longest_prefix_match(&scope, load_url) {
@@ -203,6 +191,38 @@ impl ServiceWorkerManager {
}
}
+impl ServiceWorkerManagerFactory for ServiceWorkerManager {
+ fn create(sw_senders: SWManagerSenders, _origin: ImmutableOrigin) {
+ let (resource_chan, resource_port) = ipc::channel().unwrap();
+
+ let SWManagerSenders {
+ resource_sender,
+ own_sender,
+ receiver,
+ swmanager_sender: constellation_sender,
+ } = sw_senders;
+
+ let from_constellation = ROUTER.route_ipc_receiver_to_new_crossbeam_receiver(receiver);
+ let resource_port = ROUTER.route_ipc_receiver_to_new_crossbeam_receiver(resource_port);
+ let _ = resource_sender.send(CoreResourceMsg::NetworkMediator(resource_chan));
+ if thread::Builder::new()
+ .name("ServiceWorkerManager".to_owned())
+ .spawn(move || {
+ ServiceWorkerManager::new(
+ own_sender,
+ from_constellation,
+ resource_port,
+ constellation_sender,
+ )
+ .handle_message();
+ })
+ .is_err()
+ {
+ warn!("ServiceWorkerManager thread spawning failed");
+ }
+ }
+}
+
pub fn serviceworker_enabled() -> bool {
pref!(dom.serviceworker.enabled)
}