aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-07-17 18:02:55 +0200
committerMs2ger <ms2ger@gmail.com>2014-07-17 18:02:55 +0200
commited946a747d86e4da78310f6d59acffe4bf3def48 (patch)
tree95579ceab0f2070a5019d14215cc8fbc8aaa5035
parent68cb00a32fba7e01222de8cef0df6c8ab94bb012 (diff)
downloadservo-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.rs5
-rw-r--r--src/components/script/dom/dedicatedworkerglobalscope.rs19
-rw-r--r--src/components/script/dom/worker.rs2
-rw-r--r--src/components/script/dom/workerglobalscope.rs10
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 {