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

Side by Side Diff: content/browser/media/session/media_session_service_router.cc

Issue 2526533002: Allow MediaSession in iframes to be routed (Closed)
Patch Set: 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/media/session/media_session_service_router.h"
6
7 #include "content/browser/media/session/media_session_controller.h"
8 #include "content/browser/media/session/media_session_impl.h"
9 #include "content/browser/media/session/media_session_service_impl.h"
10
11 namespace content {
12
13 MediaSessionServiceRouter::MediaSessionServiceRouter(MediaSessionImpl* session)
14 : routed_service_(nullptr), session_(session) {}
15
16 MediaSessionServiceRouter::~MediaSessionServiceRouter() {}
17
18 void MediaSessionServiceRouter::OnServiceCreated(
19 MediaSessionServiceImpl* service) {
20 services_[service->GetRenderFrameHost()] = service;
21 }
22
23 void MediaSessionServiceRouter::OnServiceDestroyed(
24 MediaSessionServiceImpl* service) {
25 services_.erase(service->GetRenderFrameHost());
26 }
27
28 void MediaSessionServiceRouter::OnMediaSessionMetadataChanged(
29 MediaSessionServiceImpl* service) {
30 if (service != routed_service_)
31 return;
32
33 session_->NotifyMediaSessionMetadataChange(routed_service_->metadata());
34 }
35
36 void MediaSessionServiceRouter::OnMediaSessionActionsChanged(
37 MediaSessionServiceImpl* service) {
38 if (service != routed_service_)
39 return;
40
41 session_->NotifyMediaSessionActionsChange(routed_service_->actions());
42 }
43
44 void MediaSessionServiceRouter::DidReceiveAction(
45 blink::mojom::MediaSessionAction action) {
46 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.
47 return;
48
49 routed_service_->GetClient()->DidReceiveAction(action);
50 }
51
52 void MediaSessionServiceRouter::MostMeaningfulPlayerObserverMayHaveChanged() {
53 RenderFrameHost* rfh = session_->web_contents()->GetMainFrame();
54 // Prefer top-level session.
55 if (IsServiceActiveForRenderFrameHost(rfh)) {
56 UpdateRoutedService(services_[rfh]);
57 return;
58 }
59
60 // If not, select the most meaningful audio-producing frame.
61 MediaSessionController* controller = static_cast<MediaSessionController*>(
62 session_->GetMostMeaningfulPlayerObserver());
63 if (!controller ||
64 !IsServiceActiveForRenderFrameHost(controller->id().first)) {
65 UpdateRoutedService(nullptr);
66 return;
67 }
68 UpdateRoutedService(services_[controller->id().first]);
69 }
70
71 bool MediaSessionServiceRouter::IsServiceActiveForRenderFrameHost(
72 RenderFrameHost* rfh) {
73 if (!services_.count(rfh))
74 return false;
75
76 return services_[rfh]->metadata().has_value() ||
77 !services_[rfh]->actions().empty();
78 }
79
80 void MediaSessionServiceRouter::UpdateRoutedService(
81 MediaSessionServiceImpl* service) {
82 if (service == routed_service_)
83 return;
84
85 routed_service_ = service;
86 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.
87 session_->NotifyMediaSessionMetadataChange(routed_service_->metadata());
88 session_->NotifyMediaSessionActionsChange(routed_service_->actions());
89 } else {
90 session_->NotifyMediaSessionMetadataChange(base::nullopt);
91 session_->NotifyMediaSessionActionsChange(
92 std::set<blink::mojom::MediaSessionAction>());
93 }
94 }
95
96 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698