Move the code to start the worker into DedicatedWorkerGlobalScope::run_worker_scope.

This is somewhat cleaner than keeping it all in the Worker constructor.
This commit is contained in:
Ms2ger 2014-07-17 15:34:04 +02:00
parent 90adcc6265
commit 603c0b889a
2 changed files with 37 additions and 32 deletions

View file

@ -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::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 {
@ -43,6 +49,34 @@ impl DedicatedWorkerGlobalScope {
}
}
impl DedicatedWorkerGlobalScope {
pub fn run_worker_scope(worker_url: Url, resource_task: ResourceTask) {
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")
}
});
}
}
pub trait DedicatedWorkerGlobalScopeMethods {
}

View file

@ -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,
@ -45,31 +40,7 @@ impl Worker {
};
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")
}
});
DedicatedWorkerGlobalScope::run_worker_scope(worker_url, resource_task);
Ok(Worker::new(global))
}
}