Index: chrome/browser/chromeos/power/renderer_freezer.h |
diff --git a/chrome/browser/chromeos/power/renderer_freezer.h b/chrome/browser/chromeos/power/renderer_freezer.h |
index d5ac6f9ae01c105cc906faffc7f270e9ada0c39f..78ce9d6f6ea4f60ddb3f657872b94954aaac8643 100644 |
--- a/chrome/browser/chromeos/power/renderer_freezer.h |
+++ b/chrome/browser/chromeos/power/renderer_freezer.h |
@@ -5,14 +5,24 @@ |
#ifndef CHROME_BROWSER_CHROMEOS_POWER_RENDERER_FREEZER_H_ |
#define CHROME_BROWSER_CHROMEOS_POWER_RENDERER_FREEZER_H_ |
+#include <set> |
+ |
#include "base/callback.h" |
#include "base/cancelable_callback.h" |
#include "base/macros.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/memory/weak_ptr.h" |
+#include "base/process/kill.h" |
#include "base/time/time.h" |
#include "chromeos/chromeos_export.h" |
#include "chromeos/dbus/power_manager_client.h" |
+#include "content/public/browser/notification_observer.h" |
+#include "content/public/browser/notification_registrar.h" |
+#include "content/public/browser/render_process_host_observer.h" |
+ |
+namespace content { |
+class RenderProcessHost; |
+} |
namespace chromeos { |
@@ -20,18 +30,26 @@ namespace chromeos { |
// them after the system fully resumes. This class registers itself as a |
// PowerManagerClient::Observer on creation and unregisters itself on |
// destruction. |
-class CHROMEOS_EXPORT RendererFreezer : public PowerManagerClient::Observer { |
+class CHROMEOS_EXPORT RendererFreezer |
+ : public PowerManagerClient::RenderProcessManagerDelegate, |
+ public content::NotificationObserver, |
+ public content::RenderProcessHostObserver { |
public: |
class Delegate { |
public: |
virtual ~Delegate() {} |
- // Freezes the chrome renderers. Returns true if the operation was |
- // successful. |
+ // If |frozen| is true, marks the renderer process |handle| to be frozen |
+ // when FreezeRenderers() is called; otherwise marks it to remain unfrozen. |
+ virtual void SetShouldFreezeRenderer(base::ProcessHandle handle, |
+ bool frozen) = 0; |
+ |
+ // Freezes the renderers marked for freezing by SetShouldFreezeRenderer(). |
+ // Returns true if the operation was successful. |
virtual bool FreezeRenderers() = 0; |
- // Thaws the chrome renderers. Returns true if the operation was |
- // successful. |
+ // Thaws the chrome renderers that were frozen by the call to |
+ // FreezeRenderers(). Returns true if the operation was successful. |
virtual bool ThawRenderers() = 0; |
// Returns true iff the delegate is capable of freezing renderers. |
@@ -39,23 +57,40 @@ class CHROMEOS_EXPORT RendererFreezer : public PowerManagerClient::Observer { |
}; |
explicit RendererFreezer(scoped_ptr<Delegate> delegate); |
- virtual ~RendererFreezer(); |
+ ~RendererFreezer() override; |
- // PowerManagerClient::Observer implementation |
- virtual void SuspendImminent() override; |
- virtual void SuspendDone(const base::TimeDelta& sleep_duration) override; |
+ // PowerManagerClient::RenderProcessManagerDelegate implementation. |
+ void SuspendImminent() override; |
+ void SuspendDone() override; |
- private: |
- // Called when all asynchronous work is complete and renderers can be frozen. |
- void OnReadyToSuspend(const base::Closure& power_manager_callback); |
+ // content::NotificationObserver implementation. |
+ void Observe(int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) override; |
- // Used to ensure that renderers do not get frozen if the suspend is canceled. |
- base::CancelableClosure suspend_readiness_callback_; |
+ // content::RenderProcessHostObserver overrides. |
+ void RenderProcessExited(content::RenderProcessHost* host, |
+ base::TerminationStatus status, |
+ int exit_code) override; |
+ void RenderProcessHostDestroyed(content::RenderProcessHost* host) override; |
+ private: |
+ // Called whenever a new renderer process is created. |
+ void OnRenderProcessCreated(content::RenderProcessHost* rph); |
+ |
+ // Tracks if the renderers are currently frozen. |
bool frozen_; |
+ // Delegate that takes care of actually freezing and thawing renderers for us. |
scoped_ptr<Delegate> delegate_; |
+ // Set that keeps track of the RenderProcessHosts for processes that are |
+ // hosting GCM extensions. |
+ std::set<int> gcm_extension_processes_; |
+ |
+ // Manages notification registrations. |
+ content::NotificationRegistrar registrar_; |
+ |
base::WeakPtrFactory<RendererFreezer> weak_factory_; |
DISALLOW_COPY_AND_ASSIGN(RendererFreezer); |