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 {
&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::workerglobalscope::DedicatedGlobalScope;
use dom::workerglobalscope::WorkerGlobalScope;
use script_task::ScriptTask;
use script_task::{ScriptTask, ScriptChan};
use script_task::StackRootTLS;
use servo_net::resource_task::{ResourceTask, load_whole_resource};
@ -30,26 +30,30 @@ pub struct DedicatedWorkerGlobalScope {
impl DedicatedWorkerGlobalScope {
pub fn new_inherited(worker_url: Url,
cx: Rc<Cx>,
resource_task: ResourceTask)
resource_task: ResourceTask,
script_chan: ScriptChan)
-> DedicatedWorkerGlobalScope {
DedicatedWorkerGlobalScope {
workerglobalscope: WorkerGlobalScope::new_inherited(
DedicatedGlobalScope, worker_url, cx, resource_task),
DedicatedGlobalScope, worker_url, cx, resource_task,
script_chan),
}
}
pub fn new(worker_url: Url,
cx: Rc<Cx>,
resource_task: ResourceTask)
resource_task: ResourceTask,
script_chan: ScriptChan)
-> Temporary<DedicatedWorkerGlobalScope> {
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)
}
}
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();
task_opts.name = Some(format!("Web Worker at {}", worker_url).into_maybe_owned());
native::task::spawn_opts(task_opts, proc() {
@ -68,7 +72,8 @@ impl DedicatedWorkerGlobalScope {
let (_js_runtime, js_context) = ScriptTask::new_rt_and_cx();
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(
global.reflector().get_jsobject(), source, filename.to_str(), 1) {
Ok(_) => (),

View file

@ -40,7 +40,7 @@ impl Worker {
};
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))
}
}

View file

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