mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Store the ScriptChan in the WorkerGlobalScope.
This is necessary to make XMLHttpRequest and postMessage work.
This commit is contained in:
parent
68cb00a32f
commit
ed946a747d
4 changed files with 26 additions and 10 deletions
|
@ -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(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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(_) => (),
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue