| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/service/service_utility_process_host.h" | 5 #include "chrome/service/service_utility_process_host.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/files/file.h" | 11 #include "base/files/file.h" |
| 12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
| 13 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" |
| 14 #include "base/files/scoped_temp_dir.h" | 14 #include "base/files/scoped_temp_dir.h" |
| 15 #include "base/logging.h" | 15 #include "base/logging.h" |
| 16 #include "base/message_loop/message_loop_proxy.h" | 16 #include "base/message_loop/message_loop_proxy.h" |
| 17 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
| 18 #include "base/process/kill.h" | 18 #include "base/process/kill.h" |
| 19 #include "base/process/launch.h" | 19 #include "base/process/launch.h" |
| 20 #include "base/process/process_handle.h" |
| 20 #include "base/task_runner_util.h" | 21 #include "base/task_runner_util.h" |
| 21 #include "chrome/common/chrome_switches.h" | 22 #include "chrome/common/chrome_switches.h" |
| 22 #include "chrome/common/chrome_utility_printing_messages.h" | 23 #include "chrome/common/chrome_utility_printing_messages.h" |
| 23 #include "content/public/common/child_process_host.h" | 24 #include "content/public/common/child_process_host.h" |
| 24 #include "content/public/common/result_codes.h" | 25 #include "content/public/common/result_codes.h" |
| 25 #include "content/public/common/sandbox_init.h" | 26 #include "content/public/common/sandbox_init.h" |
| 26 #include "content/public/common/sandboxed_process_launcher_delegate.h" | 27 #include "content/public/common/sandboxed_process_launcher_delegate.h" |
| 27 #include "ipc/ipc_switches.h" | 28 #include "ipc/ipc_switches.h" |
| 28 #include "printing/emf_win.h" | 29 #include "printing/emf_win.h" |
| 29 #include "sandbox/win/src/sandbox_policy_base.h" | 30 #include "sandbox/win/src/sandbox_policy_base.h" |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 ServiceUtilityProcessHost* host_; | 147 ServiceUtilityProcessHost* host_; |
| 147 std::queue<base::File> emf_files_; | 148 std::queue<base::File> emf_files_; |
| 148 int page_count_; | 149 int page_count_; |
| 149 int current_page_; | 150 int current_page_; |
| 150 int pages_in_progress_; | 151 int pages_in_progress_; |
| 151 }; | 152 }; |
| 152 | 153 |
| 153 ServiceUtilityProcessHost::ServiceUtilityProcessHost( | 154 ServiceUtilityProcessHost::ServiceUtilityProcessHost( |
| 154 Client* client, | 155 Client* client, |
| 155 base::MessageLoopProxy* client_message_loop_proxy) | 156 base::MessageLoopProxy* client_message_loop_proxy) |
| 156 : handle_(base::kNullProcessHandle), | 157 : client_(client), |
| 157 client_(client), | |
| 158 client_message_loop_proxy_(client_message_loop_proxy), | 158 client_message_loop_proxy_(client_message_loop_proxy), |
| 159 waiting_for_reply_(false), | 159 waiting_for_reply_(false), |
| 160 weak_ptr_factory_(this) { | 160 weak_ptr_factory_(this) { |
| 161 child_process_host_.reset(ChildProcessHost::Create(this)); | 161 child_process_host_.reset(ChildProcessHost::Create(this)); |
| 162 } | 162 } |
| 163 | 163 |
| 164 ServiceUtilityProcessHost::~ServiceUtilityProcessHost() { | 164 ServiceUtilityProcessHost::~ServiceUtilityProcessHost() { |
| 165 // We need to kill the child process when the host dies. | 165 // We need to kill the child process when the host dies. |
| 166 base::KillProcess(handle_, content::RESULT_CODE_NORMAL_EXIT, false); | 166 base::KillProcess(process_.Handle(), content::RESULT_CODE_NORMAL_EXIT, false); |
| 167 } | 167 } |
| 168 | 168 |
| 169 bool ServiceUtilityProcessHost::StartRenderPDFPagesToMetafile( | 169 bool ServiceUtilityProcessHost::StartRenderPDFPagesToMetafile( |
| 170 const base::FilePath& pdf_path, | 170 const base::FilePath& pdf_path, |
| 171 const printing::PdfRenderSettings& render_settings) { | 171 const printing::PdfRenderSettings& render_settings) { |
| 172 ReportUmaEvent(SERVICE_UTILITY_METAFILE_REQUEST); | 172 ReportUmaEvent(SERVICE_UTILITY_METAFILE_REQUEST); |
| 173 start_time_ = base::Time::Now(); | 173 start_time_ = base::Time::Now(); |
| 174 base::File pdf_file(pdf_path, base::File::FLAG_OPEN | base::File::FLAG_READ); | 174 base::File pdf_file(pdf_path, base::File::FLAG_OPEN | base::File::FLAG_READ); |
| 175 if (!pdf_file.IsValid() || !StartProcess(false)) | 175 if (!pdf_file.IsValid() || !StartProcess(false)) |
| 176 return false; | 176 return false; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 return true; | 226 return true; |
| 227 } | 227 } |
| 228 ReportUmaEvent(SERVICE_UTILITY_FAILED_TO_START); | 228 ReportUmaEvent(SERVICE_UTILITY_FAILED_TO_START); |
| 229 return false; | 229 return false; |
| 230 } | 230 } |
| 231 | 231 |
| 232 bool ServiceUtilityProcessHost::Launch(base::CommandLine* cmd_line, | 232 bool ServiceUtilityProcessHost::Launch(base::CommandLine* cmd_line, |
| 233 bool no_sandbox) { | 233 bool no_sandbox) { |
| 234 if (no_sandbox) { | 234 if (no_sandbox) { |
| 235 cmd_line->AppendSwitch(switches::kNoSandbox); | 235 cmd_line->AppendSwitch(switches::kNoSandbox); |
| 236 base::LaunchProcess(*cmd_line, base::LaunchOptions(), &handle_); | 236 base::ProcessHandle handle; |
| 237 if (base::LaunchProcess(*cmd_line, base::LaunchOptions(), &handle)) |
| 238 process_ = base::Process(handle); |
| 237 } else { | 239 } else { |
| 238 ServiceSandboxedProcessLauncherDelegate delegate; | 240 ServiceSandboxedProcessLauncherDelegate delegate; |
| 239 handle_ = content::StartSandboxedProcess(&delegate, cmd_line); | 241 process_ = |
| 242 base::Process(content::StartSandboxedProcess(&delegate, cmd_line)); |
| 240 } | 243 } |
| 241 return (handle_ != base::kNullProcessHandle); | 244 return process_.IsValid(); |
| 242 } | 245 } |
| 243 | 246 |
| 244 bool ServiceUtilityProcessHost::Send(IPC::Message* msg) { | 247 bool ServiceUtilityProcessHost::Send(IPC::Message* msg) { |
| 245 if (child_process_host_) | 248 if (child_process_host_) |
| 246 return child_process_host_->Send(msg); | 249 return child_process_host_->Send(msg); |
| 247 delete msg; | 250 delete msg; |
| 248 return false; | 251 return false; |
| 249 } | 252 } |
| 250 | 253 |
| 251 base::FilePath ServiceUtilityProcessHost::GetUtilityProcessCmd() { | 254 base::FilePath ServiceUtilityProcessHost::GetUtilityProcessCmd() { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded, | 290 ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded, |
| 288 OnGetPrinterSemanticCapsAndDefaultsSucceeded) | 291 OnGetPrinterSemanticCapsAndDefaultsSucceeded) |
| 289 IPC_MESSAGE_HANDLER( | 292 IPC_MESSAGE_HANDLER( |
| 290 ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed, | 293 ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed, |
| 291 OnGetPrinterSemanticCapsAndDefaultsFailed) | 294 OnGetPrinterSemanticCapsAndDefaultsFailed) |
| 292 IPC_MESSAGE_UNHANDLED(handled = false) | 295 IPC_MESSAGE_UNHANDLED(handled = false) |
| 293 IPC_END_MESSAGE_MAP() | 296 IPC_END_MESSAGE_MAP() |
| 294 return handled; | 297 return handled; |
| 295 } | 298 } |
| 296 | 299 |
| 297 base::ProcessHandle ServiceUtilityProcessHost::GetHandle() const { | 300 const base::Process& ServiceUtilityProcessHost::GetProcess() const { |
| 298 return handle_; | 301 return process_; |
| 299 } | 302 } |
| 300 | 303 |
| 301 void ServiceUtilityProcessHost::OnMetafileSpooled(bool success) { | 304 void ServiceUtilityProcessHost::OnMetafileSpooled(bool success) { |
| 302 if (!success || pdf_to_emf_state_->OnPageProcessed()) | 305 if (!success || pdf_to_emf_state_->OnPageProcessed()) |
| 303 OnPDFToEmfFinished(success); | 306 OnPDFToEmfFinished(success); |
| 304 } | 307 } |
| 305 | 308 |
| 306 void ServiceUtilityProcessHost::OnRenderPDFPagesToMetafilesPageCount( | 309 void ServiceUtilityProcessHost::OnRenderPDFPagesToMetafilesPageCount( |
| 307 int page_count) { | 310 int page_count) { |
| 308 DCHECK(waiting_for_reply_); | 311 DCHECK(waiting_for_reply_); |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 return false; | 424 return false; |
| 422 } | 425 } |
| 423 printing::Emf emf; | 426 printing::Emf emf; |
| 424 if (!emf.InitFromData(data.data(), data.size())) { | 427 if (!emf.InitFromData(data.data(), data.size())) { |
| 425 OnRenderPDFPagesToMetafileDone(false); | 428 OnRenderPDFPagesToMetafileDone(false); |
| 426 return false; | 429 return false; |
| 427 } | 430 } |
| 428 OnRenderPDFPagesToMetafilePageDone(scale_factor, emf); | 431 OnRenderPDFPagesToMetafilePageDone(scale_factor, emf); |
| 429 return true; | 432 return true; |
| 430 } | 433 } |
| OLD | NEW |