Index: content/browser/child_process_launcher.cc |
diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc |
index 6970d248feaae5d83716e9eee6dee0c0d243d81a..3700f47e04cbb73127724b397919d1998f57aba2 100644 |
--- a/content/browser/child_process_launcher.cc |
+++ b/content/browser/child_process_launcher.cc |
@@ -23,13 +23,14 @@ ChildProcessLauncher::ChildProcessLauncher( |
std::unique_ptr<base::CommandLine> command_line, |
int child_process_id, |
Client* client, |
- const std::string& mojo_child_token, |
+ std::unique_ptr<mojo::edk::PendingProcessConnection> pending_connection, |
const mojo::edk::ProcessErrorCallback& process_error_callback, |
bool terminate_on_shutdown) |
: client_(client), |
termination_status_(base::TERMINATION_STATUS_NORMAL_TERMINATION), |
exit_code_(RESULT_CODE_NORMAL_EXIT), |
starting_(true), |
+ pending_connection_(std::move(pending_connection)), |
process_error_callback_(process_error_callback), |
#if defined(ADDRESS_SANITIZER) || defined(LEAK_SANITIZER) || \ |
defined(MEMORY_SANITIZER) || defined(THREAD_SANITIZER) || \ |
@@ -38,7 +39,6 @@ ChildProcessLauncher::ChildProcessLauncher( |
#else |
terminate_child_on_shutdown_(terminate_on_shutdown), |
#endif |
- mojo_child_token_(mojo_child_token), |
weak_factory_(this) { |
DCHECK(CalledOnValidThread()); |
CHECK(BrowserThread::GetCurrentThreadIdentifier(&client_thread_id_)); |
@@ -78,16 +78,21 @@ void ChildProcessLauncher::Notify( |
starting_ = false; |
process_ = std::move(process); |
+ // Take ownership of the pending connection here so it's destroyed when |
+ // we go out of scope regardless of the outcome below. |
+ std::unique_ptr<mojo::edk::PendingProcessConnection> pending_connection = |
+ std::move(pending_connection_); |
if (process_.process.IsValid()) { |
// Set up Mojo IPC to the new process. |
- mojo::edk::ChildProcessLaunched(process_.process.Handle(), |
- std::move(server_handle), |
- mojo_child_token_, |
- process_error_callback_); |
+ DCHECK(pending_connection); |
+ pending_connection->Connect(process_.process.Handle(), |
+ std::move(server_handle), |
+ process_error_callback_); |
client_->OnProcessLaunched(); |
} else { |
- mojo::edk::ChildProcessLaunchFailed(mojo_child_token_); |
termination_status_ = base::TERMINATION_STATUS_LAUNCH_FAILED; |
+ |
+ // NOTE: May delete |this|. |
client_->OnProcessLaunchFailed(error_code); |
} |
} |