Store the ScriptChan in the WorkerGlobalScope.

This is necessary to make XMLHttpRequest and postMessage work.
This commit is contained in:
Ms2ger 2014-07-17 18:02:55 +02:00
parent 68cb00a32f
commit ed946a747d
4 changed files with 26 additions and 10 deletions

View file

@ -62,7 +62,10 @@ impl<'a> GlobalRef<'a> {
} }
pub fn script_chan<'b>(&'b self) -> &'b ScriptChan { pub fn script_chan<'b>(&'b self) -> &'b ScriptChan {
&self.as_window().script_chan match *self {
Window(ref window) => &window.script_chan,
Worker(ref worker) => worker.script_chan(),
}
} }
} }

View file

@ -10,7 +10,7 @@ use dom::eventtarget::EventTarget;
use dom::eventtarget::WorkerGlobalScopeTypeId; use dom::eventtarget::WorkerGlobalScopeTypeId;
use dom::workerglobalscope::DedicatedGlobalScope; use dom::workerglobalscope::DedicatedGlobalScope;
use dom::workerglobalscope::WorkerGlobalScope; use dom::workerglobalscope::WorkerGlobalScope;
use script_task::ScriptTask; use script_task::{ScriptTask, ScriptChan};
use script_task::StackRootTLS; use script_task::StackRootTLS;
use servo_net::resource_task::{ResourceTask, load_whole_resource}; use servo_net::resource_task::{ResourceTask, load_whole_resource};
@ -30,26 +30,30 @@ pub struct DedicatedWorkerGlobalScope {
impl DedicatedWorkerGlobalScope { impl DedicatedWorkerGlobalScope {
pub fn new_inherited(worker_url: Url, pub fn new_inherited(worker_url: Url,
cx: Rc<Cx>, cx: Rc<Cx>,
resource_task: ResourceTask) resource_task: ResourceTask,
script_chan: ScriptChan)
-> DedicatedWorkerGlobalScope { -> DedicatedWorkerGlobalScope {
DedicatedWorkerGlobalScope { DedicatedWorkerGlobalScope {
workerglobalscope: WorkerGlobalScope::new_inherited( workerglobalscope: WorkerGlobalScope::new_inherited(
DedicatedGlobalScope, worker_url, cx, resource_task), DedicatedGlobalScope, worker_url, cx, resource_task,
script_chan),
} }
} }
pub fn new(worker_url: Url, pub fn new(worker_url: Url,
cx: Rc<Cx>, cx: Rc<Cx>,
resource_task: ResourceTask) resource_task: ResourceTask,
script_chan: ScriptChan)
-> Temporary<DedicatedWorkerGlobalScope> { -> Temporary<DedicatedWorkerGlobalScope> {
let scope = box DedicatedWorkerGlobalScope::new_inherited( let scope = box DedicatedWorkerGlobalScope::new_inherited(
worker_url, cx.clone(), resource_task); worker_url, cx.clone(), resource_task, script_chan);
DedicatedWorkerGlobalScopeBinding::Wrap(cx.ptr, scope) DedicatedWorkerGlobalScopeBinding::Wrap(cx.ptr, scope)
} }
} }
impl DedicatedWorkerGlobalScope { impl DedicatedWorkerGlobalScope {
pub fn run_worker_scope(worker_url: Url, resource_task: ResourceTask) { pub fn run_worker_scope(worker_url: Url, resource_task: ResourceTask,
script_chan: ScriptChan) {
let mut task_opts = TaskOpts::new(); let mut task_opts = TaskOpts::new();
task_opts.name = Some(format!("Web Worker at {}", worker_url).into_maybe_owned()); task_opts.name = Some(format!("Web Worker at {}", worker_url).into_maybe_owned());
native::task::spawn_opts(task_opts, proc() { native::task::spawn_opts(task_opts, proc() {
@ -68,7 +72,8 @@ impl DedicatedWorkerGlobalScope {
let (_js_runtime, js_context) = ScriptTask::new_rt_and_cx(); let (_js_runtime, js_context) = ScriptTask::new_rt_and_cx();
let global = DedicatedWorkerGlobalScope::new( let global = DedicatedWorkerGlobalScope::new(
worker_url, js_context.clone(), resource_task).root(); worker_url, js_context.clone(), resource_task,
script_chan).root();
match js_context.evaluate_script( match js_context.evaluate_script(
global.reflector().get_jsobject(), source, filename.to_str(), 1) { global.reflector().get_jsobject(), source, filename.to_str(), 1) {
Ok(_) => (), Ok(_) => (),

View file

@ -40,7 +40,7 @@ impl Worker {
}; };
let resource_task = global.resource_task(); let resource_task = global.resource_task();
DedicatedWorkerGlobalScope::run_worker_scope(worker_url, resource_task); DedicatedWorkerGlobalScope::run_worker_scope(worker_url, resource_task, global.script_chan().clone());
Ok(Worker::new(global)) Ok(Worker::new(global))
} }
} }

View file

@ -8,6 +8,7 @@ use dom::bindings::js::{JS, JSRef, Temporary, OptionalSettable};
use dom::bindings::utils::{Reflectable, Reflector}; use dom::bindings::utils::{Reflectable, Reflector};
use dom::console::Console; use dom::console::Console;
use dom::eventtarget::{EventTarget, WorkerGlobalScopeTypeId}; use dom::eventtarget::{EventTarget, WorkerGlobalScopeTypeId};
use script_task::ScriptChan;
use servo_net::resource_task::ResourceTask; use servo_net::resource_task::ResourceTask;
@ -29,6 +30,7 @@ pub struct WorkerGlobalScope {
worker_url: Untraceable<Url>, worker_url: Untraceable<Url>,
js_context: Untraceable<Rc<Cx>>, js_context: Untraceable<Rc<Cx>>,
resource_task: Untraceable<ResourceTask>, resource_task: Untraceable<ResourceTask>,
script_chan: ScriptChan,
console: Cell<Option<JS<Console>>>, console: Cell<Option<JS<Console>>>,
} }
@ -36,12 +38,14 @@ impl WorkerGlobalScope {
pub fn new_inherited(type_id: WorkerGlobalScopeId, pub fn new_inherited(type_id: WorkerGlobalScopeId,
worker_url: Url, worker_url: Url,
cx: Rc<Cx>, cx: Rc<Cx>,
resource_task: ResourceTask) -> WorkerGlobalScope { resource_task: ResourceTask,
script_chan: ScriptChan) -> WorkerGlobalScope {
WorkerGlobalScope { WorkerGlobalScope {
eventtarget: EventTarget::new_inherited(WorkerGlobalScopeTypeId(type_id)), eventtarget: EventTarget::new_inherited(WorkerGlobalScopeTypeId(type_id)),
worker_url: Untraceable::new(worker_url), worker_url: Untraceable::new(worker_url),
js_context: Untraceable::new(cx), js_context: Untraceable::new(cx),
resource_task: Untraceable::new(resource_task), resource_task: Untraceable::new(resource_task),
script_chan: script_chan,
console: Cell::new(None), console: Cell::new(None),
} }
} }
@ -57,6 +61,10 @@ impl WorkerGlobalScope {
pub fn get_url<'a>(&'a self) -> &'a Url { pub fn get_url<'a>(&'a self) -> &'a Url {
&*self.worker_url &*self.worker_url
} }
pub fn script_chan<'a>(&'a self) -> &'a ScriptChan {
&self.script_chan
}
} }
pub trait WorkerGlobalScopeMethods { pub trait WorkerGlobalScopeMethods {