| 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..f6214e7ac890037edae60792eb0b8d719e49faf4 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 DidStartTaskManagerListening();
|
| +
|
| + bool is_task_manager_listening() { return task_manager_listening_; }
|
| + int num_listeners() { return listeners_; }
|
| +
|
| 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:
|
| 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__
|
|
|