aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/workerglobalscope.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/workerglobalscope.rs')
-rw-r--r--components/script/dom/workerglobalscope.rs90
1 files changed, 71 insertions, 19 deletions
diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs
index 95c476649b8..06b3894ded3 100644
--- a/components/script/dom/workerglobalscope.rs
+++ b/components/script/dom/workerglobalscope.rs
@@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use devtools_traits::{DevtoolScriptControlMsg, ScriptToDevtoolsControlMsg, WorkerId};
+use devtools_traits::{DevtoolScriptControlMsg, ScriptToDevtoolsControlMsg, WorkerId, DevtoolsPageInfo};
use dom::bindings::codegen::Bindings::FunctionBinding::Function;
use dom::bindings::codegen::Bindings::WorkerGlobalScopeBinding::WorkerGlobalScopeMethods;
use dom::bindings::error::{Error, ErrorResult, Fallible, report_pending_exception};
@@ -15,6 +15,7 @@ use dom::console::Console;
use dom::crypto::Crypto;
use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope;
use dom::eventtarget::EventTarget;
+use dom::serviceworkerglobalscope::ServiceWorkerGlobalScope;
use dom::window::{base64_atob, base64_btoa};
use dom::workerlocation::WorkerLocation;
use dom::workernavigator::WorkerNavigator;
@@ -57,6 +58,44 @@ pub struct WorkerGlobalScopeInit {
pub closing: Arc<AtomicBool>,
}
+pub fn prepare_workerscope_init(global: GlobalRef,
+ worker_type: String,
+ worker_url: Url,
+ devtools_sender: IpcSender<DevtoolScriptControlMsg>,
+ closing: Arc<AtomicBool>) -> WorkerGlobalScopeInit {
+ let worker_id = global.get_next_worker_id();
+ let optional_sender = match global.devtools_chan() {
+ Some(ref chan) => {
+ let pipeline_id = global.pipeline();
+ let title = format!("{} for {}", worker_type, worker_url);
+ let page_info = DevtoolsPageInfo {
+ title: title,
+ url: worker_url,
+ };
+ chan.send(ScriptToDevtoolsControlMsg::NewGlobal((pipeline_id, Some(worker_id)),
+ devtools_sender.clone(),
+ page_info)).unwrap();
+ Some(devtools_sender)
+ },
+ None => None,
+ };
+
+ let init = WorkerGlobalScopeInit {
+ resource_threads: global.resource_threads(),
+ mem_profiler_chan: global.mem_profiler_chan().clone(),
+ to_devtools_sender: global.devtools_chan(),
+ time_profiler_chan: global.time_profiler_chan().clone(),
+ from_devtools_sender: optional_sender,
+ constellation_chan: global.constellation_chan().clone(),
+ panic_chan: global.panic_chan().clone(),
+ scheduler_chan: global.scheduler_chan().clone(),
+ worker_id: worker_id,
+ closing: closing,
+ };
+
+ init
+}
+
// https://html.spec.whatwg.org/multipage/#the-workerglobalscope-common-interface
#[dom_struct]
pub struct WorkerGlobalScope {
@@ -392,36 +431,49 @@ impl WorkerGlobalScope {
pub fn script_chan(&self) -> Box<ScriptChan + Send> {
let dedicated =
self.downcast::<DedicatedWorkerGlobalScope>();
- match dedicated {
- Some(dedicated) => dedicated.script_chan(),
- None => panic!("need to implement a sender for SharedWorker"),
+ let service_worker = self.downcast::<ServiceWorkerGlobalScope>();
+ if let Some(dedicated) = dedicated {
+ return dedicated.script_chan();
+ } else if let Some(service_worker) = service_worker {
+ return service_worker.script_chan();
+ } else {
+ panic!("need to implement a sender for SharedWorker")
}
}
pub fn pipeline(&self) -> PipelineId {
- let dedicated =
- self.downcast::<DedicatedWorkerGlobalScope>();
- match dedicated {
- Some(dedicated) => dedicated.pipeline(),
- None => panic!("need to add a pipeline for SharedWorker"),
+ let dedicated = self.downcast::<DedicatedWorkerGlobalScope>();
+ let service_worker = self.downcast::<ServiceWorkerGlobalScope>();
+ if let Some(dedicated) = dedicated {
+ return dedicated.pipeline();
+ } else if let Some(service_worker) = service_worker {
+ return service_worker.pipeline();
+ } else {
+ panic!("need to implement a sender for SharedWorker")
}
}
pub fn new_script_pair(&self) -> (Box<ScriptChan + Send>, Box<ScriptPort + Send>) {
- let dedicated =
- self.downcast::<DedicatedWorkerGlobalScope>();
- match dedicated {
- Some(dedicated) => dedicated.new_script_pair(),
- None => panic!("need to implement creating isolated event loops for SharedWorker"),
+ let dedicated = self.downcast::<DedicatedWorkerGlobalScope>();
+ let service_worker = self.downcast::<ServiceWorkerGlobalScope>();
+ if let Some(dedicated) = dedicated {
+ return dedicated.new_script_pair();
+ } else if let Some(service_worker) = service_worker {
+ return service_worker.new_script_pair();
+ } else {
+ panic!("need to implement a sender for SharedWorker")
}
}
pub fn process_event(&self, msg: CommonScriptMsg) {
- let dedicated =
- self.downcast::<DedicatedWorkerGlobalScope>();
- match dedicated {
- Some(dedicated) => dedicated.process_event(msg),
- None => panic!("need to implement processing single events for SharedWorker"),
+ let dedicated = self.downcast::<DedicatedWorkerGlobalScope>();
+ let service_worker = self.downcast::<ServiceWorkerGlobalScope>();
+ if let Some(dedicated) = dedicated {
+ return dedicated.process_event(msg);
+ } else if let Some(service_worker) = service_worker {
+ return service_worker.process_event(msg);
+ } else {
+ panic!("need to implement a sender for SharedWorker")
}
}