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 a8aa0e144de5ee5e8622d8e9524fcb309e6265ba..64d51c84076e1f8395440a27828744ab8149d213 100644 |
--- a/content/renderer/media/renderer_webmediaplayer_delegate.h |
+++ b/content/renderer/media/renderer_webmediaplayer_delegate.h |
@@ -11,7 +11,9 @@ |
#include "base/id_map.h" |
#include "base/macros.h" |
+#include "base/memory/ref_counted.h" |
#include "base/memory/weak_ptr.h" |
+#include "base/single_thread_task_runner.h" |
#include "base/time/default_tick_clock.h" |
#include "base/timer/timer.h" |
#include "content/common/content_export.h" |
@@ -26,8 +28,8 @@ namespace media { |
enum class MediaContentType; |
-// An interface to allow a WebMediaPlayerImpl to communicate changes of state |
-// to objects that need to know. |
+// Standard implementation of WebMediaPlayerDelegate; communicates state to |
+// the MediaPlayerDelegateHost. |
class CONTENT_EXPORT RendererWebMediaPlayerDelegate |
: public content::RenderFrameObserver, |
public NON_EXPORTED_BASE(WebMediaPlayerDelegate), |
@@ -41,17 +43,21 @@ class CONTENT_EXPORT RendererWebMediaPlayerDelegate |
bool has_played_media() const { return has_played_media_; } |
// WebMediaPlayerDelegate implementation. |
+ bool IsFrameHidden() override; |
+ bool IsFrameClosed() override; |
+ bool IsBackgroundVideoPlaybackAllowed() override; |
int AddObserver(Observer* observer) override; |
- void RemoveObserver(int delegate_id) override; |
- void DidPlay(int delegate_id, |
- bool has_video, |
+ void RemoveObserver(int player_id) override; |
+ void DidPlay(int player_id, |
bool has_audio, |
- bool is_remote, |
+ bool has_video, |
MediaContentType media_content_type) override; |
- void DidPause(int delegate_id, bool reached_end_of_stream) override; |
- void PlayerGone(int delegate_id) override; |
- bool IsHidden() override; |
- bool IsPlayingBackgroundVideo() override; |
+ void DidPause(int player_id) override; |
+ void PlayerGone(int player_id) override; |
+ void SetIdle(int player_id, bool is_idle) override; |
+ bool IsIdle(int player_id) override; |
+ void ClearStaleFlag(int player_id) override; |
+ bool IsStale(int player_id) override; |
// content::RenderFrameObserver overrides. |
void WasHidden() override; |
@@ -65,61 +71,67 @@ class CONTENT_EXPORT RendererWebMediaPlayerDelegate |
void SetIdleCleanupParamsForTesting(base::TimeDelta idle_timeout, |
base::TickClock* tick_clock, |
bool is_low_end_device); |
- bool IsIdleCleanupTimerRunningForTesting() const { |
- return idle_cleanup_timer_.IsRunning(); |
- } |
+ bool IsIdleCleanupTimerRunningForTesting() const; |
+ |
+ // Note: Does not call OnFrameHidden()/OnFrameShown(). |
+ void SetFrameHiddenForTesting(bool is_hidden); |
friend class RendererWebMediaPlayerDelegateTest; |
private: |
- void OnMediaDelegatePause(int delegate_id); |
- void OnMediaDelegatePlay(int delegate_id); |
+ void OnMediaDelegatePause(int player_id); |
+ void OnMediaDelegatePlay(int player_id); |
void OnMediaDelegateSuspendAllMediaPlayers(); |
- void OnMediaDelegateVolumeMultiplierUpdate(int delegate_id, |
- double multiplier); |
+ void OnMediaDelegateVolumeMultiplierUpdate(int player_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); |
+ // Schedules UpdateTask() to run soon. |
+ void ScheduleUpdateTask(); |
- // Runs periodically to suspend idle delegates in |idle_delegate_map_| which |
- // have been idle for longer than |timeout|. |
- void CleanupIdleDelegates(base::TimeDelta timeout); |
+ // Processes state changes, dispatches CleanupIdlePlayers(). |
+ void UpdateTask(); |
+ |
+ // Records UMAs about background playback. |
+ void RecordBackgroundVideoPlayback(); |
- // Setter for |is_playing_background_video_| that updates the metrics. |
- void SetIsPlayingBackgroundVideo(bool is_playing); |
+ // Runs periodically to notify stale players in |idle_player_map_| which |
+ // have been idle for longer than |timeout|. |
+ void CleanUpIdlePlayers(base::TimeDelta timeout); |
bool has_played_media_ = false; |
+ bool background_video_allowed_ = false; |
+ bool is_frame_closed_ = false; |
+ bool is_frame_hidden_for_testing_ = false; |
+ |
+ // State related to scheduling UpdateTask(). |
+ bool did_play_video_ = false; |
+ bool pending_update_task_ = 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::Timer idle_cleanup_timer_; |
+ // Tracks which players have entered an idle state. After some period of |
+ // inactivity these players will be notified and become stale. |
+ std::map<int, base::TimeTicks> idle_player_map_; |
+ std::set<int> stale_players_; |
+ base::OneShotTimer idle_cleanup_timer_; |
- // Amount of time allowed to elapse after a delegate enters the paused before |
- // the delegate is suspended. |
+ // Amount of time allowed to elapse after a player becomes idle before |
+ // it can transition to stale. |
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. |
+ // The polling interval used for checking the players to see if any have |
+ // exceeded |idle_timeout_| since becoming idle. |
base::TimeDelta idle_cleanup_interval_; |
- // Clock used for calculating when delegates have expired. May be overridden |
- // for testing. |
+ // Clock used for calculating when players have become stale. May be |
+ // overridden for testing. |
std::unique_ptr<base::DefaultTickClock> default_tick_clock_; |
base::TickClock* tick_clock_; |
- // If a video is playing in the background. Set when user resumes a video |
- // allowing it to play and reset when either user pauses it or it goes |
- // foreground. |
- bool is_playing_background_video_ = false; |
- |
#if defined(OS_ANDROID) |
+ bool was_playing_background_video_ = false; |
+ |
// Keeps track of when the background video playback started for metrics. |
- base::TimeTicks background_video_playing_start_time_; |
+ base::TimeTicks background_video_start_time_; |
#endif // OS_ANDROID |
// The currently playing local videos. Used to determine whether |