Chromium Code Reviews| Index: content/browser/media/session/media_session_service_router.cc |
| diff --git a/content/browser/media/session/media_session_service_router.cc b/content/browser/media/session/media_session_service_router.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..898de9151f64f6bbd3314e11f2cfc77826ee4a29 |
| --- /dev/null |
| +++ b/content/browser/media/session/media_session_service_router.cc |
| @@ -0,0 +1,96 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/media/session/media_session_service_router.h" |
| + |
| +#include "content/browser/media/session/media_session_controller.h" |
| +#include "content/browser/media/session/media_session_impl.h" |
| +#include "content/browser/media/session/media_session_service_impl.h" |
| + |
| +namespace content { |
| + |
| +MediaSessionServiceRouter::MediaSessionServiceRouter(MediaSessionImpl* session) |
| + : routed_service_(nullptr), session_(session) {} |
| + |
| +MediaSessionServiceRouter::~MediaSessionServiceRouter() {} |
| + |
| +void MediaSessionServiceRouter::OnServiceCreated( |
| + MediaSessionServiceImpl* service) { |
| + services_[service->GetRenderFrameHost()] = service; |
| +} |
| + |
| +void MediaSessionServiceRouter::OnServiceDestroyed( |
| + MediaSessionServiceImpl* service) { |
| + services_.erase(service->GetRenderFrameHost()); |
| +} |
| + |
| +void MediaSessionServiceRouter::OnMediaSessionMetadataChanged( |
| + MediaSessionServiceImpl* service) { |
| + if (service != routed_service_) |
| + return; |
| + |
| + session_->NotifyMediaSessionMetadataChange(routed_service_->metadata()); |
| +} |
| + |
| +void MediaSessionServiceRouter::OnMediaSessionActionsChanged( |
| + MediaSessionServiceImpl* service) { |
| + if (service != routed_service_) |
| + return; |
| + |
| + session_->NotifyMediaSessionActionsChange(routed_service_->actions()); |
| +} |
| + |
| +void MediaSessionServiceRouter::DidReceiveAction( |
| + blink::mojom::MediaSessionAction action) { |
| + if (routed_service_) |
|
whywhat
2016/11/22 23:13:16
nit: s/routed_service_/!routed_service_
Zhiqiang Zhang (Slow)
2016/11/25 14:50:41
Done.
|
| + return; |
| + |
| + routed_service_->GetClient()->DidReceiveAction(action); |
| +} |
| + |
| +void MediaSessionServiceRouter::MostMeaningfulPlayerObserverMayHaveChanged() { |
| + RenderFrameHost* rfh = session_->web_contents()->GetMainFrame(); |
| + // Prefer top-level session. |
| + if (IsServiceActiveForRenderFrameHost(rfh)) { |
| + UpdateRoutedService(services_[rfh]); |
| + return; |
| + } |
| + |
| + // If not, select the most meaningful audio-producing frame. |
| + MediaSessionController* controller = static_cast<MediaSessionController*>( |
| + session_->GetMostMeaningfulPlayerObserver()); |
| + if (!controller || |
| + !IsServiceActiveForRenderFrameHost(controller->id().first)) { |
| + UpdateRoutedService(nullptr); |
| + return; |
| + } |
| + UpdateRoutedService(services_[controller->id().first]); |
| +} |
| + |
| +bool MediaSessionServiceRouter::IsServiceActiveForRenderFrameHost( |
| + RenderFrameHost* rfh) { |
| + if (!services_.count(rfh)) |
| + return false; |
| + |
| + return services_[rfh]->metadata().has_value() || |
| + !services_[rfh]->actions().empty(); |
| +} |
| + |
| +void MediaSessionServiceRouter::UpdateRoutedService( |
| + MediaSessionServiceImpl* service) { |
| + if (service == routed_service_) |
| + return; |
| + |
| + routed_service_ = service; |
| + if (!routed_service_) { |
|
whywhat
2016/11/22 23:13:16
nit: s/!routed_service/routed_service
Zhiqiang Zhang (Slow)
2016/11/25 14:50:41
Done.
|
| + session_->NotifyMediaSessionMetadataChange(routed_service_->metadata()); |
| + session_->NotifyMediaSessionActionsChange(routed_service_->actions()); |
| + } else { |
| + session_->NotifyMediaSessionMetadataChange(base::nullopt); |
| + session_->NotifyMediaSessionActionsChange( |
| + std::set<blink::mojom::MediaSessionAction>()); |
| + } |
| +} |
| + |
| +} // namespace content |