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 |