mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
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:
parent
2f059c15e7
commit
9a7cd31134
11 changed files with 234 additions and 121 deletions
|
@ -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(())
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue