diff options
author | Rahul Sharma <rsconceptx@gmail.com> | 2016-07-28 23:34:44 +0530 |
---|---|---|
committer | Rahul Sharma <rsconceptx@gmail.com> | 2016-09-07 12:07:36 +0530 |
commit | 0996b38ade7e2fe368ad7bd21ba8cf9a48d8f866 (patch) | |
tree | 8ac690564d216b672e1da26404e8c6d5585dcbc3 /components/script/serviceworker_manager.rs | |
parent | 72279cc7eb044a760ce461d76da2ff62adc511dc (diff) | |
download | servo-0996b38ade7e2fe368ad7bd21ba8cf9a48d8f866.tar.gz servo-0996b38ade7e2fe368ad7bd21ba8cf9a48d8f866.zip |
Make service workers talk to their serviceworkerglobalscopes
Diffstat (limited to 'components/script/serviceworker_manager.rs')
-rw-r--r-- | components/script/serviceworker_manager.rs | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/components/script/serviceworker_manager.rs b/components/script/serviceworker_manager.rs index 09f5288929a..898bd2b63f3 100644 --- a/components/script/serviceworker_manager.rs +++ b/components/script/serviceworker_manager.rs @@ -35,19 +35,23 @@ pub struct ServiceWorkerManager { // receiver to receive messages from constellation own_port: Receiver<ServiceWorkerMsg>, // to receive resource messages - resource_receiver: Receiver<CustomResponseMediator> + resource_receiver: Receiver<CustomResponseMediator>, + // to send message to constellation + constellation_sender: IpcSender<SWManagerMsg> } impl ServiceWorkerManager { fn new(own_sender: IpcSender<ServiceWorkerMsg>, from_constellation_receiver: Receiver<ServiceWorkerMsg>, - resource_port: Receiver<CustomResponseMediator>) -> ServiceWorkerManager { + resource_port: Receiver<CustomResponseMediator>, + constellation_sender: IpcSender<SWManagerMsg>) -> ServiceWorkerManager { ServiceWorkerManager { registered_workers: HashMap::new(), active_workers: HashMap::new(), own_sender: own_sender, own_port: from_constellation_receiver, - resource_receiver: resource_port + resource_receiver: resource_port, + constellation_sender: constellation_sender } } @@ -58,8 +62,12 @@ impl ServiceWorkerManager { let resource_port = ROUTER.route_ipc_receiver_to_new_mpsc_receiver(resource_port); let _ = sw_senders.resource_sender.send(CoreResourceMsg::NetworkMediator(resource_chan)); let _ = sw_senders.swmanager_sender.send(SWManagerMsg::OwnSender(own_sender.clone())); + let constellation_sender = sw_senders.swmanager_sender.clone(); spawn_named("ServiceWorkerManager".to_owned(), move || { - ServiceWorkerManager::new(own_sender, from_constellation, resource_port).handle_message(); + ServiceWorkerManager::new(own_sender, + from_constellation, + resource_port, + constellation_sender).handle_message(); }); } @@ -93,12 +101,20 @@ impl ServiceWorkerManager { devtools_sender.clone(), page_info)); }; + let (msg_chan, msg_port) = ipc::channel().unwrap(); + let msg_port = ROUTER.route_ipc_receiver_to_new_mpsc_receiver(msg_port); ServiceWorkerGlobalScope::run_serviceworker_scope(scope_things.clone(), - sender.clone(), - receiver, - devtools_receiver, - self.own_sender.clone(), - scope_url.clone()); + sender.clone(), + receiver, + devtools_receiver, + self.own_sender.clone(), + scope_url.clone(), + msg_port); + // Send the message to constellation which then talks to the script thread for storing this msg_chan + let connection_msg = SWManagerMsg::ConnectServiceWorker(scope_url.clone(), + scope_things.pipeline_id, + msg_chan); + let _ = self.constellation_sender.send(connection_msg); // We store the activated worker self.active_workers.insert(scope_url, scope_things.clone()); return Some(sender); |