#ifndef CHROME_BROWSER_EXTENSIONS_API_PROCESSES_PROCESSES_API_H__
#define CHROME_BROWSER_EXTENSIONS_API_PROCESSES_PROCESSES_API_H__
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/values.h"
#include "chrome/browser/task_manager/task_manager_observer.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/event_router.h"
#include "extensions/browser/extension_event_histogram_value.h"
#include "extensions/browser/extension_function.h"
#include "extensions/buildflags/buildflags.h"
static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));
class ProcessesApiTest;
namespace extensions {
class ProcessesEventRouter : public task_manager::TaskManagerObserver {
public:
explicit ProcessesEventRouter(content::BrowserContext* context);
ProcessesEventRouter(const ProcessesEventRouter&) = delete;
ProcessesEventRouter& operator=(const ProcessesEventRouter&) = delete;
~ProcessesEventRouter() override;
void ListenerAdded();
void ListenerRemoved();
void OnTaskAdded(task_manager::TaskId id) override;
void OnTaskToBeRemoved(task_manager::TaskId id) override;
void OnTasksRefreshed(const task_manager::TaskIdList& task_ids) override {}
void OnTasksRefreshedWithBackgroundCalculations(
const task_manager::TaskIdList& task_ids) override;
void OnTaskUnresponsive(task_manager::TaskId id) override;
private:
friend class ::ProcessesApiTest;
void DispatchEvent(events::HistogramValue histogram_value,
const std::string& event_name,
base::Value::List event_args) const;
bool HasEventListeners(const std::string& event_name) const;
bool ShouldReportOnCreatedOrOnExited(task_manager::TaskId id,
int* out_child_process_host_id) const;
void UpdateRefreshTypesFlagsBasedOnListeners();
raw_ptr<content::BrowserContext> browser_context_;
int listeners_;
};
class ProcessesAPI : public BrowserContextKeyedAPI,
public EventRouter::Observer {
public:
explicit ProcessesAPI(content::BrowserContext* context);
ProcessesAPI(const ProcessesAPI&) = delete;
ProcessesAPI& operator=(const ProcessesAPI&) = delete;
~ProcessesAPI() override;
static BrowserContextKeyedAPIFactory<ProcessesAPI>* GetFactoryInstance();
static ProcessesAPI* Get(content::BrowserContext* context);
void Shutdown() override;
void OnListenerAdded(const EventListenerInfo& details) override;
void OnListenerRemoved(const EventListenerInfo& details) override;
ProcessesEventRouter* processes_event_router();
private:
friend class BrowserContextKeyedAPIFactory<ProcessesAPI>;
static const char* service_name() { return "ProcessesAPI"; }
static const bool kServiceRedirectedInIncognito = true;
static const bool kServiceIsNULLWhileTesting = true;
raw_ptr<content::BrowserContext> browser_context_;
std::unique_ptr<ProcessesEventRouter> processes_event_router_;
};
class ProcessesGetProcessIdForTabFunction : public ExtensionFunction {
public:
ExtensionFunction::ResponseAction Run() override;
DECLARE_EXTENSION_FUNCTION("processes.getProcessIdForTab",
PROCESSES_GETPROCESSIDFORTAB)
private:
~ProcessesGetProcessIdForTabFunction() override = default;
};
class ProcessesTerminateFunction : public ExtensionFunction {
public:
ExtensionFunction::ResponseAction Run() override;
DECLARE_EXTENSION_FUNCTION("processes.terminate", PROCESSES_TERMINATE)
private:
~ProcessesTerminateFunction() override = default;
base::ProcessHandle GetProcessHandleOnIO(int child_process_host_id) const;
void OnProcessHandleOnUI(base::ProcessHandle handle);
ExtensionFunction::ResponseValue TerminateIfAllowed(
base::ProcessHandle handle);
int child_process_host_id_ = 0;
};
class ProcessesGetProcessInfoFunction
: public ExtensionFunction,
public task_manager::TaskManagerObserver {
public:
ProcessesGetProcessInfoFunction();
ExtensionFunction::ResponseAction Run() override;
void OnTaskAdded(task_manager::TaskId id) override {}
void OnTaskToBeRemoved(task_manager::TaskId id) override {}
void OnTasksRefreshed(const task_manager::TaskIdList& task_ids) override;
void OnTasksRefreshedWithBackgroundCalculations(
const task_manager::TaskIdList& task_ids) override;
DECLARE_EXTENSION_FUNCTION("processes.getProcessInfo",
PROCESSES_GETPROCESSINFO)
private:
~ProcessesGetProcessInfoFunction() override;
void GatherDataAndRespond(const task_manager::TaskIdList& task_ids);
std::vector<int> process_host_ids_;
bool include_memory_ = false;
};
}
#endif