// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_POWER_RENDERER_FREEZER_H_ #define CHROME_BROWSER_CHROMEOS_POWER_RENDERER_FREEZER_H_ #include #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 { class ScreenLocker; // Freezes the chrome renderers when the system is about to suspend and thaws // 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::RenderProcessManagerDelegate, public content::NotificationObserver, public content::RenderProcessHostObserver { public: class Delegate { public: typedef base::Callback ResultCallback; virtual ~Delegate() {} // If |frozen| is true, marks the renderer process |handle| to be frozen // when FreezeRenderers() is called; otherwise marks it to remain unfrozen. // Performs the operation asynchronously on the FILE thread. virtual void SetShouldFreezeRenderer(base::ProcessHandle handle, bool frozen) = 0; // Freezes the renderers marked for freezing by SetShouldFreezeRenderer(). // Performs the operation asynchronously on the FILE thread. virtual void FreezeRenderers() = 0; // Thaws the chrome renderers that were frozen by the call to // FreezeRenderers(). Performs the operation asynchronously on the FILE // thread and runs |callback| with the result on the UI thread. virtual void ThawRenderers(ResultCallback callback) = 0; // Asynchronously checks on the FILE thread if the delegate can freeze // renderers and runs |callback| on the UI thread with the result. virtual void CheckCanFreezeRenderers(ResultCallback callback) = 0; }; explicit RendererFreezer(scoped_ptr delegate); ~RendererFreezer() override; // PowerManagerClient::RenderProcessManagerDelegate implementation. void SuspendImminent() override; void SuspendDone() override; // content::NotificationObserver implementation. void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) override; // content::RenderProcessHostObserver overrides. void RenderProcessExited(content::RenderProcessHost* host, base::TerminationStatus status, int exit_code) override; void RenderProcessHostDestroyed(content::RenderProcessHost* host) override; private: // Called after checking if the delegate is capable of freezing renderers. void OnCheckCanFreezeRenderersComplete(bool can_freeze); // Called after thawing the renderers has completed. void OnThawRenderersComplete(bool success); // Called whenever the screen locker is shown or hidden. void OnScreenLockStateChanged(chromeos::ScreenLocker* locker, bool is_locked); // Called whenever a new renderer process is created. void OnRenderProcessCreated(content::RenderProcessHost* rph); // Delegate that takes care of actually freezing and thawing renderers for us. scoped_ptr delegate_; // Set that keeps track of the RenderProcessHosts for processes that are // hosting GCM extensions. std::set gcm_extension_processes_; // Manages notification registrations. content::NotificationRegistrar registrar_; base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(RendererFreezer); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_POWER_RENDERER_FREEZER_H_