aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/serviceworker_manager.rs47
1 files changed, 25 insertions, 22 deletions
diff --git a/components/script/serviceworker_manager.rs b/components/script/serviceworker_manager.rs
index 3d1476a4509..85f76faadd1 100644
--- a/components/script/serviceworker_manager.rs
+++ b/components/script/serviceworker_manager.rs
@@ -15,10 +15,15 @@ use ipc_channel::router::ROUTER;
use net_traits::{CustomResponseMediator, CoreResourceMsg};
use script_traits::{ServiceWorkerMsg, ScopeThings, SWManagerMsg, SWManagerSenders};
use std::collections::HashMap;
-use std::sync::mpsc::{channel, Receiver};
+use std::sync::mpsc::{channel, Receiver, RecvError};
use url::Url;
use util::thread::spawn_named;
+enum Message {
+ FromResource(CustomResponseMediator),
+ FromConstellation(ServiceWorkerMsg)
+}
+
pub struct ServiceWorkerManager {
// map of registered service worker descriptors
registered_workers: HashMap<Url, ScopeThings>,
@@ -102,9 +107,19 @@ impl ServiceWorkerManager {
}
fn handle_message(&mut self) {
- while self.receive_message() {
- // process message
- }
+ while let Ok(message) = self.receive_message() {
+ let should_continue = match message {
+ Message::FromConstellation(msg) => {
+ self.handle_message_from_constellation(msg)
+ },
+ Message::FromResource(msg) => {
+ self.handle_message_from_resource(msg)
+ }
+ };
+ if !should_continue {
+ break;
+ }
+ }
}
fn handle_message_from_constellation(&mut self, msg: ServiceWorkerMsg) -> bool {
@@ -140,24 +155,12 @@ impl ServiceWorkerManager {
}
#[allow(unsafe_code)]
- fn receive_message(&mut self) -> bool {
- enum Message {
- FromResource(CustomResponseMediator),
- FromConstellation(ServiceWorkerMsg)
- }
- let message = {
- let msg_from_constellation = &self.own_port;
- let msg_from_resource = &self.resource_receiver;
- select! {
- msg = msg_from_constellation.recv() =>
- Message::FromConstellation(msg.expect("Unexpected constellation channel panic in sw-manager")),
- msg = msg_from_resource.recv() =>
- Message::FromResource(msg.expect("Unexpected resource channel panic in sw-manager"))
- }
- };
- match message {
- Message::FromConstellation(msg) => self.handle_message_from_constellation(msg),
- Message::FromResource(mediator) => self.handle_message_from_resource(mediator)
+ fn receive_message(&mut self) -> Result<Message, RecvError> {
+ let msg_from_constellation = &self.own_port;
+ let msg_from_resource = &self.resource_receiver;
+ select! {
+ msg = msg_from_constellation.recv() => msg.map(Message::FromConstellation),
+ msg = msg_from_resource.recv() => msg.map(Message::FromResource)
}
}
}