diff options
Diffstat (limited to 'components/compositing/constellation.rs')
-rw-r--r-- | components/compositing/constellation.rs | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs index 4f74a90aedb..b61c0b46c85 100644 --- a/components/compositing/constellation.rs +++ b/components/compositing/constellation.rs @@ -406,27 +406,7 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF> // // Yes, that's all there is to it! if opts::multiprocess() { - let (server, token) = - IpcOneShotServer::<IpcSender<UnprivilegedPipelineContent>>::new().unwrap(); - - // If there is a sandbox, use the `gaol` API to create the child process. - let child_process = if opts::get().sandbox { - let mut command = sandbox::Command::me().unwrap(); - command.arg("--content-process").arg(token); - let profile = sandboxing::content_process_sandbox_profile(); - ChildProcess::Sandboxed(Sandbox::new(profile).start(&mut command).expect( - "Failed to start sandboxed child process!")) - } else { - let path_to_self = env::current_exe().unwrap(); - let mut child_process = process::Command::new(path_to_self); - child_process.arg("--content-process"); - child_process.arg(token); - ChildProcess::Unsandboxed(child_process.spawn().unwrap()) - }; - self.child_processes.push(child_process); - - let (_receiver, sender) = server.accept().unwrap(); - sender.send(unprivileged_pipeline_content).unwrap(); + self.spawn_multiprocess(unprivileged_pipeline_content); } else { unprivileged_pipeline_content.start_all::<LTF, STF>(false); } @@ -436,6 +416,36 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF> self.pipelines.insert(pipeline_id, pipeline); } + #[cfg(not(target_os = "windows"))] + fn spawn_multiprocess(&mut self, unprivileged_pipeline_content: UnprivilegedPipelineContent) { + let (server, token) = + IpcOneShotServer::<IpcSender<UnprivilegedPipelineContent>>::new().unwrap(); + + // If there is a sandbox, use the `gaol` API to create the child process. + let child_process = if opts::get().sandbox { + let mut command = sandbox::Command::me().unwrap(); + command.arg("--content-process").arg(token); + let profile = sandboxing::content_process_sandbox_profile(); + ChildProcess::Sandboxed(Sandbox::new(profile).start(&mut command).expect( + "Failed to start sandboxed child process!")) + } else { + let path_to_self = env::current_exe().unwrap(); + let mut child_process = process::Command::new(path_to_self); + child_process.arg("--content-process"); + child_process.arg(token); + ChildProcess::Unsandboxed(child_process.spawn().unwrap()) + }; + + self.child_processes.push(child_process); + let (_receiver, sender) = server.accept().unwrap(); + sender.send(unprivileged_pipeline_content).unwrap(); + } + + #[cfg(target_os = "windows")] + fn spawn_multiprocess(&mut self, _: UnprivilegedPipelineContent) { + panic!("Multiprocess is not supported on Windows."); + } + // Push a new (loading) pipeline to the list of pending frame changes fn push_pending_frame(&mut self, new_pipeline_id: PipelineId, old_pipeline_id: Option<PipelineId>) { |