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

Unified Diff: content/browser/media/session/media_session_impl.h

Issue 2526533002: Allow MediaSession in iframes to be routed (Closed)
Patch Set: nits Created 4 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/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..a7dc62df32182b9fffa4ccf29516cc110ea6a90f 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"
@@ -35,6 +38,7 @@ namespace content {
class AudioFocusDelegate;
class AudioFocusManagerTest;
+class MediaSessionImplServiceRoutingTest;
class MediaSessionImplStateObserver;
class MediaSessionImplVisibilityBrowserTest;
class MediaSessionObserver;
@@ -84,8 +88,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 +130,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,16 +167,32 @@ 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>;
friend class ::MediaSessionImplBrowserTest;
friend class content::MediaSessionImplVisibilityBrowserTest;
friend class content::AudioFocusManagerTest;
+ friend class content::MediaSessionImplServiceRoutingTest;
friend class content::MediaSessionImplStateObserver;
CONTENT_EXPORT void SetDelegateForTests(
@@ -251,6 +262,18 @@ 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_|.
+ CONTENT_EXPORT MediaSessionServiceImpl* ComputeServiceForRouting();
+
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);
};

Powered by Google App Engine
This is Rietveld 408576698