Chromium Code Reviews| Index: chrome/browser/extensions/extension_processes_api.h |
| diff --git a/chrome/browser/extensions/extension_processes_api.h b/chrome/browser/extensions/extension_processes_api.h |
| index c77099e359cc92b7e277578501448d91d15cd33d..3345f3cbbf26dff64a7cd9525c0b207278f990d0 100644 |
| --- a/chrome/browser/extensions/extension_processes_api.h |
| +++ b/chrome/browser/extensions/extension_processes_api.h |
| @@ -12,10 +12,13 @@ |
| #include "chrome/browser/extensions/extension_function.h" |
| #include "chrome/browser/task_manager/task_manager.h" |
| #include "content/public/browser/notification_registrar.h" |
| +#include "content/public/browser/render_process_host.h" |
| +#include "content/public/browser/render_widget_host.h" |
| // Observes the Task Manager and routes the notifications as events to the |
| // extension system. |
| -class ExtensionProcessesEventRouter : public TaskManagerModelObserver { |
| +class ExtensionProcessesEventRouter : public TaskManagerModelObserver, |
| + public content::NotificationObserver { |
| public: |
| // Single instance of the event router. |
| static ExtensionProcessesEventRouter* GetInstance(); |
| @@ -29,22 +32,48 @@ class ExtensionProcessesEventRouter : 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. |
| + bool StartTaskManagerListening(); |
|
Charlie Reis
2012/04/27 22:01:56
Let's try to make the return value a little more o
nasko
2012/04/30 18:05:19
Done.
|
| + |
| + bool task_manager_listening(); |
|
Charlie Reis
2012/04/27 22:01:56
is_task_manager_listening()
nasko
2012/04/30 18:05:19
Done.
|
| + int listeners(); |
|
Charlie Reis
2012/04/27 22:01:56
num_listeners(). These can be implemented inline
nasko
2012/04/30 18:05:19
Done.
|
| + |
| private: |
| friend struct DefaultSingletonTraits<ExtensionProcessesEventRouter>; |
| ExtensionProcessesEventRouter(); |
| virtual ~ExtensionProcessesEventRouter(); |
| + // content::NotificationObserver implementation. |
| + virtual void Observe(int type, |
| + const content::NotificationSource& source, |
| + const content::NotificationDetails& details) OVERRIDE; |
| + |
| // TaskManagerModelObserver methods. |
| + virtual void OnItemsAdded(int start, int length) OVERRIDE; |
| virtual void OnModelChanged() OVERRIDE {} |
| virtual void OnItemsChanged(int start, int length) OVERRIDE; |
| - virtual void OnItemsAdded(int start, int length) OVERRIDE {} |
| virtual void OnItemsRemoved(int start, int length) OVERRIDE {} |
| + virtual 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); |
| + |
| + void NotifyProfiles(const char* event_name, std::string json_args); |
| void DispatchEvent(Profile* profile, |
| const char* event_name, |
| const std::string& json_args); |
| + // 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(std::string& event_name); |
| + |
| // Used for tracking registrations to process related notifications. |
| content::NotificationRegistrar registrar_; |
| @@ -55,16 +84,91 @@ class ExtensionProcessesEventRouter : public TaskManagerModelObserver { |
| // 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(ExtensionProcessesEventRouter); |
| }; |
| // This extension function returns the Process object for the renderer process |
| // currently in use by the specified Tab. |
| -class GetProcessIdForTabFunction : public SyncExtensionFunction { |
| +class GetProcessIdForTabFunction : public AsyncExtensionFunction, |
| + public content::NotificationObserver { |
| + private: |
|
Charlie Reis
2012/04/27 22:01:56
Do these need explicit public constructors? I hav
nasko
2012/04/30 18:05:19
I've used the tabs extension as a model and they h
|
| virtual ~GetProcessIdForTabFunction() {} |
| virtual bool RunImpl() OVERRIDE; |
| + |
| + // content::NotificationObserver implementation. |
| + virtual void Observe(int type, |
| + const content::NotificationSource& source, |
| + const content::NotificationDetails& details) OVERRIDE; |
| + |
| + void GetProcessIdForTab(); |
| + |
| + content::NotificationRegistrar registrar_; |
| + |
| + // Storage for the tab ID parameter. |
| + int tab_id_; |
| + |
| DECLARE_EXTENSION_FUNCTION_NAME("experimental.processes.getProcessIdForTab") |
| }; |
| +// 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 AsyncExtensionFunction, |
| + public content::NotificationObserver { |
| + private: |
| + virtual ~TerminateFunction() {} |
| + virtual bool RunImpl() OVERRIDE; |
| + |
| + // content::NotificationObserver implementation. |
| + virtual void Observe(int type, |
| + const content::NotificationSource& source, |
| + const content::NotificationDetails& details) OVERRIDE; |
| + |
| + void TerminateProcess(); |
| + |
| + content::NotificationRegistrar registrar_; |
| + |
| + // Storage for the process ID parameter. |
| + int process_id_; |
| + |
| + DECLARE_EXTENSION_FUNCTION_NAME("experimental.processes.terminate") |
| +}; |
| + |
| +// Extension function which returns a set of Process objects, containing the |
| +// details corresponding to the process IDs supplied as input. |
| +class GetProcessInfoFunction : public AsyncExtensionFunction, |
| + public content::NotificationObserver { |
| + public: |
| + GetProcessInfoFunction(); |
| + |
| + private: |
| + virtual ~GetProcessInfoFunction(); |
| + virtual bool RunImpl() OVERRIDE; |
| + |
| + // content::NotificationObserver implementation. |
| + virtual void Observe(int type, |
| + const content::NotificationSource& source, |
| + const content::NotificationDetails& details) OVERRIDE; |
| + |
| + void GatherProcessInfo(); |
| + |
| + content::NotificationRegistrar registrar_; |
| + |
| + // Member variables to store the function parameters |
| + std::vector<int> process_ids_; |
| + bool memory_; |
| + |
| + DECLARE_EXTENSION_FUNCTION_NAME("experimental.processes.getProcessInfo") |
| +}; |
| + |
| #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_PROCESSES_API_H__ |