Index: content/renderer/media/renderer_webmediaplayer_delegate.h |
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.h b/content/renderer/media/renderer_webmediaplayer_delegate.h |
index 54a5bc9913fc3815f0a1a23a976e8869b36d6b0a..2ca3d46c7652466b38b379177c0d604b31f09e93 100644 |
--- a/content/renderer/media/renderer_webmediaplayer_delegate.h |
+++ b/content/renderer/media/renderer_webmediaplayer_delegate.h |
@@ -5,9 +5,14 @@ |
#ifndef CONTENT_RENDERER_MEDIA_RENDERER_WEBMEDIAPLAYER_DELEGATE_H_ |
#define CONTENT_RENDERER_MEDIA_RENDERER_WEBMEDIAPLAYER_DELEGATE_H_ |
+#include <map> |
+ |
#include "base/id_map.h" |
#include "base/macros.h" |
#include "base/memory/weak_ptr.h" |
+#include "base/time/default_tick_clock.h" |
+#include "base/timer/timer.h" |
+#include "content/common/content_export.h" |
#include "content/public/renderer/render_frame_observer.h" |
#include "media/blink/webmediaplayer_delegate.h" |
@@ -19,10 +24,11 @@ namespace media { |
// An interface to allow a WebMediaPlayerImpl to communicate changes of state |
// to objects that need to know. |
-class RendererWebMediaPlayerDelegate |
+class CONTENT_EXPORT RendererWebMediaPlayerDelegate |
: public content::RenderFrameObserver, |
- public WebMediaPlayerDelegate, |
- public base::SupportsWeakPtr<RendererWebMediaPlayerDelegate> { |
+ public NON_EXPORTED_BASE(WebMediaPlayerDelegate), |
+ public NON_EXPORTED_BASE( |
+ base::SupportsWeakPtr<RendererWebMediaPlayerDelegate>) { |
public: |
explicit RendererWebMediaPlayerDelegate(content::RenderFrame* render_frame); |
~RendererWebMediaPlayerDelegate() override; |
@@ -47,6 +53,15 @@ class RendererWebMediaPlayerDelegate |
void WasShown() override; |
bool OnMessageReceived(const IPC::Message& msg) override; |
+ // Sets |idle_cleanup_enabled_| to true, zeros out |idle_cleanup_interval_|, |
+ // and sets |idle_timeout_| to |idle_timeout|. A zero cleanup interval will |
+ // cause the idle timer to run with each run of the message loop. |
+ void EnableInstantIdleCleanupForTesting(base::TimeDelta idle_timeout, |
+ base::TickClock* tick_clock); |
+ bool IsIdleCleanupTimerRunningForTesting() const { |
+ return idle_cleanup_timer_.IsRunning(); |
+ } |
+ |
private: |
void OnMediaDelegatePause(int delegate_id); |
void OnMediaDelegatePlay(int delegate_id); |
@@ -54,9 +69,40 @@ class RendererWebMediaPlayerDelegate |
void OnMediaDelegateVolumeMultiplierUpdate(int delegate_id, |
double multiplier); |
+ // Adds or removes a delegate from |idle_delegate_map_|. The first insertion |
+ // or last removal will start or stop |idle_cleanup_timer_| respectively. |
+ void AddIdleDelegate(int delegate_id); |
+ void RemoveIdleDelegate(int delegate_id); |
+ |
+ // Runs periodically to suspend idle delegates in |idle_delegate_map_|. |
+ void CleanupIdleDelegates(); |
+ |
bool has_played_media_ = false; |
IDMap<Observer> id_map_; |
+ // Tracks which delegates have entered an idle state. After some period of |
+ // inactivity these players will be suspended to release unused resources. |
+ bool idle_cleanup_running_ = false; |
+ std::map<int, base::TimeTicks> idle_delegate_map_; |
+ base::RepeatingTimer idle_cleanup_timer_; |
+ |
+ // Controls whether cleanup of idle delegates is enabled or not as well as the |
+ // polling interval and timeout period for delegates; overridden for testing. |
+ bool idle_cleanup_enabled_ = false; |
+ |
+ // Amount of time allowed to elapse after a delegate enters the paused before |
+ // the delegate is suspended. |
+ base::TimeDelta idle_timeout_; |
+ |
+ // The polling interval used for checking the delegates to see if any have |
+ // exceeded |idle_timeout_| since their last pause state. |
+ base::TimeDelta idle_cleanup_interval_; |
+ |
+ // Clock used for calculating when delegates have expired. May be overridden |
+ // for testing. |
+ scoped_ptr<base::DefaultTickClock> default_tick_clock_; |
+ base::TickClock* tick_clock_; |
+ |
DISALLOW_COPY_AND_ASSIGN(RendererWebMediaPlayerDelegate); |
}; |