Chromium Code Reviews| Index: content/browser/media/session/media_session_impl.h |
| diff --git a/content/browser/media/session/media_session_impl.h b/content/browser/media/session/media_session_impl.h |
| index 1f1a0fc85d172fd45655d48251e7ee86ac05bae3..51a77a39a5590edebae5ccf13b56ab133548cef0 100644 |
| --- a/content/browser/media/session/media_session_impl.h |
| +++ b/content/browser/media/session/media_session_impl.h |
| @@ -7,6 +7,9 @@ |
| #include <stddef.h> |
| +#include <map> |
| +#include <set> |
| + |
| #include "base/callback_list.h" |
| #include "base/id_map.h" |
| #include "base/macros.h" |
| @@ -84,8 +87,10 @@ class MediaSessionImpl : public MediaSession, |
| void AddObserver(MediaSessionObserver* observer); |
| void RemoveObserver(MediaSessionObserver* observer); |
| - void SetMetadata(const base::Optional<MediaMetadata>& metadata); |
| - const base::Optional<MediaMetadata>& metadata() const { return metadata_; } |
| + void NotifyMediaSessionMetadataChange( |
| + const base::Optional<MediaMetadata>& metadata); |
| + void NotifyMediaSessionActionsChange( |
| + const std::set<blink::mojom::MediaSessionAction>& actions); |
| // Adds the given player to the current media session. Returns whether the |
| // player was successfully added. If it returns false, AddPlayer() should be |
| @@ -124,17 +129,6 @@ class MediaSessionImpl : public MediaSession, |
| // |type| represents the origin of the request. |
| CONTENT_EXPORT void Stop(MediaSession::SuspendType suspend_type) override; |
| - // Received a media session action and forward to blink::MediaSession. |
| - void DidReceiveAction(blink::mojom::MediaSessionAction action) override; |
| - |
| - // Called when an action is enabled in blink::MediaSession. This method will |
| - // notify the observers that the action is enabled. |
| - void OnMediaSessionEnabledAction(blink::mojom::MediaSessionAction action); |
| - |
| - // Called when an action is disabled in blink::MediaSession. This method will |
| - // notify the observers that the action is disabled. |
| - void OnMediaSessionDisabledAction(blink::mojom::MediaSessionAction action); |
| - |
| // Let the media session start ducking such that the volume multiplier is |
| // reduced. |
| CONTENT_EXPORT void StartDucking(); |
| @@ -172,10 +166,25 @@ class MediaSessionImpl : public MediaSession, |
| // WebContentsObserver implementation |
| void WebContentsDestroyed() override; |
| - // Sets the associated MediaSessionService for communicating with |
| - // blink::MediaSession. |
| - MediaSessionServiceImpl* GetMediaSessionService() { return service_; } |
| - void SetMediaSessionService(MediaSessionServiceImpl* service); |
| + // MediaSessionService-related methods |
| + |
| + // Called when a MediaSessionService is created, which registers itself to |
| + // this session. |
| + void OnServiceCreated(MediaSessionServiceImpl* service); |
| + // Called when a MediaSessionService is destroyed, which unregisters itself |
| + // from this session. |
| + void OnServiceDestroyed(MediaSessionServiceImpl* service); |
| + |
| + // Called when the metadata of a MediaSessionService has changed. Will notify |
| + // observers if the service is currently routed. |
| + void OnMediaSessionMetadataChanged(MediaSessionServiceImpl* service); |
| + // Called when the actions of a MediaSessionService has changed. Will notify |
| + // observers if the service is currently routed. |
| + void OnMediaSessionActionsChanged(MediaSessionServiceImpl* service); |
| + |
| + // Called when a MediaSessionAction is received. The action will be forwarded |
| + // to blink::MediaSession corresponding to the current routed service. |
| + void DidReceiveAction(blink::mojom::MediaSessionAction action) override; |
| private: |
| friend class content::WebContentsUserData<MediaSessionImpl>; |
| @@ -251,6 +260,16 @@ class MediaSessionImpl : public MediaSession, |
| CONTENT_EXPORT bool AddOneShotPlayer(MediaSessionPlayerObserver* observer, |
| int player_id); |
| + // MediaSessionService-related methods |
| + |
| + // Called when the routed service may have changed. |
| + void UpdateRoutedService(); |
| + // Returns whether the frame |rfh| uses MediaSession API. |
| + bool IsServiceActiveForRenderFrameHost(RenderFrameHost* rfh); |
| + // Returns the most-meaningful audio producing frame for deciding which |
| + // MediaSessionService should be routed. |
| + RenderFrameHost* GetMostMeaningfulAudioProducingFrame(); |
|
whywhat
2016/11/28 19:59:14
nit: most-meaningful doesn't tell much to the read
Zhiqiang Zhang (Slow)
2016/11/30 16:40:59
Done.
|
| + |
| std::unique_ptr<AudioFocusDelegate> delegate_; |
| PlayersMap normal_players_; |
| PlayersMap pepper_players_; |
| @@ -267,7 +286,6 @@ class MediaSessionImpl : public MediaSession, |
| // StopDucking(). |
| bool is_ducking_; |
| - base::Optional<MediaMetadata> metadata_; |
| base::CallbackList<void(State)> media_session_state_listeners_; |
| base::ObserverList<MediaSessionObserver> observers_; |
| @@ -276,9 +294,15 @@ class MediaSessionImpl : public MediaSession, |
| std::unique_ptr<MediaSessionAndroid> session_android_; |
| #endif // defined(OS_ANDROID) |
| - // The MediaSessionService this session is associated with (the service of the |
| - // top-level frame). |
| - MediaSessionServiceImpl* service_; |
| + // MediaSessionService-related fields |
| + using ServicesMap = std::map<RenderFrameHost*, MediaSessionServiceImpl*>; |
| + |
| + // The collection of all managed services (non-owned pointers). The services |
| + // are owned by RenderFrameHost and should be registered on creation and |
| + // unregistered on destroy. |
| + ServicesMap services_; |
| + // The currently routed service (non-owned pointer). |
| + MediaSessionServiceImpl* routed_service_; |
| DISALLOW_COPY_AND_ASSIGN(MediaSessionImpl); |
| }; |