| 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..d3f7155e645f2142b0964b93e37e30436eb473c6 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 IsBackgroundVideoPlaybackUnlocked() override;
|
| int AddObserver(Observer* observer) override;
|
| - void RemoveObserver(int delegate_id) override;
|
| - void DidPlay(int delegate_id,
|
| + void RemoveObserver(int player_id) override;
|
| + void DidPlay(int player_id,
|
| bool has_video,
|
| bool has_audio,
|
| - bool is_remote,
|
| 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,71 @@ 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();
|
|
|
| - // Setter for |is_playing_background_video_| that updates the metrics.
|
| - void SetIsPlayingBackgroundVideo(bool is_playing);
|
| + // Records UMAs about background playback.
|
| + void RecordBackgroundVideoPlayback();
|
|
|
| + // Runs periodically to notify stale players in |idle_player_map_| which
|
| + // have been idle for longer than |timeout|.
|
| + void CleanUpIdlePlayers(base::TimeDelta timeout);
|
| +
|
| + // True if any media has ever been played in this render frame. Affects
|
| + // autoplay logic in RenderFrameImpl.
|
| 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(). These are cleared each time
|
| + // UpdateTask() runs.
|
| + bool has_played_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
|
|
|