Chromium Code Reviews| Index: chrome/browser/extensions/api/processes/processes_api.h |
| diff --git a/chrome/browser/extensions/api/processes/processes_api.h b/chrome/browser/extensions/api/processes/processes_api.h |
| index 41b0cc71486b42ad7ebf114a19db7ff7f5d8e402..3c1cc52d8115e1d4f5850fd19a926f2dd390dacb 100644 |
| --- a/chrome/browser/extensions/api/processes/processes_api.h |
| +++ b/chrome/browser/extensions/api/processes/processes_api.h |
| @@ -5,35 +5,20 @@ |
| #ifndef CHROME_BROWSER_EXTENSIONS_API_PROCESSES_PROCESSES_API_H__ |
| #define CHROME_BROWSER_EXTENSIONS_API_PROCESSES_PROCESSES_API_H__ |
| -#include <set> |
| -#include <string> |
| - |
| #include "base/macros.h" |
| -#include "base/memory/scoped_ptr.h" |
| -#include "chrome/browser/extensions/chrome_extension_function.h" |
| -#include "chrome/browser/task_manager/task_manager.h" |
| -#include "components/keyed_service/core/keyed_service.h" |
| -#include "content/public/browser/notification_registrar.h" |
| -#include "content/public/browser/render_process_host.h" |
| -#include "content/public/browser/render_widget_host.h" |
| +#include "chrome/browser/task_management/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" |
| -namespace base { |
| -class ListValue; |
| -} |
| - |
| -namespace content { |
| -class BrowserContext; |
| -} |
| +class ProccessesApiTest; |
| namespace extensions { |
| // Observes the Task Manager and routes the notifications as events to the |
| // extension system. |
| -class ProcessesEventRouter : public TaskManagerModelObserver, |
| - public content::NotificationObserver { |
| +class ProcessesEventRouter : public task_management::TaskManagerObserver { |
| public: |
| explicit ProcessesEventRouter(content::BrowserContext* context); |
| ~ProcessesEventRouter() override; |
| @@ -44,58 +29,32 @@ class ProcessesEventRouter : public TaskManagerModelObserver, |
| // Called when an extension process with a listener exits or removes it. |
| void ListenerRemoved(); |
| - // Called on the first invocation of extension API function. This will call |
| - // out to the Task Manager to start listening for notifications. Returns |
| - // true if this was the first call and false if this has already been called. |
| - void StartTaskManagerListening(); |
| - |
| - bool is_task_manager_listening() { return task_manager_listening_; } |
| + // task_management::TaskManagerObserver: |
| + void OnTaskAdded(task_management::TaskId id) override; |
| + void OnTaskToBeRemoved(task_management::TaskId id) override; |
| + void OnTasksRefreshed(const task_management::TaskIdList& task_ids) override; |
| + void OnTaskUnresponsive(task_management::TaskId id) override; |
| private: |
| - // content::NotificationObserver implementation. |
| - void Observe(int type, |
| - const content::NotificationSource& source, |
| - const content::NotificationDetails& details) override; |
| - |
| - // TaskManagerModelObserver methods. |
| - void OnItemsAdded(int start, int length) override; |
| - void OnModelChanged() override {} |
| - void OnItemsChanged(int start, int length) override; |
| - void OnItemsRemoved(int start, int length) override {} |
| - void OnItemsToBeRemoved(int start, int length) override; |
| - |
| - // Internal helpers for processing notifications. |
| - void ProcessHangEvent(content::RenderWidgetHost* widget); |
| - void ProcessClosedEvent( |
| - content::RenderProcessHost* rph, |
| - content::RenderProcessHost::RendererClosedDetails* details); |
| + friend class ::ProccessesApiTest; |
| void DispatchEvent(events::HistogramValue histogram_value, |
| const std::string& event_name, |
| - scoped_ptr<base::ListValue> event_args); |
| + scoped_ptr<base::ListValue> event_args) const; |
| // Determines whether there is a registered listener for the specified event. |
| - // It helps to avoid collecing data if no one is interested in it. |
| - bool HasEventListeners(const std::string& event_name); |
| - |
| - // Used for tracking registrations to process related notifications. |
| - content::NotificationRegistrar registrar_; |
| + // It helps to avoid collecting data if no one is interested in it. |
| + bool HasEventListeners(const std::string& event_name) const; |
| content::BrowserContext* browser_context_; |
| - // TaskManager to observe for updates. |
| - TaskManagerModel* model_; |
| - |
| // Count of listeners, so we avoid sending updates if no one is interested. |
| int listeners_; |
| - // Indicator whether we've initialized the Task Manager listeners. This is |
| - // done once for the lifetime of this object. |
| - bool task_manager_listening_; |
| - |
| DISALLOW_COPY_AND_ASSIGN(ProcessesEventRouter); |
| }; |
| +//////////////////////////////////////////////////////////////////////////////// |
| // The profile-keyed service that manages the processes extension API. |
| class ProcessesAPI : public BrowserContextKeyedAPI, |
| public EventRouter::Observer { |
| @@ -103,98 +62,101 @@ class ProcessesAPI : public BrowserContextKeyedAPI, |
| explicit ProcessesAPI(content::BrowserContext* context); |
| ~ProcessesAPI() override; |
| - // KeyedService implementation. |
| - void Shutdown() override; |
| - |
| - // BrowserContextKeyedAPI implementation. |
| - static BrowserContextKeyedAPIFactory<ProcessesAPI>* GetFactoryInstance(); |
| - |
| // Convenience method to get the ProcessesAPI for a profile. |
| static ProcessesAPI* Get(content::BrowserContext* context); |
| - ProcessesEventRouter* processes_event_router(); |
| + // BrowserContextKeyedAPI: |
| + static BrowserContextKeyedAPIFactory<ProcessesAPI>* GetFactoryInstance(); |
| + |
| + // KeyedService: |
| + void Shutdown() override; |
| - // EventRouter::Observer implementation. |
| + // EventRouter::Observer: |
| void OnListenerAdded(const EventListenerInfo& details) override; |
| void OnListenerRemoved(const EventListenerInfo& details) override; |
| + ProcessesEventRouter* processes_event_router(); |
| + |
| private: |
| friend class BrowserContextKeyedAPIFactory<ProcessesAPI>; |
| - content::BrowserContext* browser_context_; |
| - |
| - // BrowserContextKeyedAPI implementation. |
| - static const char* service_name() { |
| - return "ProcessesAPI"; |
| - } |
| + // BrowserContextKeyedAPI: |
| + static const char* service_name() { return "ProcessesAPI"; } |
| static const bool kServiceRedirectedInIncognito = true; |
| static const bool kServiceIsNULLWhileTesting = true; |
| + content::BrowserContext* browser_context_; |
| + |
| // Created lazily on first access. |
| scoped_ptr<ProcessesEventRouter> processes_event_router_; |
| }; |
| -// This extension function returns the Process object for the renderer process |
| -// currently in use by the specified Tab. |
| -class GetProcessIdForTabFunction : public ChromeAsyncExtensionFunction { |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// Extension function that allows terminating Chrome subprocesses, by supplying |
| +// the unique ID for the process coming from the ChildProcess ID pool. |
| +// Using unique IDs instead of OS process IDs allows two advantages: |
| +// * guaranteed uniqueness, since OS process IDs can be reused. |
| +// * guards against killing non-Chrome processes. |
| +class ProcessesTerminateFunction : public UIThreadExtensionFunction { |
| public: |
| - GetProcessIdForTabFunction(); |
| + // UIThreadExtensionFunction: |
| + ExtensionFunction::ResponseAction Run() override; |
| - private: |
| - ~GetProcessIdForTabFunction() override {} |
| - bool RunAsync() override; |
| + DECLARE_EXTENSION_FUNCTION("processes.terminate", PROCESSES_TERMINATE); |
| - void GetProcessIdForTab(); |
| + private: |
| + ~ProcessesTerminateFunction() override {} |
| - // Storage for the tab ID parameter. |
| - int tab_id_; |
| + // Functions to get the process handle on the IO thread and post it back to |
| + // the UI thread from processing. |
| + base::ProcessHandle GetProcessHandleIO(int child_process_host_id) const; |
| + void OnProcessHandleUI(base::ProcessHandle handle); |
| - DECLARE_EXTENSION_FUNCTION("processes.getProcessIdForTab", |
| - PROCESSES_GETPROCESSIDFORTAB) |
| + // Caches the parameter of this function. To be accessed only on the UI |
| + // thread. |
| + int child_process_host_id_; |
|
ncarter (slow)
2016/02/08 22:37:09
You don't have a ctor, so it looks like there's no
afakhry
2016/02/09 04:01:23
Done.
|
| }; |
| -// Extension function that allows terminating Chrome subprocesses, by supplying |
| -// the unique ID for the process coming from the ChildProcess ID pool. |
| -// Using unique IDs instead of OS process IDs allows two advantages: |
| -// * guaranteed uniqueness, since OS process IDs can be reused |
| -// * guards against killing non-Chrome processes |
| -class TerminateFunction : public ChromeAsyncExtensionFunction { |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// This extension function returns the Process object for the renderer process |
| +// currently in use by the specified Tab. |
| +class ProcessesGetProcessIdForTabFunction : public UIThreadExtensionFunction { |
| public: |
| - TerminateFunction(); |
| + // UIThreadExtensionFunction: |
| + ExtensionFunction::ResponseAction Run() override; |
| - private: |
| - ~TerminateFunction() override {} |
| - bool RunAsync() override; |
| - |
| - void TerminateProcess(); |
| - |
| - // Storage for the process ID parameter. |
| - int process_id_; |
| + DECLARE_EXTENSION_FUNCTION("processes.getProcessIdForTab", |
| + PROCESSES_GETPROCESSIDFORTAB); |
| - DECLARE_EXTENSION_FUNCTION("processes.terminate", |
| - PROCESSES_TERMINATE) |
| + private: |
| + ~ProcessesGetProcessIdForTabFunction() override {} |
| }; |
| +//////////////////////////////////////////////////////////////////////////////// |
| // Extension function which returns a set of Process objects, containing the |
| // details corresponding to the process IDs supplied as input. |
| -class GetProcessInfoFunction : public ChromeAsyncExtensionFunction { |
| +class ProcessesGetProcessInfoFunction : |
| + public UIThreadExtensionFunction, |
| + public task_management::TaskManagerObserver { |
| public: |
| - GetProcessInfoFunction(); |
| + ProcessesGetProcessInfoFunction(); |
| - private: |
| - ~GetProcessInfoFunction() override; |
| - bool RunAsync() override; |
| - |
| - void GatherProcessInfo(); |
| + // UIThreadExtensionFunction: |
| + ExtensionFunction::ResponseAction Run() override; |
| - // Member variables to store the function parameters |
| - std::vector<int> process_ids_; |
| -#if defined(ENABLE_TASK_MANAGER) |
| - bool memory_; |
| -#endif |
| + // task_management::TaskManagerObserver: |
| + void OnTaskAdded(task_management::TaskId id) override {} |
| + void OnTaskToBeRemoved(task_management::TaskId id) override {} |
| + void OnTasksRefreshed(const task_management::TaskIdList& task_ids) override; |
| DECLARE_EXTENSION_FUNCTION("processes.getProcessInfo", |
| - PROCESSES_GETPROCESSINFO) |
| + PROCESSES_GETPROCESSINFO); |
| + |
| + private: |
| + ~ProcessesGetProcessInfoFunction() override; |
| + |
| + std::vector<int> process_host_ids_; |
|
ncarter (slow)
2016/02/08 22:37:09
#include <vector>
afakhry
2016/02/09 04:01:23
Done.
|
| + bool include_memory_ = false; |
| }; |
| } // namespace extensions |