diff --git a/components/compositing/pipeline.rs b/components/compositing/pipeline.rs index b1f76bd0ec0..b30e8743bec 100644 --- a/components/compositing/pipeline.rs +++ b/components/compositing/pipeline.rs @@ -123,7 +123,9 @@ impl Pipeline { /// Returns the channels wrapped in a struct. pub fn create(state: InitialPipelineState) -> (Pipeline, UnprivilegedPipelineContent, PrivilegedPipelineContent) - where LTF: LayoutThreadFactory, STF: ScriptThreadFactory { + where LTF: LayoutThreadFactory, + STF: ScriptThreadFactory + { // Note: we allow channel creation to panic, since recovering from this // probably requires a general low-memory strategy. let (layout_to_paint_chan, layout_to_paint_port) = util::ipc::optional_ipc_channel(); @@ -416,10 +418,12 @@ pub struct UnprivilegedPipelineContent { impl UnprivilegedPipelineContent { pub fn start_all(mut self, wait_for_completion: bool) - where LTF: LayoutThreadFactory, STF: ScriptThreadFactory { - let layout_pair = ScriptThreadFactory::create_layout_channel(None::<&mut STF>); + where LTF: LayoutThreadFactory, + STF: ScriptThreadFactory + { + let layout_pair = STF::create_layout_channel(); - ScriptThreadFactory::create(None::<&mut STF>, InitialScriptState { + STF::create(InitialScriptState { id: self.id, parent_info: self.parent_info, compositor: self.script_to_compositor_chan, @@ -440,23 +444,22 @@ impl UnprivilegedPipelineContent { content_process_shutdown_chan: self.script_content_process_shutdown_chan.clone(), }, &layout_pair, self.load_data.clone()); - LayoutThreadFactory::create(None::<&mut LTF>, - self.id, - self.load_data.url.clone(), - self.parent_info.is_some(), - layout_pair, - self.pipeline_port.expect("No pipeline port."), - self.layout_to_constellation_chan, - self.panic_chan, - self.script_chan.clone(), - self.layout_to_paint_chan.clone(), - self.image_cache_thread, - self.font_cache_thread, - self.time_profiler_chan, - self.mem_profiler_chan, - self.layout_shutdown_chan, - self.layout_content_process_shutdown_chan.clone(), - self.webrender_api_sender); + LTF::create(self.id, + self.load_data.url.clone(), + self.parent_info.is_some(), + layout_pair, + self.pipeline_port.expect("No pipeline port."), + self.layout_to_constellation_chan, + self.panic_chan, + self.script_chan.clone(), + self.layout_to_paint_chan.clone(), + self.image_cache_thread, + self.font_cache_thread, + self.time_profiler_chan, + self.mem_profiler_chan, + self.layout_shutdown_chan, + self.layout_content_process_shutdown_chan.clone(), + self.webrender_api_sender); if wait_for_completion { let _ = self.script_content_process_shutdown_port.recv(); diff --git a/components/layout/layout_thread.rs b/components/layout/layout_thread.rs index 2a6fda09344..ed7805492c4 100644 --- a/components/layout/layout_thread.rs +++ b/components/layout/layout_thread.rs @@ -247,8 +247,7 @@ pub struct LayoutThread { impl LayoutThreadFactory for LayoutThread { /// Spawns a new layout thread. - fn create(_phantom: Option<&mut LayoutThread>, - id: PipelineId, + fn create(id: PipelineId, url: Url, is_iframe: bool, chan: OpaqueScriptLayoutChannel, @@ -731,23 +730,22 @@ impl LayoutThread { } fn create_layout_thread(&self, info: NewLayoutThreadInfo) { - LayoutThreadFactory::create(None::<&mut LayoutThread>, - info.id, - info.url.clone(), - info.is_parent, - info.layout_pair, - info.pipeline_port, - info.constellation_chan, - info.panic_chan, - info.script_chan.clone(), - info.paint_chan.to::(), - self.image_cache_thread.clone(), - self.font_cache_thread.clone(), - self.time_profiler_chan.clone(), - self.mem_profiler_chan.clone(), - info.layout_shutdown_chan, - info.content_process_shutdown_chan, - self.webrender_api.as_ref().map(|wr| wr.clone_sender())); + LayoutThread::create(info.id, + info.url.clone(), + info.is_parent, + info.layout_pair, + info.pipeline_port, + info.constellation_chan, + info.panic_chan, + info.script_chan.clone(), + info.paint_chan.to::(), + self.image_cache_thread.clone(), + self.font_cache_thread.clone(), + self.time_profiler_chan.clone(), + self.mem_profiler_chan.clone(), + info.layout_shutdown_chan, + info.content_process_shutdown_chan, + self.webrender_api.as_ref().map(|wr| wr.clone_sender())); } /// Enters a quiescent state in which no new messages will be processed until an `ExitNow` is diff --git a/components/layout_traits/lib.rs b/components/layout_traits/lib.rs index 0b12676b0db..5466900b7bf 100644 --- a/components/layout_traits/lib.rs +++ b/components/layout_traits/lib.rs @@ -41,9 +41,7 @@ pub struct LayoutControlChan(pub IpcSender); // A static method creating a layout thread // Here to remove the compositor -> layout dependency pub trait LayoutThreadFactory { - // FIXME: use a proper static method - fn create(_phantom: Option<&mut Self>, - id: PipelineId, + fn create(id: PipelineId, url: Url, is_iframe: bool, chan: OpaqueScriptLayoutChannel, diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 960d39cc244..8f43e1b1bfc 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -421,18 +421,17 @@ impl<'a> Drop for ScriptMemoryFailsafe<'a> { } impl ScriptThreadFactory for ScriptThread { - fn create_layout_channel(_phantom: Option<&mut ScriptThread>) -> OpaqueScriptLayoutChannel { + fn create_layout_channel() -> OpaqueScriptLayoutChannel { let (chan, port) = channel(); ScriptLayoutChan::new(chan, port) } - fn clone_layout_channel(_phantom: Option<&mut ScriptThread>, pair: &OpaqueScriptLayoutChannel) + fn clone_layout_channel(pair: &OpaqueScriptLayoutChannel) -> Box { box pair.sender() as Box } - fn create(_phantom: Option<&mut ScriptThread>, - state: InitialScriptState, + fn create(state: InitialScriptState, layout_chan: &OpaqueScriptLayoutChannel, load_data: LoadData) { let panic_chan = state.panic_chan.clone(); @@ -1077,9 +1076,8 @@ impl ScriptThread { content_process_shutdown_chan, } = new_layout_info; - let layout_pair = ScriptThread::create_layout_channel(None::<&mut ScriptThread>); + let layout_pair = ScriptThread::create_layout_channel(); let layout_chan = LayoutChan(*ScriptThread::clone_layout_channel( - None::<&mut ScriptThread>, &layout_pair).downcast::>().unwrap()); let layout_creation_info = NewLayoutThreadInfo { diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index 14c3338dbc2..7e3ebc9541d 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -346,15 +346,13 @@ pub struct ScriptControlChan(pub IpcSender); /// crate. pub trait ScriptThreadFactory { /// Create a `ScriptThread`. - fn create(_phantom: Option<&mut Self>, - state: InitialScriptState, + fn create(state: InitialScriptState, layout_chan: &OpaqueScriptLayoutChannel, load_data: LoadData); /// Create a script -> layout channel (`Sender`, `Receiver` pair). - fn create_layout_channel(_phantom: Option<&mut Self>) -> OpaqueScriptLayoutChannel; + fn create_layout_channel() -> OpaqueScriptLayoutChannel; /// Clone the `Sender` in `pair`. - fn clone_layout_channel(_phantom: Option<&mut Self>, pair: &OpaqueScriptLayoutChannel) - -> Box; + fn clone_layout_channel(pair: &OpaqueScriptLayoutChannel) -> Box; } /// Messages sent from the script thread to the compositor