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
|
@ -2,14 +2,16 @@
|
|||
* 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::bindings::codegen::Bindings::WorkerGlobalScopeBinding::WorkerGlobalScopeMethods;
|
||||
use dom::bindings::codegen::Bindings::FunctionBinding::Function;
|
||||
use dom::bindings::codegen::Bindings::WorkerGlobalScopeBinding::WorkerGlobalScopeMethods;
|
||||
use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeCast;
|
||||
use dom::bindings::error::{ErrorResult, Fallible};
|
||||
use dom::bindings::error::Error::{Syntax, Network, FailureUnknown};
|
||||
use dom::bindings::global::GlobalRef;
|
||||
use dom::bindings::js::{MutNullableJS, JSRef, Temporary};
|
||||
use dom::bindings::utils::Reflectable;
|
||||
use dom::console::Console;
|
||||
use dom::dedicatedworkerglobalscope::{DedicatedWorkerGlobalScope, DedicatedWorkerGlobalScopeHelpers};
|
||||
use dom::eventtarget::{EventTarget, EventTargetTypeId};
|
||||
use dom::workerlocation::WorkerLocation;
|
||||
use dom::workernavigator::WorkerNavigator;
|
||||
|
@ -40,7 +42,6 @@ pub struct WorkerGlobalScope {
|
|||
worker_url: Url,
|
||||
js_context: Rc<Cx>,
|
||||
resource_task: ResourceTask,
|
||||
script_chan: ScriptChan,
|
||||
location: MutNullableJS<WorkerLocation>,
|
||||
navigator: MutNullableJS<WorkerNavigator>,
|
||||
console: MutNullableJS<Console>,
|
||||
|
@ -51,18 +52,16 @@ impl WorkerGlobalScope {
|
|||
pub fn new_inherited(type_id: WorkerGlobalScopeTypeId,
|
||||
worker_url: Url,
|
||||
cx: Rc<Cx>,
|
||||
resource_task: ResourceTask,
|
||||
script_chan: ScriptChan) -> WorkerGlobalScope {
|
||||
resource_task: ResourceTask) -> WorkerGlobalScope {
|
||||
WorkerGlobalScope {
|
||||
eventtarget: EventTarget::new_inherited(EventTargetTypeId::WorkerGlobalScope(type_id)),
|
||||
worker_url: worker_url,
|
||||
js_context: cx,
|
||||
resource_task: resource_task,
|
||||
script_chan: script_chan,
|
||||
location: Default::default(),
|
||||
navigator: Default::default(),
|
||||
console: Default::default(),
|
||||
timers: TimerManager::new()
|
||||
timers: TimerManager::new(),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -82,10 +81,6 @@ impl WorkerGlobalScope {
|
|||
pub fn get_url<'a>(&'a self) -> &'a Url {
|
||||
&self.worker_url
|
||||
}
|
||||
|
||||
pub fn script_chan<'a>(&'a self) -> &'a ScriptChan {
|
||||
&self.script_chan
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> WorkerGlobalScopeMethods for JSRef<'a, WorkerGlobalScope> {
|
||||
|
@ -153,7 +148,7 @@ impl<'a> WorkerGlobalScopeMethods for JSRef<'a, WorkerGlobalScope> {
|
|||
timeout,
|
||||
IsInterval::NonInterval,
|
||||
TimerSource::FromWorker,
|
||||
self.script_chan.clone())
|
||||
self.script_chan())
|
||||
}
|
||||
|
||||
fn ClearTimeout(self, handle: i32) {
|
||||
|
@ -166,7 +161,7 @@ impl<'a> WorkerGlobalScopeMethods for JSRef<'a, WorkerGlobalScope> {
|
|||
timeout,
|
||||
IsInterval::Interval,
|
||||
TimerSource::FromWorker,
|
||||
self.script_chan.clone())
|
||||
self.script_chan())
|
||||
}
|
||||
|
||||
fn ClearInterval(self, handle: i32) {
|
||||
|
@ -176,13 +171,26 @@ impl<'a> WorkerGlobalScopeMethods for JSRef<'a, WorkerGlobalScope> {
|
|||
|
||||
pub trait WorkerGlobalScopeHelpers {
|
||||
fn handle_fire_timer(self, timer_id: TimerId);
|
||||
fn script_chan(self) -> Box<ScriptChan+Send>;
|
||||
fn get_cx(self) -> *mut JSContext;
|
||||
}
|
||||
|
||||
impl<'a> WorkerGlobalScopeHelpers for JSRef<'a, WorkerGlobalScope> {
|
||||
fn script_chan(self) -> Box<ScriptChan+Send> {
|
||||
let dedicated: Option<JSRef<DedicatedWorkerGlobalScope>> =
|
||||
DedicatedWorkerGlobalScopeCast::to_ref(self);
|
||||
match dedicated {
|
||||
Some(dedicated) => dedicated.script_chan(),
|
||||
None => panic!("need to implement a sender for SharedWorker"),
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_fire_timer(self, timer_id: TimerId) {
|
||||
self.timers.fire_timer(timer_id, self);
|
||||
}
|
||||
|
||||
fn get_cx(self) -> *mut JSContext {
|
||||
self.js_context.ptr
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue