diff options
author | Ms2ger <ms2ger@gmail.com> | 2014-07-17 18:02:55 +0200 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2014-07-17 18:02:55 +0200 |
commit | ed946a747d86e4da78310f6d59acffe4bf3def48 (patch) | |
tree | 95579ceab0f2070a5019d14215cc8fbc8aaa5035 | |
parent | 68cb00a32fba7e01222de8cef0df6c8ab94bb012 (diff) | |
download | servo-ed946a747d86e4da78310f6d59acffe4bf3def48.tar.gz servo-ed946a747d86e4da78310f6d59acffe4bf3def48.zip |
Store the ScriptChan in the WorkerGlobalScope.
This is necessary to make XMLHttpRequest and postMessage work.
-rw-r--r-- | src/components/script/dom/bindings/global.rs | 5 | ||||
-rw-r--r-- | src/components/script/dom/dedicatedworkerglobalscope.rs | 19 | ||||
-rw-r--r-- | src/components/script/dom/worker.rs | 2 | ||||
-rw-r--r-- | src/components/script/dom/workerglobalscope.rs | 10 |
4 files changed, 26 insertions, 10 deletions
diff --git a/src/components/script/dom/bindings/global.rs b/src/components/script/dom/bindings/global.rs index b2d0b765cc8..2c4d9537fd2 100644 --- a/src/components/script/dom/bindings/global.rs +++ b/src/components/script/dom/bindings/global.rs @@ -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(), + } } } diff --git a/src/components/script/dom/dedicatedworkerglobalscope.rs b/src/components/script/dom/dedicatedworkerglobalscope.rs index 268c4df54f4..578b13042a5 100644 --- a/src/components/script/dom/dedicatedworkerglobalscope.rs +++ b/src/components/script/dom/dedicatedworkerglobalscope.rs @@ -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(_) => (), diff --git a/src/components/script/dom/worker.rs b/src/components/script/dom/worker.rs index f357eca8ce3..f0850d72e93 100644 --- a/src/components/script/dom/worker.rs +++ b/src/components/script/dom/worker.rs @@ -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)) } } diff --git a/src/components/script/dom/workerglobalscope.rs b/src/components/script/dom/workerglobalscope.rs index c8114fd6ba8..4ce8a05247c 100644 --- a/src/components/script/dom/workerglobalscope.rs +++ b/src/components/script/dom/workerglobalscope.rs @@ -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 { |