1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
// 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/service_process_tracker.h"
#include <map>
#include <optional>
#include <string>
#include "base/no_destructor.h"
#include "base/observer_list.h"
#include "base/process/process.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/service_process_host.h"
#include "content/public/browser/service_process_info.h"
#include "url/gurl.h"
namespace content {
ServiceProcessTracker::ServiceProcessTracker() = default;
ServiceProcessTracker::~ServiceProcessTracker() = default;
ServiceProcessInfo ServiceProcessTracker::AddProcess(
base::Process process,
const std::optional<GURL>& site,
const std::string& service_interface_name) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
auto id = GenerateNextId();
ServiceProcessInfo info(service_interface_name, site, id, std::move(process));
auto info_dup = info.Duplicate();
processes_.insert({id, std::move(info)});
for (auto& observer : observers_) {
observer.OnServiceProcessLaunched(info_dup);
}
return info_dup;
}
void ServiceProcessTracker::NotifyTerminated(ServiceProcessId id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
auto iter = processes_.find(id);
CHECK(iter != processes_.end());
for (auto& observer : observers_) {
observer.OnServiceProcessTerminatedNormally(iter->second.Duplicate());
}
processes_.erase(iter);
}
void ServiceProcessTracker::NotifyCrashed(ServiceProcessId id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
auto iter = processes_.find(id);
CHECK(iter != processes_.end());
for (auto& observer : observers_) {
observer.OnServiceProcessCrashed(iter->second.Duplicate());
}
processes_.erase(iter);
}
void ServiceProcessTracker::AddObserver(
ServiceProcessHost::Observer* observer) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
observers_.AddObserver(observer);
}
void ServiceProcessTracker::RemoveObserver(
ServiceProcessHost::Observer* observer) {
// NOTE: Some tests may remove observers after BrowserThreads are shut down.
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
!BrowserThread::IsThreadInitialized(BrowserThread::UI));
observers_.RemoveObserver(observer);
}
std::vector<ServiceProcessInfo> ServiceProcessTracker::GetProcesses() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
std::vector<ServiceProcessInfo> processes;
for (const auto& entry : processes_) {
processes.push_back(entry.second.Duplicate());
}
return processes;
}
ServiceProcessId ServiceProcessTracker::GenerateNextId() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
return service_process_id_generator_.GenerateNextId();
}
ServiceProcessTracker& GetServiceProcessTracker() {
static base::NoDestructor<ServiceProcessTracker> tracker;
return *tracker;
}
} // namespace content
|