| 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..0a249130eb5c05a48d616d011752ba8d3a2456e0 100644
|
| --- a/content/browser/media/media_web_contents_observer.h
|
| +++ b/content/browser/media/media_web_contents_observer.h
|
| @@ -5,8 +5,13 @@
|
| #ifndef CONTENT_BROWSER_MEDIA_MEDIA_WEB_CONTENTS_OBSERVER_H_
|
| #define CONTENT_BROWSER_MEDIA_MEDIA_WEB_CONTENTS_OBSERVER_H_
|
|
|
| +#include <map>
|
| +#include <set>
|
| +#include <vector>
|
| +
|
| #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"
|
|
|
| @@ -24,40 +29,98 @@ class CONTENT_EXPORT MediaWebContentsObserver : public WebContentsObserver {
|
| explicit MediaWebContentsObserver(WebContents* 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(RenderFrameHost* render_frame_host,
|
| + int64_t player_cookie,
|
| + bool has_video,
|
| + bool has_audio,
|
| + bool is_remote);
|
| + void OnMediaPausedNotification(RenderFrameHost* render_frame_host,
|
| + 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|.
|
| + using PlayerList = std::vector<int64_t>;
|
| + using ActiveMediaPlayerMap = std::map<RenderFrameHost*, PlayerList>;
|
| + void AddMediaPlayerEntry(const MediaPlayerId& id,
|
| + ActiveMediaPlayerMap* player_map);
|
| + // Returns true if an entry is actually removed.
|
| + bool RemoveMediaPlayerEntry(const MediaPlayerId& id,
|
| + ActiveMediaPlayerMap* player_map);
|
| + // Removes all entries from |player_map| for |render_frame_host|. Removed
|
| + // entries are added to |removed_players|.
|
| + void RemoveAllMediaPlayerEntries(RenderFrameHost* render_frame_host,
|
| + ActiveMediaPlayerMap* player_map,
|
| + std::set<MediaPlayerId>* removed_players);
|
| +
|
| +#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_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(MediaWebContentsObserver);
|
| };
|
|
|
|
|