From bd04cecceb72b66f376c9473a61ec76f57510dfc Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 3 Aug 2015 18:28:48 +0200 Subject: [PATCH 1/3] Take WorkerGlobalScope's worker_id out of its Option. Unsurprisingly, every worker has an id, so there is no need to wrap it in an Option. --- components/script/dom/bindings/global.rs | 2 +- components/script/dom/dedicatedworkerglobalscope.rs | 6 +++--- components/script/dom/worker.rs | 2 +- components/script/dom/workerglobalscope.rs | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs index 4a2879e9f41..053059cec9f 100644 --- a/components/script/dom/bindings/global.rs +++ b/components/script/dom/bindings/global.rs @@ -125,7 +125,7 @@ impl<'a> GlobalRef<'a> { pub fn get_worker_id(&self) -> Option { match *self { GlobalRef::Window(_) => None, - GlobalRef::Worker(ref worker) => worker.get_worker_id(), + GlobalRef::Worker(ref worker) => Some(worker.get_worker_id()), } } diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 90fb0283507..2d1fba86cf8 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -119,7 +119,7 @@ impl DedicatedWorkerGlobalScope { parent_sender: Box, own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>, - worker_id: Option) + worker_id: WorkerId) -> DedicatedWorkerGlobalScope { DedicatedWorkerGlobalScope { workerglobalscope: WorkerGlobalScope::new_inherited( @@ -146,7 +146,7 @@ impl DedicatedWorkerGlobalScope { parent_sender: Box, own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>, - worker_id: Option) + worker_id: WorkerId) -> Root { let scope = box DedicatedWorkerGlobalScope::new_inherited( worker_url, id, mem_profiler_chan, devtools_chan, devtools_sender, devtools_port, @@ -170,7 +170,7 @@ impl DedicatedWorkerGlobalScope { parent_sender: Box, own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>, - worker_id: Option) { + worker_id: WorkerId) { let serialized_worker_url = worker_url.serialize(); spawn_named(format!("WebWorker for {}", serialized_worker_url), move || { task_state::initialize(SCRIPT | IN_WORKER); diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index daa752052b7..e71ebcb795a 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -98,7 +98,7 @@ impl Worker { DedicatedWorkerGlobalScope::run_worker_scope( worker_url, global.pipeline(), global.mem_profiler_chan(), global.devtools_chan(), optional_sender, devtools_receiver, worker_ref, resource_task, - constellation_chan, global.script_chan(), sender, receiver, Some(worker_id)); + constellation_chan, global.script_chan(), sender, receiver, worker_id); Ok(worker) } diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 0887b6addcf..dd3b9d21c00 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -46,7 +46,7 @@ pub enum WorkerGlobalScopeTypeId { #[dom_struct] pub struct WorkerGlobalScope { eventtarget: EventTarget, - worker_id: Option, + worker_id: WorkerId, worker_url: Url, runtime: Rc, next_worker_id: Cell, @@ -84,7 +84,7 @@ impl WorkerGlobalScope { devtools_sender: Option>, devtools_receiver: Receiver, constellation_chan: ConstellationChan, - worker_id: Option) + worker_id: WorkerId) -> WorkerGlobalScope { WorkerGlobalScope { eventtarget: EventTarget::new_inherited(EventTargetTypeId::WorkerGlobalScope(type_id)), @@ -144,7 +144,7 @@ impl WorkerGlobalScope { &self.worker_url } - pub fn get_worker_id(&self) -> Option { + pub fn get_worker_id(&self) -> WorkerId { self.worker_id.clone() } From 0da0fcbe9ba1a09ac967e68c6b4a1a676999d190 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 3 Aug 2015 19:27:52 +0200 Subject: [PATCH 2/3] Implement a WorkerGlobalScopeInit struct to pass arguments to WorkerGlobalScope::new_inherited more easily. --- .../script/dom/dedicatedworkerglobalscope.rs | 47 +++++++++---------- components/script/dom/workerglobalscope.rs | 30 +++++++----- 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 2d1fba86cf8..fc1b2301559 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -21,7 +21,7 @@ use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId}; use dom::messageevent::MessageEvent; use dom::worker::{TrustedWorkerAddress, WorkerMessageHandler, WorkerEventHandler, WorkerErrorHandler}; use dom::workerglobalscope::{WorkerGlobalScope, WorkerGlobalScopeHelpers}; -use dom::workerglobalscope::WorkerGlobalScopeTypeId; +use dom::workerglobalscope::{WorkerGlobalScopeTypeId, WorkerGlobalScopeInit}; use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource, ScriptPort}; use script_task::StackRootTLS; @@ -107,25 +107,19 @@ pub struct DedicatedWorkerGlobalScope { } impl DedicatedWorkerGlobalScope { - fn new_inherited(worker_url: Url, + fn new_inherited(init: WorkerGlobalScopeInit, + worker_url: Url, id: PipelineId, - mem_profiler_chan: mem::ProfilerChan, - devtools_chan: Option>, - devtools_sender: Option>, devtools_port: Receiver, runtime: Rc, - resource_task: ResourceTask, - constellation_chan: ConstellationChan, parent_sender: Box, own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, - receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>, - worker_id: WorkerId) + receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>) -> DedicatedWorkerGlobalScope { DedicatedWorkerGlobalScope { workerglobalscope: WorkerGlobalScope::new_inherited( - WorkerGlobalScopeTypeId::DedicatedGlobalScope, worker_url, runtime, resource_task, - mem_profiler_chan, devtools_chan, devtools_sender, devtools_port, constellation_chan, - worker_id), + WorkerGlobalScopeTypeId::DedicatedGlobalScope, init, worker_url, + runtime, devtools_port), id: id, receiver: receiver, own_sender: own_sender, @@ -134,24 +128,18 @@ impl DedicatedWorkerGlobalScope { } } - pub fn new(worker_url: Url, + pub fn new(init: WorkerGlobalScopeInit, + worker_url: Url, id: PipelineId, - mem_profiler_chan: mem::ProfilerChan, - devtools_chan: Option>, - devtools_sender: Option>, devtools_port: Receiver, runtime: Rc, - resource_task: ResourceTask, - constellation_chan: ConstellationChan, parent_sender: Box, own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, - receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>, - worker_id: WorkerId) + receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>) -> Root { let scope = box DedicatedWorkerGlobalScope::new_inherited( - worker_url, id, mem_profiler_chan, devtools_chan, devtools_sender, devtools_port, - runtime.clone(), resource_task, constellation_chan, parent_sender, own_sender, receiver, - worker_id); + init, worker_url, id, devtools_port, runtime.clone(), parent_sender, + own_sender, receiver); DedicatedWorkerGlobalScopeBinding::Wrap(runtime.cx(), scope) } } @@ -197,10 +185,17 @@ impl DedicatedWorkerGlobalScope { let (devtools_mpsc_chan, devtools_mpsc_port) = channel(); ROUTER.route_ipc_receiver_to_mpsc_sender(devtools_ipc_port, devtools_mpsc_chan); + let init = WorkerGlobalScopeInit { + resource_task: resource_task, + mem_profiler_chan: mem_profiler_chan.clone(), + devtools_chan: devtools_chan, + devtools_sender: devtools_ipc_chan, + constellation_chan: constellation_chan, + worker_id: worker_id, + }; let global = DedicatedWorkerGlobalScope::new( - url, id, mem_profiler_chan.clone(), devtools_chan, devtools_ipc_chan, devtools_mpsc_port, - runtime.clone(), resource_task, constellation_chan, parent_sender, own_sender, receiver, - worker_id); + init, url, id, devtools_mpsc_port, runtime.clone(), + parent_sender, own_sender, receiver); // FIXME(njn): workers currently don't have a unique ID suitable for using in reporter // registration (#6631), so we instead use a random number and cross our fingers. let scope = WorkerGlobalScopeCast::from_ref(global.r()); diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index dd3b9d21c00..91d140dc823 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -42,6 +42,15 @@ pub enum WorkerGlobalScopeTypeId { DedicatedGlobalScope, } +pub struct WorkerGlobalScopeInit { + pub resource_task: ResourceTask, + pub mem_profiler_chan: mem::ProfilerChan, + pub devtools_chan: Option>, + pub devtools_sender: Option>, + pub constellation_chan: ConstellationChan, + pub worker_id: WorkerId, +} + // https://html.spec.whatwg.org/multipage/#the-workerglobalscope-common-interface #[dom_struct] pub struct WorkerGlobalScope { @@ -76,34 +85,29 @@ pub struct WorkerGlobalScope { impl WorkerGlobalScope { pub fn new_inherited(type_id: WorkerGlobalScopeTypeId, + init: WorkerGlobalScopeInit, worker_url: Url, runtime: Rc, - resource_task: ResourceTask, - mem_profiler_chan: mem::ProfilerChan, - devtools_chan: Option>, - devtools_sender: Option>, - devtools_receiver: Receiver, - constellation_chan: ConstellationChan, - worker_id: WorkerId) + devtools_receiver: Receiver) -> WorkerGlobalScope { WorkerGlobalScope { eventtarget: EventTarget::new_inherited(EventTargetTypeId::WorkerGlobalScope(type_id)), next_worker_id: Cell::new(WorkerId(0)), - worker_id: worker_id, + worker_id: init.worker_id, worker_url: worker_url, runtime: runtime, - resource_task: resource_task, + resource_task: init.resource_task, location: Default::default(), navigator: Default::default(), console: Default::default(), crypto: Default::default(), timers: TimerManager::new(), - mem_profiler_chan: mem_profiler_chan, - devtools_chan: devtools_chan, - devtools_sender: devtools_sender, + mem_profiler_chan: init.mem_profiler_chan, + devtools_chan: init.devtools_chan, + devtools_sender: init.devtools_sender, devtools_receiver: devtools_receiver, devtools_wants_updates: Cell::new(false), - constellation_chan: constellation_chan, + constellation_chan: init.constellation_chan, } } From 6b61564f6d210424a46ce0f53b00bbc2f693aaf6 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 3 Aug 2015 19:46:15 +0200 Subject: [PATCH 3/3] Pass WorkerGlobalScopeInit to DedicatedWorkerGlobalScope::run_worker_scope. --- .../script/dom/dedicatedworkerglobalscope.rs | 35 ++++++------------- components/script/dom/worker.rs | 14 ++++++-- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index fc1b2301559..cef9c5f9789 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -25,17 +25,15 @@ use dom::workerglobalscope::{WorkerGlobalScopeTypeId, WorkerGlobalScopeInit}; use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource, ScriptPort}; use script_task::StackRootTLS; -use msg::constellation_msg::{ConstellationChan, PipelineId, WorkerId}; - -use devtools_traits::{ScriptToDevtoolsControlMsg, DevtoolScriptControlMsg}; - -use net_traits::{load_whole_resource, ResourceTask}; +use devtools_traits::DevtoolScriptControlMsg; +use msg::constellation_msg::PipelineId; +use net_traits::load_whole_resource; use profile_traits::mem::{self, Reporter, ReporterRequest}; use util::task::spawn_named; use util::task_state; use util::task_state::{SCRIPT, IN_WORKER}; -use ipc_channel::ipc::{self, IpcSender, IpcReceiver}; +use ipc_channel::ipc::{self, IpcReceiver}; use ipc_channel::router::ROUTER; use js::jsapi::{JSContext, RootedValue, HandleValue}; use js::jsapi::{JSAutoRequest, JSAutoCompartment}; @@ -146,19 +144,14 @@ impl DedicatedWorkerGlobalScope { impl DedicatedWorkerGlobalScope { #[allow(unsafe_code)] - pub fn run_worker_scope(worker_url: Url, + pub fn run_worker_scope(init: WorkerGlobalScopeInit, + worker_url: Url, id: PipelineId, - mem_profiler_chan: mem::ProfilerChan, - devtools_chan: Option>, - devtools_ipc_chan: Option>, devtools_ipc_port: IpcReceiver, worker: TrustedWorkerAddress, - resource_task: ResourceTask, - constellation_chan: ConstellationChan, parent_sender: Box, own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, - receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>, - worker_id: WorkerId) { + receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>) { let serialized_worker_url = worker_url.serialize(); spawn_named(format!("WebWorker for {}", serialized_worker_url), move || { task_state::initialize(SCRIPT | IN_WORKER); @@ -166,7 +159,7 @@ impl DedicatedWorkerGlobalScope { let roots = RootCollection::new(); let _stack_roots_tls = StackRootTLS::new(&roots); - let (url, source) = match load_whole_resource(&resource_task, worker_url) { + let (url, source) = match load_whole_resource(&init.resource_task, worker_url) { Err(_) => { println!("error loading script {}", serialized_worker_url); parent_sender.send(ScriptMsg::RunnableMsg( @@ -185,14 +178,6 @@ impl DedicatedWorkerGlobalScope { let (devtools_mpsc_chan, devtools_mpsc_port) = channel(); ROUTER.route_ipc_receiver_to_mpsc_sender(devtools_ipc_port, devtools_mpsc_chan); - let init = WorkerGlobalScopeInit { - resource_task: resource_task, - mem_profiler_chan: mem_profiler_chan.clone(), - devtools_chan: devtools_chan, - devtools_sender: devtools_ipc_chan, - constellation_chan: constellation_chan, - worker_id: worker_id, - }; let global = DedicatedWorkerGlobalScope::new( init, url, id, devtools_mpsc_port, runtime.clone(), parent_sender, own_sender, receiver); @@ -225,7 +210,7 @@ impl DedicatedWorkerGlobalScope { parent_sender_for_reporter.send(ScriptMsg::CollectReports( reporter_request.reports_channel)).unwrap() }); - mem_profiler_chan.send(mem::ProfilerMsg::RegisterReporter( + scope.mem_profiler_chan().send(mem::ProfilerMsg::RegisterReporter( reporter_name.clone(), Reporter(reporter_sender))); } @@ -287,7 +272,7 @@ impl DedicatedWorkerGlobalScope { // Unregister this task as a memory reporter. let msg = mem::ProfilerMsg::UnregisterReporter(reporter_name); - mem_profiler_chan.send(msg); + scope.mem_profiler_chan().send(msg); }); } } diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index e71ebcb795a..628b1178c32 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -20,6 +20,7 @@ use dom::errorevent::ErrorEvent; use dom::event::{Event, EventBubbles, EventCancelable, EventHelpers}; use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId}; use dom::messageevent::MessageEvent; +use dom::workerglobalscope::WorkerGlobalScopeInit; use script_task::{ScriptChan, ScriptMsg, Runnable}; use devtools_traits::{DevtoolsPageInfo, ScriptToDevtoolsControlMsg}; @@ -95,10 +96,17 @@ impl Worker { None => None, }; + let init = WorkerGlobalScopeInit { + resource_task: resource_task, + mem_profiler_chan: global.mem_profiler_chan(), + devtools_chan: global.devtools_chan(), + devtools_sender: optional_sender, + constellation_chan: constellation_chan, + worker_id: worker_id, + }; DedicatedWorkerGlobalScope::run_worker_scope( - worker_url, global.pipeline(), global.mem_profiler_chan(), global.devtools_chan(), - optional_sender, devtools_receiver, worker_ref, resource_task, - constellation_chan, global.script_chan(), sender, receiver, worker_id); + init, worker_url, global.pipeline(), devtools_receiver, worker_ref, + global.script_chan(), sender, receiver); Ok(worker) }