| 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..c16fbbe8fe1360cbb5178c29c581492b75ee5d65 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,20 @@ 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);
|
| + // Compute the MediaSessionService that should be routed, which will be used
|
| + // to update |routed_service_|.
|
| + MediaSessionServiceImpl* ComputeServiceForRouting();
|
| + void ComputeServiceForRoutingInternal(
|
| + MediaSessionPlayerObserver* player_observer,
|
| + MediaSessionServiceImpl** best_service,
|
| + size_t* min_depth);
|
| +
|
| std::unique_ptr<AudioFocusDelegate> delegate_;
|
| PlayersMap normal_players_;
|
| PlayersMap pepper_players_;
|
| @@ -267,7 +290,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 +298,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);
|
| };
|
|
|