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

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

Issue 2526533002: Allow MediaSession in iframes to be routed (Closed)
Patch Set: Created 4 years, 1 month 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.cc
diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc
index 1b5e706c47a32b0167e2306d9c7b7dc3cd5b1a41..da00fe3e82645ccb08d659a17907361c540813cc 100644
--- a/content/browser/media/session/media_session_impl.cc
+++ b/content/browser/media/session/media_session_impl.cc
@@ -8,6 +8,7 @@
#include "content/browser/media/session/audio_focus_delegate.h"
#include "content/browser/media/session/media_session_player_observer.h"
#include "content/browser/media/session/media_session_service_impl.h"
+#include "content/browser/media/session/media_session_service_router.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/public/browser/media_session.h"
#include "content/public/browser/media_session_observer.h"
@@ -89,9 +90,19 @@ void MediaSessionImpl::WebContentsDestroyed() {
AbandonSystemAudioFocusIfNeeded();
}
-void MediaSessionImpl::SetMediaSessionService(
- MediaSessionServiceImpl* service) {
- service_ = service;
+MediaSessionPlayerObserver*
+MediaSessionImpl::GetMostMeaningfulPlayerObserver() {
+ MediaSessionPlayerObserver* player_observer = nullptr;
+ // TODO(zqzhang): improve the selection of most-meaningful player. See
+ // https://crbug.com/xxxxxx
+ if (!normal_players_.empty())
+ return player_observer = normal_players_.begin()->observer;
+ if (!one_shot_players_.empty())
+ return player_observer = one_shot_players_.begin()->observer;
+ if (!pepper_players_.empty())
+ return player_observer = pepper_players_.begin()->observer;
+
+ return nullptr;
}
void MediaSessionImpl::AddObserver(MediaSessionObserver* observer) {
@@ -102,13 +113,18 @@ void MediaSessionImpl::RemoveObserver(MediaSessionObserver* observer) {
observers_.RemoveObserver(observer);
}
-void MediaSessionImpl::SetMetadata(
+void MediaSessionImpl::NotifyMediaSessionMetadataChange(
const base::Optional<MediaMetadata>& metadata) {
- metadata_ = metadata;
for (auto& observer : observers_)
observer.MediaSessionMetadataChanged(metadata);
}
+void MediaSessionImpl::NotifyMediaSessionActionsChange(
+ const std::set<blink::mojom::MediaSessionAction>& actions) {
+ for (auto& observer : observers_)
+ observer.MediaSessionActionsChanged(actions);
+}
+
bool MediaSessionImpl::AddPlayer(MediaSessionPlayerObserver* observer,
int player_id,
media::MediaContentType media_content_type) {
@@ -150,8 +166,9 @@ bool MediaSessionImpl::AddPlayer(MediaSessionPlayerObserver* observer,
normal_players_.clear();
normal_players_.insert(PlayerIdentifier(observer, player_id));
- NotifyAboutStateChange();
+ service_router_->MostMeaningfulPlayerObserverMayHaveChanged();
+ NotifyAboutStateChange();
return true;
}
@@ -174,6 +191,7 @@ void MediaSessionImpl::RemovePlayer(MediaSessionPlayerObserver* observer,
one_shot_players_.erase(it);
AbandonSystemAudioFocusIfNeeded();
+ service_router_->MostMeaningfulPlayerObserverMayHaveChanged();
// The session may become controllable after removing a one-shot player.
// However AbandonSystemAudioFocusIfNeeded will short-return and won't notify
@@ -207,6 +225,7 @@ void MediaSessionImpl::RemovePlayers(MediaSessionPlayerObserver* observer) {
}
AbandonSystemAudioFocusIfNeeded();
+ service_router_->MostMeaningfulPlayerObserverMayHaveChanged();
// The session may become controllable after removing a one-shot player.
// However AbandonSystemAudioFocusIfNeeded will short-return and won't notify
@@ -301,20 +320,13 @@ void MediaSessionImpl::Stop(SuspendType suspend_type) {
void MediaSessionImpl::DidReceiveAction(
blink::mojom::MediaSessionAction action) {
- if (service_)
- service_->GetClient()->DidReceiveAction(action);
-}
-
-void MediaSessionImpl::OnMediaSessionEnabledAction(
- blink::mojom::MediaSessionAction action) {
- for (auto& observer : observers_)
- observer.MediaSessionEnabledAction(action);
+ GetMediaSessionServiceRouter()->DidReceiveAction(action);
}
-void MediaSessionImpl::OnMediaSessionDisabledAction(
- blink::mojom::MediaSessionAction action) {
+void MediaSessionImpl::OnMediaSessionActionsChanged(
+ const std::set<blink::mojom::MediaSessionAction>& action) {
for (auto& observer : observers_)
- observer.MediaSessionDisabledAction(action);
+ observer.MediaSessionActionsChanged(action);
}
void MediaSessionImpl::StartDucking() {
@@ -470,7 +482,7 @@ MediaSessionImpl::MediaSessionImpl(WebContents* web_contents)
audio_focus_type_(
AudioFocusManager::AudioFocusType::GainTransientMayDuck),
is_ducking_(false),
- service_(nullptr) {
+ service_router_(new MediaSessionServiceRouter(this)) {
#if defined(OS_ANDROID)
session_android_.reset(new MediaSessionAndroid(this));
#endif // defined(OS_ANDROID)

Powered by Google App Engine
This is Rietveld 408576698