/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::abstractworker::WorkerScriptMsg; use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::DomObject; use dom::bindings::trace::JSTraceable; use script_runtime::{ScriptChan, CommonScriptMsg, ScriptPort}; use std::sync::mpsc::{Receiver, Sender}; /// A ScriptChan that can be cloned freely and will silently send a TrustedWorkerAddress with /// common event loop messages. While this SendableWorkerScriptChan is alive, the associated /// Worker object will remain alive. #[derive(Clone, JSTraceable)] pub struct SendableWorkerScriptChan { pub sender: Sender<(Trusted, CommonScriptMsg)>, pub worker: Trusted, } impl ScriptChan for SendableWorkerScriptChan { fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { self.sender.send((self.worker.clone(), msg)).map_err(|_| ()) } fn clone(&self) -> Box { Box::new(SendableWorkerScriptChan { sender: self.sender.clone(), worker: self.worker.clone(), }) } } /// A ScriptChan that can be cloned freely and will silently send a TrustedWorkerAddress with /// worker event loop messages. While this SendableWorkerScriptChan is alive, the associated /// Worker object will remain alive. #[derive(Clone, JSTraceable)] pub struct WorkerThreadWorkerChan { pub sender: Sender<(Trusted, WorkerScriptMsg)>, pub worker: Trusted, } impl ScriptChan for WorkerThreadWorkerChan { fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { self.sender .send((self.worker.clone(), WorkerScriptMsg::Common(msg))) .map_err(|_| ()) } fn clone(&self) -> Box { Box::new(WorkerThreadWorkerChan { sender: self.sender.clone(), worker: self.worker.clone(), }) } } impl ScriptPort for Receiver<(Trusted, WorkerScriptMsg)> { fn recv(&self) -> Result { match self.recv().map(|(_, msg)| msg) { Ok(WorkerScriptMsg::Common(script_msg)) => Ok(script_msg), Ok(WorkerScriptMsg::DOMMessage(_)) => panic!("unexpected worker event message!"), Err(_) => Err(()), } } }