Force all messages to worker tasks to send a TrustedWorkerAddress along with the ScriptMsg. This ensures that the main-thread Worker object is rooted for as long as there are events in flight or being processed.

This commit is contained in:
Josh Matthews 2014-12-02 16:54:43 -08:00
parent 2f059c15e7
commit 9a7cd31134
11 changed files with 234 additions and 121 deletions

View file

@ -39,11 +39,11 @@ pub struct Worker {
global: GlobalField,
/// Sender to the Receiver associated with the DedicatedWorkerGlobalScope
/// this Worker created.
sender: ScriptChan,
sender: Sender<(TrustedWorkerAddress, ScriptMsg)>,
}
impl Worker {
fn new_inherited(global: &GlobalRef, sender: ScriptChan) -> Worker {
fn new_inherited(global: &GlobalRef, sender: Sender<(TrustedWorkerAddress, ScriptMsg)>) -> Worker {
Worker {
eventtarget: EventTarget::new_inherited(EventTargetTypeId::Worker),
refcount: Cell::new(0),
@ -52,7 +52,7 @@ impl Worker {
}
}
pub fn new(global: &GlobalRef, sender: ScriptChan) -> Temporary<Worker> {
pub fn new(global: &GlobalRef, sender: Sender<(TrustedWorkerAddress, ScriptMsg)>) -> Temporary<Worker> {
reflect_dom_object(box Worker::new_inherited(global, sender),
*global,
WorkerBinding::Wrap)
@ -68,13 +68,13 @@ impl Worker {
};
let resource_task = global.resource_task();
let (receiver, sender) = ScriptChan::new();
let (sender, receiver) = channel();
let worker = Worker::new(global, sender.clone()).root();
let worker_ref = Trusted::new(global.get_cx(), *worker, global.script_chan().clone());
let worker_ref = Trusted::new(global.get_cx(), *worker, global.script_chan());
DedicatedWorkerGlobalScope::run_worker_scope(
worker_url, worker_ref, resource_task, global.script_chan().clone(),
worker_url, worker_ref, resource_task, global.script_chan(),
sender, receiver);
Ok(Temporary::from_rooted(*worker))
@ -112,9 +112,8 @@ impl<'a> WorkerMethods for JSRef<'a, Worker> {
return Err(DataClone);
}
let addr = Trusted::new(cx, self, self.global.root().root_ref().script_chan().clone());
let ScriptChan(ref sender) = self.sender;
sender.send(ScriptMsg::DOMMessage(addr, data, nbytes));
let address = Trusted::new(cx, self, self.global.root().root_ref().script_chan().clone());
self.sender.send((address, ScriptMsg::DOMMessage(data, nbytes)));
Ok(())
}