blob: 99da7eee3cb1a09b984832211bceee385147aec2 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/service_host/utility_process_client.h"
#include <optional>
#include <string>
#include "base/functional/callback.h"
#include "base/process/process.h"
#include "content/browser/service_host/service_process_tracker.h"
#include "content/browser/service_host/utility_process_host.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/service_process_info.h"
#include "url/gurl.h"
namespace content {
UtilityProcessClient::UtilityProcessClient(
const std::string& service_interface_name,
const std::optional<GURL>& site,
base::OnceCallback<void(const base::Process&)> process_callback)
: service_interface_name_(service_interface_name),
site_(std::move(site)),
process_callback_(std::move(process_callback)) {}
UtilityProcessClient::~UtilityProcessClient() = default;
void UtilityProcessClient::OnProcessLaunched(const base::Process& process) {
CHECK_CURRENTLY_ON(BrowserThread::UI);
process_info_.emplace(GetServiceProcessTracker().AddProcess(
process.Duplicate(), site_, service_interface_name_));
if (process_callback_) {
std::move(process_callback_).Run(process);
}
}
void UtilityProcessClient::OnProcessTerminatedNormally() {
GetServiceProcessTracker().NotifyTerminated(
process_info_->service_process_id());
}
void UtilityProcessClient::OnProcessCrashed(CrashType type) {
// TODO(crbug.com/40654042): It is unclear how we can observe
// |OnProcessCrashed()| without observing |OnProcessLaunched()| first, but
// it can happen on Android. Ignore the notification in this case.
if (!process_info_) {
return;
}
GetServiceProcessTracker().NotifyCrashed(process_info_->service_process_id(),
type);
}
} // namespace content