Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1507)

Unified Diff: content/browser/media/media_web_contents_observer.h

Issue 1478643002: Refactor media out of WebContentsImpl to MediaWebContentsObserver. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove cruft. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
};

Powered by Google App Engine
This is Rietveld 408576698