diff options
-rw-r--r-- | src/components/script/dom/bindings/global.rs | 20 | ||||
-rw-r--r-- | src/components/script/dom/dedicatedworkerglobalscope.rs | 64 | ||||
-rw-r--r-- | src/components/script/dom/worker.rs | 35 | ||||
-rw-r--r-- | src/components/script/dom/workerglobalscope.rs | 30 | ||||
-rw-r--r-- | src/components/script/dom/xmlhttprequest.rs | 2 |
5 files changed, 97 insertions, 54 deletions
diff --git a/src/components/script/dom/bindings/global.rs b/src/components/script/dom/bindings/global.rs index 6d3f9c5cc44..2c4d9537fd2 100644 --- a/src/components/script/dom/bindings/global.rs +++ b/src/components/script/dom/bindings/global.rs @@ -8,9 +8,10 @@ use dom::bindings::js::{JS, JSRef, Root}; use dom::bindings::utils::{Reflectable, Reflector}; use dom::workerglobalscope::WorkerGlobalScope; use dom::window::Window; -use page::Page; use script_task::ScriptChan; +use servo_net::resource_task::ResourceTask; + use js::jsapi::JSContext; use url::Url; @@ -46,16 +47,25 @@ impl<'a> GlobalRef<'a> { } } - pub fn page<'b>(&'b self) -> &'b Page { - self.as_window().page() + pub fn resource_task(&self) -> ResourceTask { + match *self { + Window(ref window) => window.page().resource_task.deref().clone(), + Worker(ref worker) => worker.resource_task().clone(), + } } pub fn get_url(&self) -> Url { - self.as_window().get_url() + match *self { + Window(ref window) => window.get_url(), + Worker(ref worker) => worker.get_url().clone(), + } } 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 13eb6c958da..578b13042a5 100644 --- a/src/components/script/dom/dedicatedworkerglobalscope.rs +++ b/src/components/script/dom/dedicatedworkerglobalscope.rs @@ -4,17 +4,23 @@ use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding; use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeDerived; -use dom::bindings::js::Temporary; +use dom::bindings::js::{Temporary, RootCollection}; use dom::bindings::utils::{Reflectable, Reflector}; 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}; use js::rust::Cx; use std::rc::Rc; +use native; +use rustrt::task::TaskOpts; +use url::Url; #[deriving(Encodable)] pub struct DedicatedWorkerGlobalScope { @@ -22,24 +28,58 @@ pub struct DedicatedWorkerGlobalScope { } impl DedicatedWorkerGlobalScope { - pub fn new_inherited(cx: Rc<Cx>) -> DedicatedWorkerGlobalScope { + pub fn new_inherited(worker_url: Url, + cx: Rc<Cx>, + resource_task: ResourceTask, + script_chan: ScriptChan) + -> DedicatedWorkerGlobalScope { DedicatedWorkerGlobalScope { - workerglobalscope: WorkerGlobalScope::new_inherited(DedicatedGlobalScope, cx), + workerglobalscope: WorkerGlobalScope::new_inherited( + DedicatedGlobalScope, worker_url, cx, resource_task, + script_chan), } } - pub fn new(cx: Rc<Cx>) -> Temporary<DedicatedWorkerGlobalScope> { - let scope = box DedicatedWorkerGlobalScope::new_inherited(cx.clone()); + pub fn new(worker_url: Url, + cx: Rc<Cx>, + resource_task: ResourceTask, + script_chan: ScriptChan) + -> Temporary<DedicatedWorkerGlobalScope> { + let scope = box DedicatedWorkerGlobalScope::new_inherited( + worker_url, cx.clone(), resource_task, script_chan); DedicatedWorkerGlobalScopeBinding::Wrap(cx.ptr, scope) } +} - pub fn init() -> Temporary<DedicatedWorkerGlobalScope> { - let (_js_runtime, js_context) = ScriptTask::new_rt_and_cx(); - DedicatedWorkerGlobalScope::new(js_context.clone()) - } +impl DedicatedWorkerGlobalScope { + 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() { + let roots = RootCollection::new(); + let _stack_roots_tls = StackRootTLS::new(&roots); + + let (filename, source) = match load_whole_resource(&resource_task, worker_url.clone()) { + Err(_) => { + println!("error loading script {}", worker_url); + return; + } + Ok((metadata, bytes)) => { + (metadata.final_url, String::from_utf8(bytes).unwrap()) + } + }; - pub fn get_rust_cx<'a>(&'a self) -> &'a Rc<Cx> { - self.workerglobalscope.get_rust_cx() + let (_js_runtime, js_context) = ScriptTask::new_rt_and_cx(); + let global = DedicatedWorkerGlobalScope::new( + 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(_) => (), + Err(_) => println!("evaluate_script failed") + } + }); } } diff --git a/src/components/script/dom/worker.rs b/src/components/script/dom/worker.rs index d28d4958ab8..f0850d72e93 100644 --- a/src/components/script/dom/worker.rs +++ b/src/components/script/dom/worker.rs @@ -5,19 +5,14 @@ use dom::bindings::codegen::Bindings::WorkerBinding; use dom::bindings::error::{Fallible, Syntax}; use dom::bindings::global::GlobalRef; -use dom::bindings::js::{Temporary, RootCollection}; +use dom::bindings::js::Temporary; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope; use dom::eventtarget::{EventTarget, WorkerTypeId}; -use script_task::StackRootTLS; -use servo_net::resource_task::load_whole_resource; use servo_util::str::DOMString; use servo_util::url::try_parse_url; -use native; -use rustrt::task::TaskOpts; - #[deriving(Encodable)] pub struct Worker { eventtarget: EventTarget, @@ -44,32 +39,8 @@ impl Worker { Err(_) => return Err(Syntax), }; - let resource_task = global.page().resource_task.deref().clone(); - - 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() { - let roots = RootCollection::new(); - let _stack_roots_tls = StackRootTLS::new(&roots); - - let (filename, source) = match load_whole_resource(&resource_task, worker_url.clone()) { - Err(_) => { - println!("error loading script {}", worker_url); - return; - } - Ok((metadata, bytes)) => { - (metadata.final_url, String::from_utf8(bytes).unwrap()) - } - }; - - let global = DedicatedWorkerGlobalScope::init().root(); - match global.get_rust_cx().evaluate_script( - global.reflector().get_jsobject(), source, filename.to_str(), 1) { - Ok(_) => (), - Err(_) => println!("evaluate_script failed") - } - }); - + let resource_task = global.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 e6f9235723d..4ce8a05247c 100644 --- a/src/components/script/dom/workerglobalscope.rs +++ b/src/components/script/dom/workerglobalscope.rs @@ -8,12 +8,16 @@ 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; use js::jsapi::JSContext; use js::rust::Cx; use std::cell::Cell; use std::rc::Rc; +use url::Url; #[deriving(PartialEq,Encodable)] pub enum WorkerGlobalScopeId { @@ -23,26 +27,44 @@ pub enum WorkerGlobalScopeId { #[deriving(Encodable)] pub struct WorkerGlobalScope { pub eventtarget: EventTarget, + worker_url: Untraceable<Url>, js_context: Untraceable<Rc<Cx>>, + resource_task: Untraceable<ResourceTask>, + script_chan: ScriptChan, console: Cell<Option<JS<Console>>>, } impl WorkerGlobalScope { pub fn new_inherited(type_id: WorkerGlobalScopeId, - cx: Rc<Cx>) -> WorkerGlobalScope { + worker_url: Url, + cx: Rc<Cx>, + 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), } } - pub fn get_rust_cx<'a>(&'a self) -> &'a Rc<Cx> { - &*self.js_context - } pub fn get_cx(&self) -> *mut JSContext { self.js_context.ptr } + + pub fn resource_task<'a>(&'a self) -> &'a ResourceTask { + &*self.resource_task + } + + 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 { diff --git a/src/components/script/dom/xmlhttprequest.rs b/src/components/script/dom/xmlhttprequest.rs index 6d93c5a95da..4487d4160d5 100644 --- a/src/components/script/dom/xmlhttprequest.rs +++ b/src/components/script/dom/xmlhttprequest.rs @@ -486,7 +486,7 @@ impl<'a> XMLHttpRequestMethods<'a> for JSRef<'a, XMLHttpRequest> { } let global = self.global.root(); - let resource_task = global.root_ref().page().resource_task.deref().clone(); + let resource_task = global.root_ref().resource_task(); let mut load_data = LoadData::new(self.request_url.deref().borrow().clone()); load_data.data = extracted; |