Chromium Code Reviews| Index: content/browser/media/media_web_contents_observer.h |
| diff --git a/content/browser/media/media_web_contents_observer.h b/content/browser/media/media_web_contents_observer.h |
| index 382dcdf772f63b00749b65918d4d87bcd3098028..fdba88394cb5b0246775fbc702a474514bd81cac 100644 |
| --- a/content/browser/media/media_web_contents_observer.h |
| +++ b/content/browser/media/media_web_contents_observer.h |
| @@ -7,6 +7,7 @@ |
| #include "base/compiler_specific.h" |
| #include "base/containers/scoped_ptr_hash_map.h" |
| +#include "content/browser/power_save_blocker_impl.h" |
| #include "content/common/content_export.h" |
| #include "content/public/browser/web_contents_observer.h" |
| @@ -21,43 +22,104 @@ class BrowserMediaPlayerManager; |
| // for sending IPCs back to the RenderFrameObservers at the render side. |
| class CONTENT_EXPORT MediaWebContentsObserver : public WebContentsObserver { |
| public: |
| - explicit MediaWebContentsObserver(WebContents* web_contents); |
| + explicit MediaWebContentsObserver(WebContentsImpl* web_contents); |
| ~MediaWebContentsObserver() override; |
| - // WebContentsObserver implementations. |
| - void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; |
| + // Called when the audible state has changed. If inaudible any audio power |
| + // save blockers are released. |
| + void MaybeUpdateAudibleState(bool recently_audible); |
| -#if defined(OS_ANDROID) |
| + // WebContentsObserver implementation. |
| + void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; |
| bool OnMessageReceived(const IPC::Message& message, |
| RenderFrameHost* render_frame_host) override; |
| + void WasShown() override; |
| + void WasHidden() override; |
| - // Helper functions to handle media player IPC messages. Returns whether the |
| - // |message| is handled in the function. |
| - bool OnMediaPlayerMessageReceived(const IPC::Message& message, |
| - RenderFrameHost* render_frame_host); |
| - bool OnMediaPlayerSetCdmMessageReceived(const IPC::Message& message, |
| - RenderFrameHost* render_frame_host); |
| - |
| +#if defined(OS_ANDROID) |
| // Gets the media player manager associated with |render_frame_host|. Creates |
| // a new one if it doesn't exist. The caller doesn't own the returned pointer. |
| BrowserMediaPlayerManager* GetMediaPlayerManager( |
| RenderFrameHost* render_frame_host); |
| - void OnSetCdm(RenderFrameHost* render_frame_host, int player_id, int cdm_id); |
| - |
| #if defined(VIDEO_HOLE) |
| void OnFrameInfoUpdated(); |
| #endif // defined(VIDEO_HOLE) |
| +#endif // defined(OS_ANDROID) |
| + |
| + bool has_audio_power_save_blocker_for_testing() const { |
| + return audio_power_save_blocker_; |
| + } |
| + |
| + bool has_video_power_save_blocker_for_testing() const { |
| + return video_power_save_blocker_; |
| + } |
| private: |
| + bool OnMediaPlayerDelegateMessageReceived(const IPC::Message& message, |
| + RenderFrameHost* render_frame_host); |
| + |
| + void OnMediaPlayingNotification(int64_t player_cookie, |
| + bool has_video, |
| + bool has_audio, |
| + bool is_remote); |
| + void OnMediaPausedNotification(int64_t player_cookie); |
| + |
| + // Clear |render_frame_host|'s tracking entry for its power save blockers. |
| + void ClearPowerSaveBlockers(RenderFrameHost* render_frame_host); |
| + |
| + // Creates an audio or video power save blocker respectively. |
| + void CreateAudioPowerSaveBlocker(); |
| + void CreateVideoPowerSaveBlocker(); |
| + |
| + // Releases the audio power save blockers if |active_audio_players_| is empty. |
| + // Likewise, releases the video power save blockers if |active_video_players_| |
| + // is empty. |
| + void MaybeReleasePowerSaveBlockers(); |
| + |
| + // Helper methods for adding or removing player entries in |player_map| under |
| + // the key |render_frame_message_source_|. |
| + using PlayerList = std::vector<int64_t>; |
| + using ActiveMediaPlayerMap = std::map<RenderFrameHost*, PlayerList>; |
| + void AddMediaPlayerEntry(int64_t player_cookie, |
| + ActiveMediaPlayerMap* player_map); |
| + void RemoveMediaPlayerEntry(int64_t player_cookie, |
| + ActiveMediaPlayerMap* player_map); |
| + // Removes all entries from |player_map| for |render_frame_host|. |
| + void RemoveAllMediaPlayerEntries(RenderFrameHost* render_frame_host, |
| + ActiveMediaPlayerMap* player_map); |
| + |
| +#if defined(OS_ANDROID) |
| + // Helper functions to handle media player IPC messages. Returns whether the |
| + // |message| is handled in the function. |
| + bool OnMediaPlayerMessageReceived(const IPC::Message& message, |
| + RenderFrameHost* render_frame_host); |
| + |
| + bool OnMediaPlayerSetCdmMessageReceived(const IPC::Message& message, |
| + RenderFrameHost* render_frame_host); |
| + |
| + void OnSetCdm(RenderFrameHost* render_frame_host, int player_id, int cdm_id); |
| + |
| // Map from RenderFrameHost* to BrowserMediaPlayerManager. |
| - typedef base::ScopedPtrHashMap<uintptr_t, |
| - scoped_ptr<BrowserMediaPlayerManager>> |
| - MediaPlayerManagerMap; |
| + using MediaPlayerManagerMap = |
| + base::ScopedPtrHashMap<RenderFrameHost*, |
| + scoped_ptr<BrowserMediaPlayerManager>>; |
| MediaPlayerManagerMap media_player_managers_; |
| #endif // defined(OS_ANDROID) |
| - private: |
| + // Tracking variables and associated power save blockers for media playback. |
| + ActiveMediaPlayerMap active_audio_players_; |
| + ActiveMediaPlayerMap active_video_players_; |
| + scoped_ptr<PowerSaveBlocker> audio_power_save_blocker_; |
| + scoped_ptr<PowerSaveBlocker> video_power_save_blocker_; |
| + |
| + WebContentsImpl* web_contents_; |
|
ncarter (slow)
2015/12/02 17:49:31
WCO implementations typically don't need to cache
DaleCurtis
2015/12/02 19:55:46
This is necessary because MediaStartedPlaying/Medi
qinmin
2015/12/02 21:54:58
we can do a cast to WCI when MediaStartedPlaying/M
DaleCurtis
2015/12/03 01:35:08
I forget if that's allowed here or if there are fa
qinmin
2015/12/03 15:46:31
see example here: https://code.google.com/p/chromi
DaleCurtis
2015/12/04 01:36:27
Thanks! Done.
ncarter (slow)
2015/12/05 00:43:33
To confirm: inside of the content/ implementation,
|
| + |
| + // Used during IPC message dispatching from the RenderFrame so that the |
| + // handlers can get a pointer to the RVH through which the message was |
| + // received. |
| + RenderFrameHost* render_frame_message_source_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(MediaWebContentsObserver); |
| }; |